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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wuhyoung 中级黑马   /  2014-5-21 21:06  /  1307 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我在编写socket聊天软件中遇到了一些问题,我写的代码如下:
public class KeyboardInputDemo {

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

                BufferedReader bufr = new BufferedReader(new InputStreamReader(
                                System.in));

                String line = null;
                line = bufr.readLine();

                System.out.println(line);

                new Thread(new Sender2()).start();
                new Thread(new recver2()).start();

        }

}

class Sender2 implements Runnable {
        public void run() {
                try {

                        System.out.println("please input");
                        DatagramSocket ds = new DatagramSocket(10001);
                        InetAddress ia = InetAddress.getLocalHost();
                        DatagramPacket dp = null;
                        String line = null;
                        byte[] buf = null;

                        BufferedReader bufr = new BufferedReader(new InputStreamReader(
                                        System.in));

                        while ((line = bufr.readLine()) != null) {
                                buf = line.getBytes();
                                dp = new DatagramPacket(buf, buf.length, ia, 10002);
                                ds.send(dp);
                        }

                } catch (Exception e) {

                }

        }
}

class recver2 implements Runnable {
        public void run() {
                try {

                        DatagramSocket ds = new DatagramSocket(10002);
                        byte[] buf = new byte[1024];
                        DatagramPacket dp = new DatagramPacket(buf, buf.length);

                        while (true) {
                                ds.receive(dp);
                                String data = new String(dp.getData());
                                System.out.println(data);
                        }

                } catch (Exception e) {

                        System.out.println("bbbbbbbbbbbbbbbbbbbbb");
                }

        }
}



现在的这程序是能够运行没有问题,但是在我写的时候如果把while循环拿出来写成如下代码。
class recver2 implements Runnable {
        public void run() {
                while (true) {
                        try {

                                DatagramSocket ds = new DatagramSocket(10002);
                                byte[] buf = new byte[1024];
                                DatagramPacket dp = new DatagramPacket(buf, buf.length);

                                ds.receive(dp);
                                String data = new String(dp.getData());
                                System.out.println(data);

                        } catch (Exception e) {

                                System.out.println("bbbbbbbbbbbbbbbbbbbbb");
                        }
                }

        }
}


换成如下代码就会出现问题,我们知道ds.receive(dp);是等待机制,就是说如果没有收到数据是不会执行,但是在发送端发送数据两次之后,接收端就会报错,这是为什么,代码有点多,希望能谁能给我解释一下这是为什么?

评分

参与人数 1黑马币 +2 收起 理由
xinconan + 2

查看全部评分

5 个回复

倒序浏览
本帖最后由 weimoliang 于 2014-5-21 22:35 编辑

你试着把接收端的DatagramSocket 类实例化,放在while语句的外面。因为每次都在实例化一个新的对象出来。还有DatagramPacket的实例化。
回复 使用道具 举报
本帖最后由 szsycwb 于 2014-5-21 22:41 编辑

我运行虽然没报错,但有一个地方不行,recver2类的run方法中以下两句代码
  1. byte[] buf = new byte[1024];
  2. DatagramPacket dp = new DatagramPacket(buf, buf.length);
复制代码

最好放在下面的while(true)块内,不然当你发送的内容比上一次发送的内容要短的话,你会发现收到的内容会不正确,是这次内容加上一次内容的一部分(从第二次开始)。
回复 使用道具 举报
while(true)
     DatagramSocket ds = new DatagramSocket(10002);

10002这个端口已经使用了。这个代码会重复执行,所以会出错。端口已经使用了
回复 使用道具 举报
邵镛 发表于 2014-5-22 19:19
while(true)
     DatagramSocket ds = new DatagramSocket(10002);

谢谢。。
回复 使用道具 举报

不用谢。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马