黑马程序员技术交流社区

标题: 网络编程: 无法接收数据 [打印本页]

作者: 黑马李刚    时间: 2011-9-11 20:31
标题: 网络编程: 无法接收数据
编译运行未报错啊,就是无法接收数据[code=java]import java.net.*;
import java.io.*;
//发送端
class L
{
        public static void main(String args[]) throws Exception
        {
                DatagramSocket ds=new DatagramSocket();
                BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
                String line=null;
                while((line=br.readLine())!=null)
                {
                        byte[] buf=new byte[1024];
                        DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.0.101"),20006);
                        ds.send(dp);
                }
                ds.close();
        }
}
//接收端

class L1
{
        public static void main(String args[]) throws Exception
        {
                DatagramSocket ds=new DatagramSocket(20006);
                while(true)
                {
                byte[] buf=new byte[1024];
                DatagramPacket dp=new DatagramPacket(buf,buf.length);
                ds.receive(dp);
                String text=new String(dp.getData(),0,dp.getLength());
                System.out.println(text);
                ds.close();
        }
        }
}[/code]
[ 本帖最后由 黑马李刚 于 2011-09-11  20:32 编辑 ]
作者: 杨相国    时间: 2011-9-11 21:11
我运行了一下你的程序
问题一:编译是没问题 但是运行时出现异常了 java.net.SocketException: Socket closed
因为你的接收端用的是while(true),虽然没错,但是你把ds.close(); 写进去了,当你先运行接收端的时候 Socket 已经关闭了,你可以写个Thread来控制下。。
另外最重要的问题就是:
你应该吧这句话 byte[] buf=new byte[1024];改成buf = line.getBytes(),否则你这句话while((line=br.readLine())!=null)读出来的line是没用的,然后你发过去的也是空的。最简单的修改,代码如下:[code=java]//接收端
class L1 {
        public static void main(String args[]) throws Exception {
                while (true) {
                        DatagramSocket ds = new DatagramSocket(20006);
                        byte[] buf = new byte[1024];
                        DatagramPacket dp = new DatagramPacket(buf, buf.length);
                        ds.receive(dp);
                        String text = new String(dp.getData(), 0, dp.getLength());
                        System.out.println(text);
                        ds.close();
                }
        }
}[/code][code=java]//发送端
class L {
        public static void main(String args[]) throws Exception {
                DatagramSocket ds = new DatagramSocket();
                System.out.println("输入: ");
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                String line = null;
                while ((line = br.readLine()) != null) {
                        byte[] buf = line.getBytes();
                        DatagramPacket dp = new DatagramPacket(buf, buf.length,
                                        InetAddress.getLocalHost(), 20006);
                        System.out.println(new String(dp.getData(), 0, dp.getLength()));
                        ds.send(dp);
                }
                ds.close();
        }
}[/code]
[ 本帖最后由 杨相国 于 2011-09-11  21:26 编辑 ]
作者: 匿名    时间: 2011-9-11 21:40
发送端的 line
while((line=br.readLine())!=null)
跟本没用到
作者: 程钧杰    时间: 2011-9-12 23:55
  1. //一行行的读下去
  2. while((line=br.readLine())!=null)
  3. 12.               
  4. {
  5. 13.        
  6. //错在这里,建立缓冲区把上面得到每一行的数据放入缓冲区内byte[] buf = line.getBytes()               
  7. byte[] buf=new byte[1024];
  8. 14.
  9. //把得到的数据打包成对象                        
  10. DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.0.101"),20006);
  11. 15.                        
  12. ds.send(dp);
  13. 16.               
  14. }
复制代码
[ 本帖最后由 chengjj520 于 2011-09-12  23:56 编辑 ]




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