黑马程序员技术交流社区

标题: 在socket通信中遇到的一个问题 [打印本页]

作者: wuhyoung    时间: 2014-5-21 21:06
标题: 在socket通信中遇到的一个问题
我在编写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);是等待机制,就是说如果没有收到数据是不会执行,但是在发送端发送数据两次之后,接收端就会报错,这是为什么,代码有点多,希望能谁能给我解释一下这是为什么?


作者: weimoliang    时间: 2014-5-21 22:34
本帖最后由 weimoliang 于 2014-5-21 22:35 编辑

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

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

最好放在下面的while(true)块内,不然当你发送的内容比上一次发送的内容要短的话,你会发现收到的内容会不正确,是这次内容加上一次内容的一部分(从第二次开始)。
作者: 邵镛    时间: 2014-5-22 19:19
while(true)
     DatagramSocket ds = new DatagramSocket(10002);

10002这个端口已经使用了。这个代码会重复执行,所以会出错。端口已经使用了

作者: wuhyoung    时间: 2014-5-22 21:08
邵镛 发表于 2014-5-22 19:19
while(true)
     DatagramSocket ds = new DatagramSocket(10002);

谢谢。。
作者: 邵镛    时间: 2014-5-24 18:23
wuhyoung 发表于 2014-5-22 21:08
谢谢。。

不用谢。。。




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