黑马程序员技术交流社区

标题: UDP简单聊天系统为什么要要要定义两个run方法 而且这两个... [打印本页]

作者: 靓仔    时间: 2013-12-25 20:59
标题: UDP简单聊天系统为什么要要要定义两个run方法 而且这两个...
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();
               
        }
}



作者: 松毛    时间: 2013-12-25 22:45
这个两个run方法一个是用来发送的,一个是用来接收的。由于发送和接收都互不影响,所以要定义在连个不同的线程中。就像你在聊天的时候,在发送数据的时候同时也可以接收到数据。
作者: 75100313    时间: 2013-12-26 15:24
本帖最后由 75100313 于 2013-12-26 15:25 编辑

线程没学? 要想用线程 必须覆盖run()方法 !   两个线程  Send 和 Rece 都实现了 runnable
当然是需要覆盖2次了
作者: 程玉习    时间: 2013-12-26 16:04
ds.receive(dp);是一个阻塞式方法,当它接收不到信息后会导致程序处于等待状态,所以要使用多线程,而多线程的实现是必须覆盖run()方法,接收和发送相当于两个应用程序,所以要分别定义在各自的类中。两个程序分开写比较合理,这样写是为了代码集中,利于讲解。
作者: 汪洋大海    时间: 2013-12-26 16:05
用executor来创建线程也行。
作者: 靓仔    时间: 2014-2-18 08:50
这种问题你需要理解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方法
而且这两个方法要封装到不同的类中。这就容易理解了吧!

打字不容易希望能帮助你,自己也能复习一下!





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2