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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 聂斌 中级黑马   /  2013-3-10 13:00  /  1401 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 聂斌 于 2013-3-10 13:02 编辑

从发送端键盘录入一次数据,那么接收端就打印一次,,就是我说一句他就接收一句

//发送端
public class UdpSend2 {

        public static void main(String[] args) throws UnknownHostException, IOException {
                // TODO Auto-generated method stub
                //发送端可以不指定端口,,因为系统会随机分配一个
                DatagramSocket ds = new DatagramSocket();
                //键盘录入数据
                BufferedReader bufr =
                        new BufferedReader(new InputStreamReader(System.in));

                String line = null;
                //读一句就发送一句
                while((line=bufr.readLine())!=null)
                {
                        //键盘录入停止条件
                        if("886".equals(line))
                                break;

                        byte[] buf = line.getBytes();
                        //把读取到的数据封装成数据包,InetAddress.getByName("192.168.1.101")获取对方主机对象,就是指定数据要发到哪个主机上
                        DatagramPacket dp =
                                new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.101"),10001);

                        ds.send(dp);
                }
                //循环结束后就代表不发数据了
                ds.close();
        }


//接收端
public class UdpRece2 {

        public static void main(String[] args) throws IOException {

//这里要指定端口,不然收不到数据
                DatagramSocket ds = new DatagramSocket(10001);
                //循环接收数据,
                while(true)
                {
                        //装数据之前得有缓冲区,,如果1024不够装的话就定义64k(64*1024),,对方发来的数据包不会超过64k
                        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);
                        //如果你这里判断对方发个886字符串过来你就关了,当对方发个886过来时你就关闭了
                        
                        //那么另一个人发数据过来的话我之前都关闭了别人就进不来了那么我就接收不到另一个人的数据了,
                        //所以这里不需要关闭..这个接收端想要接收到数据的话他就得一直开着,
                      //                ds.close();
                }


代码运行结果:

先运行接收端UdpRece2,再运行UdpSend2 发送端,,,2个都在等待,UdpRece2是等待对方发送数据过来,因为receive(dp)是阻塞式方法,UdpSend2是在等待你键盘录入数据,read方法也是阻塞式方法,,readLine()用的就是read()方法,,,,,read方法就是阻塞式方法,,,,,此时发送端输入一行数据后,接收端就打印了一行数据,你发送端输入一句我接收端马上就打印一句,,之后发送端输入886,那么发送端应用程序就结束了,,但是接收端没有结束,,他一直开着等着接收数据,,,


问题:
发现接收端UdpRece2 也能输入数据了,,当你在接收端UdpRece2 输入数据后,发送端UdpSend2 也能显示,这样就实现了2个人互相聊天,,,,这是为什么呢,,,接收端不是只能接收数据吗为什么还能输入数据,

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

2 个回复

倒序浏览
我只是有点不太明白,,接收端也能输入数据,,,是不是他们建立了通道后就能实现数据的传输了呵呵
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马