UDP多线程聊天如何实现

 我来答
新疆新华电脑
2018-06-06 · TA获得超过118个赞
知道小有建树答主
回答量:75
采纳率:46%
帮助的人:10.2万
展开全部
  • 如果对楼主有帮助,给个采纳好不,谢谢啦

  • UDP-聊天-多线程实现

  • /*UDP-聊天-多线程实现
    编写一个聊天程序。
    有收数据的部分,和发数据的部分。
    这两部分需要同时执行。
    那就需要用到多线程技术。
    一个线程控制收,一个线程控制发.

    因为收和发动作是不一致的,所以要定义两个run方法
    而且这两个方法要封装到不同的类中。
    */import java.io.*;
    import java.net.*;class Send implements Runnable//实现Runnable接口,可以多线,发送
    {
    private DatagramSocket ds;//定义Socket为成员
    public Send (DatagramSocket ds)//发送的构造方法,以指定的DatagramSocket服务作为参数
    {        this.ds = ds;
    }    public void run()
    {        try
    {
    BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));//读取键盘
    String line = null;            while ((line = bufr.readLine())!=null)
    {                if ("886".equals(line))//设定输入886为退出
    break;                byte[] buf = line.getBytes();//得到数组
    DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.255"),10002);                //DatagramPacket的 实例化new参数(byte[],length)
    //DatagramPacket的 实例化new参数(byte[],length,address,port)
    //192.168.1.255 末尾255是广播,0是网段
    ds.send(dp);
    }
    }        catch (Exception e)
    {            throw new RuntimeException("发送端失败");
    }
    }
    }class Rece implements Runnable//实现Runnable接口,可以多线程,接收
    {
    private DatagramSocket ds;//定义Socket为成员
    public Rece(DatagramSocket ds)//构造方法,以指定的DatagramSocket服务作为参数
    {        this.ds = ds;
    }    public void run()
    {        try
    {            while (true)
    {                byte[] buf = new byte[1024];//数组作为缓冲区
    DatagramPacket dp = new DatagramPacket(buf,buf.length);                //DatagramPacket的 实例化new参数(byte[],length)
    //DatagramPacket的 实例化new参数(byte[],length,address,port)

    ds.receive(dp);//将接收到的数据存储到定义好的数据包中。调用DatagramSocket的方法receive()

    String ip = dp.getAddress().getHostAddress();//ip地址从DatagramPacket数据包中分离出来
    String data = new String(dp.getData(),0,dp.getLength());//getData()变数组,参数(byte[],offset,length)

    System.out.println(ip+":"+data);
    }
    }        catch (Exception e)
    {            throw new RuntimeException("接收端失败");
    }
    }
    }class  ChatDemo{
    public static void main(String[] args) throws Exception
    {
    DatagramSocket sendSocket = new DatagramSocket();//无参数,随机分配端口 发送端的UDP服务
    DatagramSocket receSocket = new DatagramSocket(10002);//参数,port指定端口 接收端的UDP服务

    //建立多线程对象,要把实现Runnable接口的子类作为参数,传给Thread的构造函数
    new Thread(new Send(sendSocket)).start();        new Thread(new Rece(receSocket)).start();
    //这里new了Thread()的目的就是为了调用start()方法来启动线程
    //启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。
    //<!-- 为了启动MyThread,需要首先实例化一个Thread,并传入自己的MyThread实例: -->
    //事实上,当传入一个Runnable target参数给Thread后,Thread的run()方法就会调用target.run()
    }
    }

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式