欢迎光临散文网 会员登陆 & 注册

使用UDP实现双向交流的代码

2020-04-19 10:50 作者:小垃圾kiki  | 我要投稿
package cn.jd.udp;

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

/*
 * 发送端
 */
public class TalkSend  implements Runnable {
    private DatagramSocket client;
    private BufferedReader reader;
    private String toIP;
    private int toPort;
    public TalkSend(int port,String toIP,int toPort) {
        this.toIP=toIP;
        this.toPort=toPort;
        try {
            client=new DatagramSocket(port);
            reader=new BufferedReader(new InputStreamReader(System.in));
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    @Override
    public void run() {
        while(true) {
            String data;
            try {
                data = reader.readLine();
                byte[] datas=data.getBytes();//字符串转成字节数组
                //3.封装成DatagramPacket包裹,需要指定目的地
                DatagramPacket packet
                                =new DatagramPacket(datas,0,datas.length,new InetSocketAddress(this.toIP,this.toPort));
                //4.发送包裹send(DatagramPacket p)
                client.send(packet);
                if(data.equals("bye")) {
                    break;
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
        //5.释放资源
        client.close();
        
    }

}

package cn.jd.udp;

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

/*
 * 接收端:使用面向对象封装(也就是加入属性加入方法加入构造器)
 */
public class TalkReceive implements Runnable {
    private DatagramSocket server;
    private String form;
    public TalkReceive(int port,String from) {
        this.form=from;
        try {
            server=new DatagramSocket(port);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }
    
    @Override
    public void run() {
        while(true) {
            //2.准备容器 封装成DatagramPacket包裹
            byte[]  container=new byte[1024*60];//最多接收60K
            DatagramPacket packet=new DatagramPacket(container, 0,container.length);
            //3.阻塞式接收包裹receive(DatagramPacket p)
            try {
                server.receive(packet);//阻塞式
                byte[] datas=packet.getData();//4.分析数据
                int len=packet.getLength();
                String data=new String(datas,0,len);
                System.out.println(this.form+"说:"+data);
                if(data.equals("bye")) {
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            
        }
        //5.释放资源
        server.close();
        
    }

}

package cn.jd.udp;
/*
 * 加入多线程实现双向交流,模拟在线咨询
 */
public class TalkStudent {
    public static void main(String[] args) {
        new Thread(new TalkSend(7777,"localhost",9999)).start();//发送
        new Thread(new TalkReceive(8888,"老师")).start();//接收的端口是8888
    }
}

package cn.jd.udp;

public class TalkTeacher {
        public static void main(String[] args) {
            new Thread(new TalkReceive(9999,"学生")).start();//接收的端口是9999
            new Thread(new TalkSend(5555,"localhost",8888)).start();//发送
        }
}

使用UDP实现双向交流的代码的评论 (共 条)

分享到微博请遵守国家法律