A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

UDP简单聊天系统为什么要要要定义两个run方法 而且这两个为什么要封装到不同的类中?
import java.net.*;
import java.io.*;
class Send implements Runnable
{
        private DatagramSocket ds;
        public Send(DatagramSocket ds)
        {
                this.ds = ds;
        }
        public void run()
        {
                try
                {
                        BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));

                        String line = null;

                        while((line = bufr.readLine())!=null)
                        {
                                byte[] buf=line.getBytes();

                                DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.100"),10002);

                                ds.send(dp);
                        }
                }
                catch (Exception e)
                {
                        throw new RuntimeException("发送信息异常");
                }
               
        }
}
class Rece implements Runnable
{
        private DatagramSocket ds;

        public Rece(DatagramSocket ds)
        {
                this.ds = ds;
        }
        public void run()
        {
                try
                {
                        while(true)
                        {
                                byte[] buf = new byte[1024];

                                DatagramPacket dp = new DatagramPacket(buf,buf.length);
                               
                                ds.receive(dp);

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

                                String data = new String(dp.getData(),0,dp.getLength());

                                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();

                DatagramSocket receSocket = new DatagramSocket(10002);

                new Thread(new Send(sendSocket)).start();

                new Thread(new Rece(receSocket)).start();
               
        }
}


评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

5 个回复

倒序浏览
这个两个run方法一个是用来发送的,一个是用来接收的。由于发送和接收都互不影响,所以要定义在连个不同的线程中。就像你在聊天的时候,在发送数据的时候同时也可以接收到数据。
回复 使用道具 举报
本帖最后由 75100313 于 2013-12-26 15:25 编辑

线程没学? 要想用线程 必须覆盖run()方法 !   两个线程  Send 和 Rece 都实现了 runnable
当然是需要覆盖2次了
回复 使用道具 举报
ds.receive(dp);是一个阻塞式方法,当它接收不到信息后会导致程序处于等待状态,所以要使用多线程,而多线程的实现是必须覆盖run()方法,接收和发送相当于两个应用程序,所以要分别定义在各自的类中。两个程序分开写比较合理,这样写是为了代码集中,利于讲解。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
用executor来创建线程也行。
回复 使用道具 举报
这种问题你需要理解UDP和TCP的原理顺便帮助你复习前边所学的知识:    UDP:将数据及源和目的封装成数据包,不需要建立连接
每个数据包的大小限制在64k以内
因无连接,是不可靠的协议
不需要建立连接,速度快
   TCp:建立连接,形成传输数据的通道
在连接中进行大数据量传输
通过三次握手完成连接,是可靠的协议
必须建立连接,效率会稍低
Socket:Socked就是为网络服务提供的一种机制
通信的的两端都有Socket
网络通信其实就是Socket间的通信
数据在两个Socket间通过IO传输

    一个聊天系统需要发送数据和需要接受数据这还需要了解UDP发送端的思路
UDP发送端:
1:建立udpSocket服务
2:提供数据,并将数据封装到数据包中
3:通过socket服务发送功能,将数据发出去
4:关闭资源
UDP接收端病处理数据:
1:定义udpsocket服务,通常会监听一个端口,其实就是给这个接收网络应用程序定义数字标识
        方便与明确哪些数据过来该应用可以处理,
2:定义一个数据包,因为要存储接收到的字节数据,数据包对象中有更多功能可以提取字节数据中
存储已定义好的数据包中
3:通过socket服务的receive方法将收到的数据存入已定义好的数据包中
4:通过数据包对象特有功能,将这些不同数据取出,打印在控制台上
5:关闭资源

一个聊天程序
有接收数据的部分,和发数据的部分
这两部分需要同时执行
那就需要用到多线程技术
一个线程控制接收,另一线程控制发送

因为接收和发送动作不一致,所以要定义两个run方法
而且这两个方法要封装到不同的类中。这就容易理解了吧!

打字不容易希望能帮助你,自己也能复习一下!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马