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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© adamjy 中级黑马   /  2014-4-8 00:21  /  756 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

求教,代码如下
  1. /**
  2. * Tcp服务端
  3. * @author AdamJY
  4. *
  5. */
  6. public class TcpServer {
  7.         public static void main(String[] args) throws Exception  
  8.     {  
  9.         // 建立服务端socket服务。并监听一个端口。  
  10.         ServerSocket ss = new ServerSocket(10006);  
  11.   
  12.         // 通过accept方法获取请求连接的客户端对象。  
  13.         while(true)  
  14.         {
  15.                 // 阻塞式
  16.             Socket s = ss.accept();  
  17.   
  18.             String ip = s.getInetAddress().getHostAddress();  
  19.             System.out.println(ip+" connected successfully.");  
  20.   
  21.             // 获取客户端发送过来的数据,那么要使用客户端对象的读取流来读取数据。  
  22.             InputStream in = s.getInputStream();  
  23.   
  24.             byte[] buf = new byte[1024];  
  25.             int len = in.read(buf);  
  26.   
  27.             System.out.println(new String(buf,0,len));  
  28.             //得到输出流,向客户端写数据
  29.             OutputStream os = s.getOutputStream();
  30.             os.write("Hi, client, I'm server!".getBytes());
  31.   
  32.             s.close();//关闭客户端.  
  33.         }  
  34.         //ss.close();  
  35.     }
  36. }
复制代码

  1. /**
  2. * Tcp客户端
  3. * @author AdamJY
  4. *
  5. */
  6. public class TcpClient {
  7.         public static void main(String[] args)throws Exception{
  8.                 //建立socket对象,指定服务端的
  9.         Socket s = new Socket(InetAddress.getLocalHost(),10006);
  10.         //得到输出流,向服务端写数据
  11.         OutputStream out = s.getOutputStream();  
  12.         out.write("Hi, server, I'm client.".getBytes());  
  13.         //得到输入流,读取服务端返回的数据
  14.         InputStream in = s.getInputStream();  
  15.         byte[] buf = new byte[1024];  
  16.         int len = in.read(buf);  
  17.         System.out.println(new String(buf,0,len));  
  18.         s.close();  
  19.     }
  20. }
复制代码


异常信息:
Exception in thread "main" java.net.BindException: Address already in use: JVM_Bind
        at java.net.DualStackPlainSocketImpl.bind0(Native Method)
        at java.net.DualStackPlainSocketImpl.socketBind(Unknown Source)
        at java.net.AbstractPlainSocketImpl.bind(Unknown Source)
        at java.net.PlainSocketImpl.bind(Unknown Source)
        at java.net.ServerSocket.bind(Unknown Source)
        at java.net.ServerSocket.<init>(Unknown Source)
        at java.net.ServerSocket.<init>(Unknown Source)
        at com.itheima.TcpServer.main(TcpServer.java:17)

评分

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

查看全部评分

1 个回复

倒序浏览
本帖最后由 沫然 于 2014-4-8 01:12 编辑

通常都是在说是要使用的端口被别的程序已经使用
你把端口改一下

短时间内new socket操作过多

而socket.close()操作并不能立即释放绑定的端口

而是把端口设置为TIME_WAIT状态

过段时间(默认240s)才释放(用netstat -na可以看到)

最后系统资源耗尽

(windows上是耗尽了pool of ephemeral ports 这段区间在1024-5000之间)



评分

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

查看全部评分

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