UDP

1.7 UDP

发短信:不用连接,需要知道对方的地址

发送消息

发送端

package com.zheng.UDP;


import java.io.IOException;
import java.net.*;

public class UDPClientDemo01 {
   public static void main(String[] args) throws IOException {
       //1.建立一个socket
       DatagramSocket socket = new DatagramSocket();

       //2,。建立一个包
       String msg="你好,服务器";
       InetAddress localhost=InetAddress.getByName("localhost");
       int port=9000;
       //数据,数据的长度启始,要发送给谁
       DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port);
       //3.发送包
       socket.send(packet);

       //4.关闭流
       socket.close();



  }
}

接收端

package com.zheng.UDP;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;


public class UDPServerDemo01 {
   public static void main(String[] args) throws IOException {
       //开启端口
       DatagramSocket socket = new DatagramSocket(9000);
       //接收数据包
       byte[] buffer=new byte[1024];
       DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
       socket.receive(packet);

       System.out.println(new String(packet.getData(),0,packet.getLength()));

       //关闭连接
       socket.close();


  }
}

聊天实现

package com.zheng.chat;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class UdpSenderDemo01 {
   public static void main(String[] args) throws IOException {
       DatagramSocket socket = new DatagramSocket(8888);

       //准备数据:控制台读取数据 System.in
       BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

       while (true){
           String data = reader.readLine();
           byte[] bytes = data.getBytes();
           DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length,new InetSocketAddress("localhost",6666));

           socket.send(packet);
           if (data.equals("bye")){
               break;
          }
      }
       socket.close();

  }

}

 

package com.zheng.chat;



import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;


public class UdpReceiveDemo01 {
   public static void main(String[] args) throws IOException {

       DatagramSocket socket = new DatagramSocket(6666);


       //准备接收包裹

       while (true){

           byte[] container = new byte[1024];
           DatagramPacket packet = new DatagramPacket(container,0,container.length);
           socket.receive(packet);//阻塞式接收包裹
           //断开连接 bye
           byte[] data = packet.getData();
           String receiveData= new String(data,0,packet.getLength());

           System.out.println(receiveData);

           if (receiveData.equals("bye")){
               break;
          }

      }

       socket.close();

  }
}

 

在线咨询:两个人都可以是发送方,也都可以是接收方

 

package com.zheng.chat;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class TestSend implements Runnable{

   DatagramSocket socket=null;
   BufferedReader reader=null;

   private int fromPort;
   private String toIp;
   private int toPort;

   public TestSend(int fromPort, String toIp, int toPort) {
       this.fromPort = fromPort;
       this.toIp = toIp;
       this.toPort = toPort;

       try{
           socket =new DatagramSocket(fromPort);
           reader = new BufferedReader(new InputStreamReader(System.in));
      }catch (Exception e){
           e.printStackTrace();
      }

  }

   @Override
   public void run() {
       while (true){
           try{
               String data = reader.readLine();
               byte[] bytes = data.getBytes();
               DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length,new InetSocketAddress(this.toIp,this.toPort));

               socket.send(packet);
               if (data.equals("bye")){
                   break;
              }
          }catch (Exception e){
               e.printStackTrace();
          }

      }
       socket.close();

  }


}


package com.zheng.chat;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class TalkReceive implements Runnable{
   DatagramSocket socket=null;

   private int port;
   private String msgFrom;

   public TalkReceive(int port,String msgFrom) {
       this.port = port;
       this.msgFrom=msgFrom;

       try {
           socket = new DatagramSocket(port);
      } catch (SocketException e) {
           e.printStackTrace();
      }
  }

   @Override
   public void run() {

       //准备接收包裹
       while (true){
           try {
               //准备接收包裹
               byte[] container = new byte[1024];
               DatagramPacket packet = new DatagramPacket(container,0,container.length);
               socket.receive(packet);//阻塞式接收包裹
               //断开连接 bye
               byte[] data = packet.getData();
               String receiveData= new String(data,0,packet.getLength());

               System.out.println(msgFrom + ":"+receiveData);

               if (receiveData.equals("bye")){
                   break;
              }
          } catch (IOException e) {
               e.printStackTrace();
          }

      }

       socket.close();
  }
}



package com.zheng.chat;

public class TalkStudent {
   public static void main(String[] args) {
       //开启两个线程

       new Thread(new TestSend(7777,"localhost",9999)).start();
       new Thread(new TalkReceive(8888,"老师")).start();

  }
}



package com.zheng.chat;

public class TalkTeacher {

   public static void main(String[] args) {
       new Thread(new TestSend(5555,"localhost",8888)).start();
       new Thread(new TalkReceive(9999,"学生")).start();
  }
}


## 1.7 UDP
 发短信:不用连接,需要知道对方的地址
**发送消息**
发送端
```javapackage com.zheng.UDP;

import java.io.IOException;import java.net.*;
public class UDPClientDemo01 {    public static void main(String[] args) throws IOException {        //1.建立一个socket        DatagramSocket socket = new DatagramSocket();
        //2,。建立一个包        String msg="你好,服务器";        InetAddress localhost=InetAddress.getByName("localhost");        int port=9000;        //数据,数据的长度启始,要发送给谁        DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port);        //3.发送包        socket.send(packet);
        //4.关闭流        socket.close();


    }}
```
接收端
```javapackage com.zheng.UDP;
import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;

public class UDPServerDemo01 {    public static void main(String[] args) throws IOException {        //开启端口        DatagramSocket socket = new DatagramSocket(9000);        //接收数据包        byte[] buffer=new byte[1024];        DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);        socket.receive(packet);
        System.out.println(new String(packet.getData(),0,packet.getLength()));
        //关闭连接        socket.close();

    }}
```
### 聊天实现
```javapackage com.zheng.chat;
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetSocketAddress;
public class UdpSenderDemo01 {    public static void main(String[] args) throws IOException {        DatagramSocket socket = new DatagramSocket(8888);
        //准备数据:控制台读取数据  System.in        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        while (true){            String data = reader.readLine();            byte[] bytes = data.getBytes();            DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length,new InetSocketAddress("localhost",6666));
            socket.send(packet);            if (data.equals("bye")){                break;            }        }        socket.close();
    }
}
```


```javapackage com.zheng.chat;


import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;

public class UdpReceiveDemo01 {    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket(6666);

        //准备接收包裹
        while (true){
            byte[] container = new byte[1024];            DatagramPacket packet = new DatagramPacket(container,0,container.length);            socket.receive(packet);//阻塞式接收包裹            //断开连接  bye            byte[] data = packet.getData();            String receiveData= new String(data,0,packet.getLength());
            System.out.println(receiveData);
            if (receiveData.equals("bye")){                break;            }
        }
        socket.close();
    }}
```


### **在线咨询:两个人都可以是发送方,也都可以是接收方**
```javapackage com.zheng.chat;
import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetSocketAddress;
public class TestSend implements Runnable{
    DatagramSocket socket=null;    BufferedReader reader=null;
    private int fromPort;    private String toIp;    private int toPort;
    public TestSend(int fromPort, String toIp, int toPort) {        this.fromPort = fromPort;        this.toIp = toIp;        this.toPort = toPort;
        try{            socket =new DatagramSocket(fromPort);            reader = new BufferedReader(new InputStreamReader(System.in));        }catch (Exception e){            e.printStackTrace();        }
    }
    @Override    public void run() {        while (true){            try{                String data = reader.readLine();                byte[] bytes = data.getBytes();                DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length,new InetSocketAddress(this.toIp,this.toPort));
                socket.send(packet);                if (data.equals("bye")){                    break;                }            }catch (Exception e){                e.printStackTrace();            }
        }        socket.close();
    }

}

package com.zheng.chat;
import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.SocketException;
public class TalkReceive implements Runnable{    DatagramSocket socket=null;
    private int port;    private String msgFrom;
    public TalkReceive(int port,String msgFrom) {        this.port = port;        this.msgFrom=msgFrom;
        try {            socket = new DatagramSocket(port);        } catch (SocketException e) {            e.printStackTrace();        }    }
    @Override    public void run() {
        //准备接收包裹        while (true){            try {                //准备接收包裹                byte[] container = new byte[1024];                DatagramPacket packet = new DatagramPacket(container,0,container.length);                socket.receive(packet);//阻塞式接收包裹                //断开连接  bye                byte[] data = packet.getData();                String receiveData= new String(data,0,packet.getLength());
                System.out.println(msgFrom + ":"+receiveData);
                if (receiveData.equals("bye")){                    break;                }            } catch (IOException e) {                e.printStackTrace();            }
        }
        socket.close();    }}


package com.zheng.chat;
public class TalkStudent {    public static void main(String[] args) {        //开启两个线程
        new Thread(new TestSend(7777,"localhost",9999)).start();        new Thread(new TalkReceive(8888,"老师")).start();
    }}


package com.zheng.chat;
public class TalkTeacher {
    public static void main(String[] args) {        new Thread(new TestSend(5555,"localhost",8888)).start();        new Thread(new TalkReceive(9999,"学生")).start();    }}


```


posted @ 2021-08-17 14:00  清钦  阅读(42)  评论(0)    收藏  举报