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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马李刚 黑马帝   /  2011-9-11 20:31  /  1868 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

编译运行未报错啊,就是无法接收数据[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 编辑 ]

3 个回复

倒序浏览
我运行了一下你的程序
问题一:编译是没问题 但是运行时出现异常了 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 编辑 ]

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-11 21:40:54
藤椅
发送端的 line
while((line=br.readLine())!=null)
跟本没用到

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
  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 编辑 ]

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

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