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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 天涯追梦 中级黑马   /  2014-4-14 17:35  /  2289 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 天涯追梦 于 2014-4-16 20:09 编辑

运行程序时不知为何出现错误Exception in thread "main" java.net.BindException: Address already in use: Cannot bind        at java.net.DualStackPlainDatagramSocketImpl.socketBind(Native Method)
        at java.net.DualStackPlainDatagramSocketImpl.bind0(DualStackPlainDatagramSocketImpl.java:81)
        at java.net.AbstractPlainDatagramSocketImpl.bind(AbstractPlainDatagramSocketImpl.java:95)
        at java.net.DatagramSocket.bind(DatagramSocket.java:376)
        at java.net.DatagramSocket.<init>(DatagramSocket.java:231)
        at java.net.DatagramSocket.<init>(DatagramSocket.java:284)
        at java.net.DatagramSocket.<init>(DatagramSocket.java:256)
        at cn.itcast.net.udp.chat.ChatTest.main(ChatTest.java:25)

程序代码如下
  1. package cn.itcast.net.udp.chat;

  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.net.DatagramPacket;
  6. import java.net.DatagramSocket;
  7. import java.net.InetAddress;
  8. import java.net.SocketException;

  9. public class ChatTest {

  10.         /**
  11.          * @param args
  12.          * @throws IOException
  13.          */
  14.         public static void main(String[] args) throws IOException {

  15.                 /*
  16.                  * 通过UDP协议。 完成一个聊天程序。 一个负责发送数据的任务。一个负责接收数据的任务。两个任务需要同时执行。 可以使用多线程技术。
  17.                  */
  18.                
  19.                 //创建socket服务。
  20.                 //发送端。
  21.                 DatagramSocket send = new DatagramSocket(8888);
  22.                 DatagramSocket rece = new DatagramSocket(11098);
  23.                
  24.                 new Thread(new Send(send)).start();
  25.                 new Thread(new Rece(rece)).start();
  26.                
  27.         }

  28. }

  29. // 负责发送的任务,通过UDPsocket发送。
  30. class Send implements Runnable {
  31.         // 任务对象一建立,需要socket对象。
  32.         private DatagramSocket ds;

  33.         public Send(DatagramSocket ds) {
  34.                 super();
  35.                 this.ds = ds;
  36.         }

  37.         @Override
  38.         public void run() {

  39.                 // 具体的发送数据的任务内容。
  40.                 // 1,要发送的数据来自哪里?键盘录入。
  41.                 BufferedReader bufr = new BufferedReader(new InputStreamReader(
  42.                                 System.in));

  43.                 // 1.1读取数据。
  44.                 String line = null;
  45.                 try {
  46.                         while ((line = bufr.readLine()) != null) {

  47.                                 // 1.2 将数据变成字节数组。封装到数据到。
  48.                                 // 2,将数据封装到数据包中。
  49.                                 byte[] buf = line.getBytes();
  50.                                 DatagramPacket dp = new DatagramPacket(buf, buf.length,
  51.                                                 InetAddress.getByName("172.17.7.100"), 11098);

  52.                                 // 3,将数据包发送出去。
  53.                                 ds.send(dp);
  54.                                 if ("over".equals(line)) {
  55.                                         break;
  56.                                 }

  57.                         }

  58.                         ds.close();
  59.                 } catch (IOException e) {

  60.                         e.printStackTrace();
  61.                 }

  62.         }

  63. }

  64. // 负责接收的任务
  65. class Rece implements Runnable {

  66.         private DatagramSocket ds;

  67.         public Rece(DatagramSocket ds) {
  68.                 super();
  69.                 this.ds = ds;
  70.         }

  71.         @Override
  72.         public void run() {
  73.                 while (true) {
  74.                         // 接收的具体的任务内容。
  75.                         // 1,因为接收的数据最终都会存储到数据包中。而数据包中必须有字节数组。
  76.                         byte[] buf = new byte[1024];

  77.                         // 2,创建数据包对象。
  78.                         DatagramPacket dp = new DatagramPacket(buf, buf.length);

  79.                         // 3,将收到的数据存储到数据包中。
  80.                         try {
  81.                                 ds.receive(dp);
  82.                         } catch (IOException e) {

  83.                                 e.printStackTrace();
  84.                         }

  85.                         // 4,获取数据。
  86.                         String ip = dp.getAddress().getHostAddress();

  87.                         String data = new String(dp.getData(), 0, dp.getLength());
  88.                         System.out.println(ip + ":" + data);
  89.                         if("over".equals(data)){
  90.                                 System.out.println(ip+".....离开聊天室");
  91.                         }

  92.                 }

  93.         }

  94. }
复制代码

求大神帮帮忙。。谢谢!!

QQ截图20140414173049.png (128.87 KB, 下载次数: 30)

图片

图片

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

5 个回复

倒序浏览
从JVM默认输出的错误信息可看出,你25行有错误,而java.net.BindException: Address already in use正提示你端口8888被占用了,你把端口号修改后再试试。
回复 使用道具 举报
呆呆沙师妹 发表于 2014-4-14 20:27
从JVM默认输出的错误信息可看出,你25行有错误,而java.net.BindException: Address already in use正提示 ...

我也出现过类似的错误!
1,可能端口号被占用了!
2,可能被绑定ip地址跟本机的ip不一样,建议在做实验的时候用本机回环地址:127.0.0.1!因为本本中的ip地址由于连接的网络不同可能会发生变化,但是每一台笔记本中都有一个固定的回环地址127.0.0.1;其对应的主机名默认为:localhost。
回复 使用道具 举报
我也出现过类似的错误!
1,可能端口号被占用了!
2,可能被绑定ip地址跟本机的ip不一样,建议在做实验的时候用本机回环地址:127.0.0.1!因为本本中的ip地址由于连接的网络不同可能会发生变化,但是每一台笔记本中都有一个固定的回环地址127.0.0.1;其对应的主机名默认为:localhost。

评分

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

查看全部评分

回复 使用道具 举报
改了端口,然后再试。
回复 使用道具 举报
谢谢大家,找到问题了,是因为运行了多个控制台程序,所以才会出现这样的错误,把运行未结束的程序关掉就好了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马