Java网络编程之UDP网络通信

来源:互联网 发布:xp编程器 编辑:程序博客网 时间:2024/04/30 16:39

1      网络编程----UDPNo25

Scanner scanner =new Scanner(System.in);

                   try {

                            DatagramSockets = newDatagramSocket(8888);

                            String line =scanner.nextLine();

                            byte[] bytes =line.getBytes();//把用户输入的字符串拆成字节数组

                            // 把字节数组塞进包里,写上对方的地址和端口

                            try {

                                     DatagramPacketp = new DatagramPacket(bytes, bytes.length,

                                                        InetAddress.getByName("127.0.0.1"),9999);

                                     s.send(p);//发送包裹

                                     s.close();

                                     scanner.close();

DatagramSockets = new DatagramSocket(9999);

                            byte[] bytes = newbyte[1024];

                            DatagramPacket p =new DatagramPacket(bytes, bytes.length);//准备空包

                            s.receive(p);//接收,空包裹被填满

                            String str = newString(bytes,0,p.getLength()); //用字节数组的有效数据组装回字符串

                            System.out.println(str);

                            s.close();

2bytes

DatagramSocket s =new DatagramSocket(9999);

                            byte[] bytes = newbyte[128];//用于存放接收数据的数组

                            //用于存放接收数据的空数据报包,字节数组放置其中

                            DatagramPacket p =new DatagramPacket(bytes, bytes.length);

                            s.receive(p);//接收其他收发站发来的数据,阻塞方法,收到才返回

                            for(int i=0;i<p.getLength();i++){//遍历包中、数组中的有效数据,有效长度用getLength()获取

                                     System.out.println(bytes[i]);  //下标为0,1,2,3

                            }

                            s.close();//关闭收发站

DatagramSocket s =new DatagramSocket(8888);// 8888上建立收发站

                            byte[] bytes = { 1,2, 3 };//要发送的数据

                            // 建立一个包,把要发送的数据塞进去,写上对方的地址和端口9999

                            DatagramPacket p =new DatagramPacket(bytes, bytes.length,

                                               InetAddress.getByName("127.0.0.1"),9999);

                            s.send(p);

                            s.close();//关闭收发站

UDP UserDatagram Protocol用户数据报协议

也是传输层的一个协议,信息传输时不需要连接,不可靠,效率较高

 

 

1.1    Java进行UDP通信

Java进行UDP通信:

DatagramSocket 相当于一个收发站      (信息发送站)

构造方法:DatagramSocket(int port)在port端口上建立收发站

send(DatagramPacketp)发送数据报包

receive(DatagramPacketp) 接受数据报包,阻塞方法,一旦收到对象发过来的包,这个DatagramPacket中的存放数据的字节数组就会自动填充对方发过来的信息

 

 

DatagramPacket 数据报包,收发站要进行收发的包    (信息接收站)

构造方法:

一、发送的包:

DatagramPacket(byte[]bytes,int len,InetAddress addr,int port)第一个参数表示字节数组形式的发送数据,第二个参数是包的长度,一般是字节数组的长度,第三个参数是接收方的地址,第四个参数接收方的端口)

 

二、接收的包:

DatagramPacket(byte[]bytes,int len)

第一个参数是存放接收数据的数组,第二个是接收数据的长度

 

getLength()获取包的有效长度

InetAddress.getByName(Stringaddress)根据字符串生成一个地址对象

getAddress()获得一个InetAddress对象,表示发送方地址,再调用这个对象的getHostAddress()获取字符串形式的地址

int getPort()获取端口号

 

1.2    网络编程实战UDP

DatagramSocket类:《此类表示用来发送和接收数据报包的套接字;特点:既能发送又能接收》

DatagramPacket类:《此类表示数据报包。数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。》

使用步骤:【发送端:《1、创建套接字对象     2、封装数据报包

3、发送数据报包       4、释放资源》

【接收端:《1、创建套接字对象     2、创建数据报包,用于接收数据

1、 通过receive方法接收数据并保存到数据报包中  4、释放资源》

示例代码:

发送端《

publicclass SendDemo {

         public static void main(String[] args)throws Exception{

                   // UDP的发送端

                   System.out.println("UDP发送端开启.....");

                   // 创建Socket对象

                   DatagramSocket socket = newDatagramSocket();

                   // 创建数据报包

                   byte[] buf = "来自udp发送端的数据".getBytes();

                   DatagramPacket packet = newDatagramPacket(buf, 0, buf.length,

                                     InetAddress.getLocalHost(),6666);

                   //发送数据

                   socket.send(packet);

                   //释放资源

                   socket.close();

                   System.out.println("UDP发送端关闭.....");

         }

}

接收端《

publicclass ReceiveDemo {

 

         public static void main(String[] args)throws Exception {

                   // udp接收端

                   System.out.println("UDP接收端开启.....");

                   //创建Socket对象

                   DatagramSocket socket = newDatagramSocket(6666);

                  

                   //创建一个空的字节数组,是真正保存接收数据的容器

                   byte[] buf = newbyte[65536];//1024*64=65536

                   //创建一个空的数据报包,用于接收来自发送端的数据

                   DatagramPacket packet = newDatagramPacket(buf, buf.length);

                   //阻塞式方法,接收数据,将接收到的数据保存到指定的数据报包中

                   socket.receive(packet);

                   //从数据报包中获取数据

                   String ip =packet.getAddress().getHostAddress();

//               packet.getData()

                   //接收数据

                   String data = new String(buf,0, buf.length);

                   System.out.println("接收到来自"+ip+"的数据"+data);

                   System.out.println("UDP接收端关闭.....");

                   //释放资源

                   socket.close();

 

         }

}

 

1.3    简易聊天室

练习:使用UDP协议实现一个DOS版的简易聊天室

publicclass UdpExercise {

 

         public static void main(String[] args){

                   // TODO Auto-generated methodstub

                   //开启接收消息的线程

                   new Thread(newReceiveMsg()).start();

                   //开启一个发送消息的线程

                   new Thread(newSendMsg()).start();

         }

}

//UDP接收器

         class ReceiveMsg implements Runnable{

 

                   @Override

                   public void run() {

                            // TODOAuto-generated method stub

                            DatagramSocketsocket = null;

                            try {

                                     socket =new DatagramSocket(8888);

                                     for(;;){

                                               byte[]buf = new byte[1024];

                                               DatagramPacketpacket = new DatagramPacket(buf, buf.length);

                                               socket.receive(packet);

                                               Stringip = packet.getAddress().getHostAddress();

                                               Stringdata = new String(buf, 0, packet.getLength());

                                               System.out.println(ip+":"+data);

                                     }

                            } catch(SocketException e) {

                                     // TODOAuto-generated catch block

                                     e.printStackTrace();

                            } catch (IOExceptione) {

                                     // TODOAuto-generated catch block

                                     e.printStackTrace();

                            }finally{

                                     if(socket!=null){

                                               socket.close();

                                               socket=null;

                                     }

                            }

                   }

                  

         }

         //udp发送器

         class SendMsg implements Runnable {

                   DatagramSocket socket = null;

 

                   @Override

                   public void run() {

                            // TODOAuto-generated method stub

                            try {

                                     socket =new DatagramSocket();

                                     BufferedReaderbr = new BufferedReader(new InputStreamReader(

                                                        System.in));

                                     String line= null;

                                     while((line = br.readLine()) != null) {

                                               byte[]buf = line.getBytes();

                                               DatagramPacketpacket = new DatagramPacket(buf, 0,

                                                                 buf.length,InetAddress.getByName("192.168.95.255"),

                                                                 8888);

                                               socket.send(packet);

                                     }

                            } catch (Exceptione) {

                                     // TODOAuto-generated catch block

                                     e.printStackTrace();

                            }finally{

                                     if(socket!= null){

                                               socket.close();

                                               socket= null;

                                     }

                            }

                   }

         }

4 0
原创粉丝点击