欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

黑马程序员----java基础--网络编程(1)(2)

来源: javaer 分享于  点击 25559 次 点评:277

二、UDP协议-发送端和接收端

Socket:套接字,通信的端点。就是为网络服务提供的一种机制,通信的两端都有Socket,网络通信其实就是Socket间的通信,数据在两个Socket间通过IO传输。

1、DatagramSocket和DatagramPacket对象

(1)、DatagramSocket类常用方法

此类表示用来发送和接收数据报包的套接字。

1、构造方法

1 new DatagramSocket();//构造数据报套接字并绑定到本地主机任何端口上,发送端
2 new DatagramSocket(int port);//创建数据报套接字并绑定到本地主机上的指定端口,接收端

2、一般方法

1 void connect(InetAddress address,int port);//将套接字连接到此套接字的远程地址上
2 void send(DatagramPacket p);//从此套接字发送数据包
3 void receive(DatagramPacket p);//从此套接字接收数据包
4 InetAddress getInetAddress();//返回此套接字连接的地址
5 int getPort();//返回此套接字的端口

(2)、DatagramPacket类常用方法

此类表示数据报包

1、构造方法

1 new DatagramPacket(byte[] buf,int length,InetAddress address,int port);//构造数据报包,用来将长度为length的包发送到指定主机上的指定端口号
2 newDatatgramPacket(byte[] buf,int length);//构造 DatagramPacket,用来接收长度为 length 的数据包

2、一般方法

1 InetAddress getAddress();//获取某台主机的ip地址
2 byte[] getData();//获取数据缓冲区的内容
3 int getLength();//获取将要发送或者接收到的数据的长度
4 int getPort();//获取某台主机的端口号

2、UDP传输发送和获取数据的步骤

UDP发送端步骤:

1)、建立UDPSocket服务

2)、提供数据,并将数据封装到数据包中

3)、通过Socket服务的send方法,将数据包发送出去

4)、关闭资源

UDP接收端步骤:

1)、定义UDPSocket服务。通常会监听一个端口号。其实就是给这个接收网络应用程序定义数字标识,方便于明确哪些数据过来哪个应该程序可以处理

2)、定义一个数据包。因为要存储接收到的字节数据。因为数据包对象中有更多功能可以提取字节数据中的不同数据信息

3)、通过Sockt服务的receive方法将接收到的数据存入已经定义好的数据包中

4)、通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上

5)、关闭资源

需求:聊天程序双窗口模式)代码演示:

  1. import java.io.*; 
  2. import java.net.*; 
  3. class UDPSend  
  4.     public static void main(String[] args)  
  5.     { 
  6.         DatagramSocket ds=null;         
  7.         BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 
  8.         try         
  9.         { 
  10.             //1,创建udp服务。通过DatagramSocket对象。 
  11.             ds=new DatagramSocket(); 
  12.             String line=null
  13.             while ((line=br.readLine())!=null
  14.             { 
  15.                 byte[] buf=line.getBytes(); 
  16.                 //2,确定数据,并封装成数据包。DatagramPacket(byte[] buf,int length, InetAddress address, int port)  
  17.                 DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.104"),55128); 
  18.                 //3,通过socket服务,将已有的数据包发送出去。通过send方法 。 
  19.                 ds.send(dp); 
  20.                 if("over".equals(line)) 
  21.                     break
  22.             } 
  23.              
  24.         } 
  25.         catch (Exception e) 
  26.         { 
  27.             System.out.println(e); 
  28.         } 
  29.         finally 
  30.         { 
  31.             if(ds!=null
  32.                 try 
  33.                 { 
  34.                     //4,关闭资源。 
  35.                     ds.close(); 
  36.                 } 
  37.                 catch (Exception e) 
  38.                 { 
  39.                     System.out.println("发送端关闭失败"); 
  40.                 } 
  41.         } 
  42.     } 
  43. class UDPReceive 
  44.     public static void main(String[] args){ 
  45.         DatagramSocket ds=null
  46.         DatagramPacket dp=null
  47.         try
  48.             //1,创建udp socket,建立端点。 
  49.             ds=new DatagramSocket(55128);         
  50.             while (true
  51.             {    //2,定义数据包。用于存储数据。             
  52.                 byte[] buf=new byte[1024]; 
  53.                 dp=new DatagramPacket(buf,buf.length); 
  54.                 //3,通过服务的receive方法将收到数据存入数据包中。 
  55.                 ds.receive(dp);//阻塞式方法。 
  56.                 //4,通过数据包的方法获取其中的数据。 
  57.                 String ip=dp.getAddress().getHostAddress(); 
  58.                 String data=new String(dp.getData(),0,dp.getLength()); 
  59.                 System.out.println(ip+"......"+data); 
  60.                 if(data.equals("over")) 
  61.                     break
  62.             } 
  63.              
  64.         } 
  65.         catch (Exception e) 
  66.         { 
  67.             System.out.println(e); 
  68.         } 
  69.         finally 
  70.         { 
  71.             if(ds!=null
  72.                 try 
  73.                 { 
  74.                     //5,关闭资源 
  75.                     ds.close(); 
  76.                 } 
  77.                 catch (Exception e) 
  78.                 { 
  79.                     System.out.println("接收端关闭失败"); 
  80.                 } 
  81.         } 
  82.     } 

需求:聊天程序单窗口模式-群聊)代码演示:

收数据的部分,和发数据的这两部分需要同时执行。那就需要用到多线程技术。一个线程控制收,一个线程控制发。因为收和发动作是不一致的,所以要定义两个run方法。而且这两个方法要封装到不同的类中。

  1. import java.io.*; 
  2. import java.net.*; 
  3. class UDPSend implements Runnable 
  4.     private DatagramSocket ds; 
  5.     UDPSend(DatagramSocket ds){ 
  6.         this.ds=ds; 
  7.     } 
  8.     public void run(){ 
  9.         try 
  10.         { 
  11.             //读取键盘录入 
  12.             BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 
  13.             String line=null
  14.             while ((line=br.readLine())!=null
  15.             { 
  16.                 byte[] buf=line.getBytes(); 
  17.                 //定义数据包,用来存放数据 
  18.                 DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.104"),5556); 
  19.                 //通过send方法把数据发送给接收端 
  20.                 ds.send(dp); 
  21.                 if("over".equals(line)) 
  22.                     break
  23.             } 
  24.             ds.close(); 
  25.         } 
  26.         catch (Exception e) 
  27.         { 
  28.             System.out.println("发送失败"); 
  29.         } 
  30.     } 
  31. class UDPReceive implements Runnable 
  32.     private DatagramSocket ds; 
  33.     UDPReceive(DatagramSocket ds){ 
  34.         this.ds=ds; 
  35.     } 
  36.     public void run(){//复写run方法 
  37.         try 
  38.         { 
  39.             while (true
  40.             { 
  41.                 byte[] buf=new byte[1024]; 
  42.                 //定义数据包用来接收发送端发过来的数据信息 
  43.                 DatagramPacket dp=new DatagramPacket(buf,buf.length); 
  44.                 //接收数据 
  45.                 ds.receive(dp); 
  46.                 //对接收过来的数据进行ip地址等信息的解析 
  47.                 String ip=dp.getAddress().getHostAddress(); 
  48.                 String data=new String(dp.getData(),0,dp.getLength()); 
  49.                 System.out.println(ip+"......."+data); 
  50.                 if("over".equals(data)) 
  51.                     break
  52.             } 
  53.             ds.close();             
  54.         } 
  55.         catch (Exception e) 
  56.         { 
  57.             System.out.println("接收端接受失败"); 
  58.         } 
  59.     } 
  60. class ChatRoom 
  61.     public static void main(String[] args)throws Exception{ 
  62.         //定义两个DatagramSocket服务 
  63.         DatagramSocket send=new DatagramSocket(); 
  64.         DatagramSocket receive=new DatagramSocket(5556); 
  65.         //开启两个线程 
  66.         new Thread(new UDPSend(send)).start(); 
  67.         new Thread(new UDPReceive(receive)).start(); 
  68.     } 




相关栏目:

用户点评