UDP协议聊天实现Dome

UDP

1、使用UDP协议聊天实现_DOME
发起端
package com.wuzhy.UDP;

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

public class UDP_Soket_A {
    public static void main(String[] args) throws Exception {
        //Java使用DatagramSocket代表UDP协议的Socket,建立连接
        DatagramSocket socket=new DatagramSocket(6666);
        //可以在控制台中一直发送消息,但如果发送了goodbye就结束
        while (true){
            InetAddress inet=InetAddress.getByName("localhost");
            //获取控制台输入的流,缓冲区读取内容
            BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
            //每次都读一行
            String str=reader.readLine();
            //转换成字节数组
            byte [] bytes=str.getBytes();
            //发送包,包含了(要发送的内容,内容从下标0开始,到下标最大长度,ip地址,端口号)
            DatagramPacket packet=new DatagramPacket(bytes,0,bytes.length,inet,9100);
            //send(),以该DatagramSocket对象向外发送数据报
            socket.send(packet);
            if (packet.getData().equals("goodbye")){
                break;
            }
        }

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

接收端
package com.wuzhy.UDP;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDP_Soket_B {
    public static void main(String[] args) throws Exception {
        //建立连接地址
        DatagramSocket socket=new DatagramSocket(9100);
        while (true){
            //建立接收包
            byte [] bytes=new byte[1024];
            DatagramPacket packet=new DatagramPacket(bytes,0,bytes.length);
            //receive(),从该DatagramSocket中接收数据报
            socket.receive(packet);
            /**
             * 注意下:
             * DatagramPacket.getData()获取的数据的长度不是自己发送的数据长度
             * DatagramPacket.getLength()获取的数据的长度才是自己发送的数据长度
             */
            //
            byte [] data=packet.getData();//getData()获取数据
            String str=new String(data,0,packet.getLength());
            System.out.println(str);
            if (str.equals("goodbye")){
                break;
            }
        }
        //关闭连接
        socket.close();


    }
}

以上demo是完成一个发起和接收端的实现,下面运用UDP协议,模拟一个在线咨询的demo

2、UDP+多线程,实现在线咨询Demo
1、创建发送类
package com.wuzhy.UDP;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.*;

public class TalkSend implements Runnable{
    DatagramSocket socket=null;
    BufferedReader reader=null;
    private int formPost;  //来源端口
    private String toIP;   //要发送的IP
    private int toPort;    //要发送的端口

    //有参构造器中赋值socket、reader
    public TalkSend(int formPost,String toIP,int toPort)  {
         this.formPost=formPost;
         this.toIP=toIP;
         this.toPort=toPort;

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

    @Override
    public void run() {
        //循环进行发送消息,直到发送goodbye结束
        while (true){
            InetAddress inet= null;
            try {
                String str=reader.readLine();
                byte [] bytes=str.getBytes();
                DatagramPacket packet=new DatagramPacket(bytes,0,bytes.length,InetAddress.getByName(toIP),toPort);
                //send(),以该DatagramSocket对象向外发送数据报
                socket.send(packet);
                if (packet.getData().equals("goodbye")){
                    break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
        socket.close();
    }
}

2、创建接收类
package com.wuzhy.UDP;

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 post;       //接收的端口号
    private String msgFrom; //发送人名称
    public TalkReceive(int post,String msgFrom) {
        this.post=post;
        this.msgFrom=msgFrom;
        try {
            socket=new DatagramSocket(post);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        //循环接收消息,直到接收到goodbye结束
        while (true){
            try {
                //建立接收包
                byte [] bytes=new byte[1024];
                DatagramPacket packet=new DatagramPacket(bytes,0,bytes.length);
                //receive(),从该DatagramSocket中接收数据报
                socket.receive(packet);
                byte [] data=packet.getData();
                String str=new String(data,0,packet.getLength());
                System.out.println(msgFrom+":"+str);
                if (str.equals("goodbye")){
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
        socket.close();
    }
}

3、创建Student类,和Teacher类,使用多线程同时启动发送和接收类,模拟在线咨询

两人都可以是发送放,也都可以是接收方

package com.wuzhy.UDP;

public class TalkTeacher {
    public static void main(String[] args) {
        //注意:发送类TalkSend的toPort要与接收类TalkReceive的post对应
        new Thread(new TalkSend(9966,"localhost",9900)).start();
        new Thread(new TalkReceive(8800,"学生")).start();

    }
}

package com.wuzhy.UDP;

public class TalkStudent {
    public static void main(String[] args) {
        //注意:发送类TalkSend的toPort要与接收类TalkReceive的post对应
        new Thread(new TalkSend(8700,"localhost",8800)).start();
        new Thread(new TalkReceive(9900,"学生")).start();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值