黑马程序员技术交流社区

标题: udp协议的聊天程序,谁帮我看看为啥子,找老师视频写的 [打印本页]

作者: lonely_zb    时间: 2013-9-1 22:51
标题: udp协议的聊天程序,谁帮我看看为啥子,找老师视频写的
发送端线程
package com.mysoft.socket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* 以线程的方式发送数据
* @author bo
*
*/
public class UdpSend2  implements Runnable{

private DatagramSocket ds;

public UdpSend2(DatagramSocket ds){
  this.ds = ds;
}

@Override
public void run() {
  
  try {
   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
   
   String line = null;
   
   while((line=br.readLine())!=null){
   
     if("886".equals(line)){
      break;
     }
      
     //将输入的数据发送出去
     byte[] buf = line.getBytes();
     
     DatagramPacket dp = new DatagramPacket(buf, buf.length,InetAddress.getByName("127.0.0.1"),10000);
     
     ds.send(dp);
   }
   
   ds.close();
  } catch (Exception e) {
   throw new RuntimeException("发送数据失败!");
  }
}
}

接收端现场

package com.mysoft.socket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UdpRecv2 implements Runnable{

private DatagramSocket ds;

public UdpRecv2(DatagramSocket ds){
  this.ds = ds;
}

@Override
public void run() {
  try {
   //服务端需一直开启,一有数据就接收
   while(true){
   
    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);
   }
   
  } catch (Exception e) {
   throw new RuntimeException("接收数据失败!");
  }
}
}


main方法
package com.mysoft.socket;
import java.io.IOException;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UdpChartDemo {

public static void main(String[] args) throws IOException {
  
  DatagramSocket ss = new DatagramSocket();
  
  DatagramSocket rs = new DatagramSocket(10000);
  
  new Thread(new UdpSend2(ss)).start();
  new Thread(new UdpRecv2(rs)).start();
}
}


报错信息:

Exception in thread "main" java.net.SocketException: Unrecognized Windows Sockets error: 0: Cannot bind
at java.net.PlainDatagramSocketImpl.bind0(Native Method)
at java.net.PlainDatagramSocketImpl.bind(PlainDatagramSocketImpl.java:82)
at java.net.DatagramSocket.bind(DatagramSocket.java:368)
at java.net.DatagramSocket.<init>(DatagramSocket.java:210)
at java.net.DatagramSocket.<init>(DatagramSocket.java:261)
at java.net.DatagramSocket.<init>(DatagramSocket.java:234)

真是不知何故,老师运行的好好的..我本地运行不起来..


作者: dunwu    时间: 2013-9-1 23:38
1、毕老师写得代码是两个class类一个public class类
2、主函数抛异常时,要抛io和Socket异常,所以要抛一个大点的异常
3、代码运行一次,Socket端口已经被绑定,在运行时还未解除绑定,所以出现cannot bind
作者: lonely_zb    时间: 2013-9-1 23:52
张站华 发表于 2013-9-1 23:38
1、毕老师写得代码是两个class类一个public class类
2、主函数抛异常时,要抛io和Socket异常,所以要抛一个 ...

改完之后我运行了....但是不知到为啥只能聊一句,就不能再写了...

作者: dunwu    时间: 2013-9-3 14:22
在dos命令行中可以实现多行
我在eclipse中,开始也不能实现这个功能,但是在重新定义一个udp发送端,就可以实现此功能(再删除此类也是可以实现的),我猜测可能是eclipse中的哪个原因(具体为什么还需要深入研究)




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