java写的通讯短链接客户端,老是会报端口被占用的错误,跪求高手帮忙分析下是啥问题?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java写的通讯短链接客户端,老是会报端口被占用的错误,跪求高手帮忙分析下是啥问题?相关的知识,希望对你有一定的参考价值。

[15-7-11 14:28:55:937 CST] 000e66dd SystemOut O 2015-07-11 14:28:55,937 ERROR [threadPoolTaskExecutor-39] - 200.0.0.207:8174 连接失败!
java.net.BindException: Address already in use: connect
at sun.nio.ch.Net.connect(Native Method)
at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:539)
at com.nantian.jpre.app.base.NIOClientAddTranCode.send(NIOClientAddTranCode.java:101)
at com.nantian.jpre.app.business.card.C2045Transaction.doTransaction(C2045Transaction.java:38)
at com.nantian.jpre.app.business.AbstractTransaction.service(AbstractTransaction.java:102)
at com.jpre.BusinessDealExecutorService.service(BusinessDealExecutorService.java:128)
at com.jpre.NIOAsynShortSocketServer$NiosynShortSocketProcessor.run(NIOAsynShortSocketServer.java:516)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:678)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:703)
at java.lang.Thread.run(Thread.java:811)
这个是客户端问题还是服务器端的问题
这个错误是偶尔就会出现的,还是有很多成功的,并不是一直失败,40多次才会失败1次
用的是同步短链接

如果你的服务器端有其他的程序将该端口占用,那么你这个程序就要另外开启其他端口。如果其他程序释放了该端口,你再次连接的时候就会成功。希望对你有帮助。 参考技术A 你本地的端口已经被占用了,你换个端口试试追问

端口没问题的,是成功了好几次就会出现一次这个错误

追答

是不是你在同一段程序中新建的链接老是用一个端口?

追问

同步段连接不是都只配置一个端口吗

追答

看不到代码也说不清这种情况

windows下端口占用处理工具

一、通用方法

经常,我们在启动应用的时候发现系统需要的端口被别的程序占用,笔者在最近使用tomcat时,老是会遇到这种端口占用的问题,如何知道谁占有了我们需要的端口,很多人都比较头疼,以下是通用方法:

在windows命令行窗口下执行: 

1.查看所有的端口占用情况

C:\\>netstat -ano
  协议    本地地址                     外部地址               状态                   PID
  TCP    127.0.0.1:1434         0.0.0.0:0              LISTENING       3236
  TCP    127.0.0.1:5679         0.0.0.0:0              LISTENING       4168
  TCP    127.0.0.1:7438         0.0.0.0:0              LISTENING       4168
  TCP    127.0.0.1:8015         0.0.0.0:0              LISTENING       1456
  TCP    192.168.3.230:139      0.0.0.0:0              LISTENING       4
  TCP    192.168.3.230:1957     220.181.31.225:443     ESTABLISHED     3068
  TCP    192.168.3.230:2020     183.62.96.189:1522     ESTABLISHED     1456
  TCP    192.168.3.230:2927     117.79.91.18:80        ESTABLISHED     4732
  TCP    192.168.3.230:2929     117.79.91.18:80        ESTABLISHED     4732
  TCP    192.168.3.230:2930     117.79.91.18:80        ESTABLISHED     4732
  TCP    192.168.3.230:2931     117.79.91.18:80        ESTABLISHED     4732
2.查看指定端口的占用情况
C:\\>netstat -aon|findstr "9050"
  协议    本地地址                     外部地址               状态                   PID
  TCP    127.0.0.1:9050         0.0.0.0:0              LISTENING       2016

P: 看到了吗,端口被进程号为2016的进程占用,继续执行下面命令: (也可以去任务管理器中查看pid对应的进程)

3.查看PID对应的进程
C:\\>tasklist|findstr "2016"
 映像名称                       PID 会话名              会话#       内存使用
 ========================= ======== ================
  tor.exe                     2016 Console                 0     16,064 K 

P:很清楚吧,tor占用了你的端口。
4.结束该进程

C:\\>taskkill /f /t /im tor.exe

以上转自:http://www.iteye.com/topic/1117270

 

二、描述与运行截图

  尽管上述方法能够解决这个问题,但是过于繁琐,而且CMD下的那几行命令实在难记住,笔者便写了这个exe。这玩意的实现比较简单,主要是调用了cstdlib库中的system()函数,逻辑也十分的清楚。虽然比较简单,但是感觉还是十分的实用,因此拿出来于大家分享。好吧,其实主要是给自己留个备份。

以下是笔者的运行截图:

技术分享

  

三、源代码

  以下是实现的源代码(转载请注明出处),一个需要注意的点是:windows 为所有进程和线程分配的 ID 都是 4 的倍数。

技术分享
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 /*
 5 #windows端口占用处理工具
 6 #作者:大大维
 7 #2017/6/23
 8 */
 9 using namespace std;
10 int main()
11 {
12     system("title windows端口占用处理工具");//设置cmd窗口标题
13     system("color 2B");
14     char cmd1[64]="netstat -aon|findstr \\"";
15     char cmd2[64]="tasklist|findstr \\"";
16     char cmd3[64]="taskkill /f /t /im ";
17     cout<<"请输入被占用的端口号:"<<endl;
18     unsigned duankou=0;
19     cin>>duankou;
20     sprintf(cmd1,"%s%d\\"",cmd1,duankou);
21     system(cmd1);
22 
23     // windows 为所有进程和线程分配的 ID 都是 4 的倍数
24     cout<<"请输入端口占用进程的PID(最后一列),或者直接结束(输入非4的倍数,如1)";
25     unsigned pid=1;
26     cin>>pid;
27     if(!(pid%4))
28     {
29         sprintf(cmd2,"%s%d\\"",cmd2,pid);
30         system(cmd2);
31     }
32     else
33     {
34         return 0;
35     }
36     cout<<"你想结束这个进程吗?(y or n)"<<endl;
37     char ch=n;
38     cin>>ch;
39     if(ch==y)
40     {
41         cout<<"请输入进程名(第一列),或者直接结束(输入0)"<<endl;
42         char jingchengming[16];
43         cin>>jingchengming;
44         if(ch!=0)
45         {
46             sprintf(cmd3,"%s%s",cmd3,jingchengming);
47             system(cmd3);
48             cout<<"已经结束了该进程"<<endl;
49         }
50     }
51     getchar();
52     return 0;
53 }
View Code

  另外,大家在关闭进程的时候要慎之又慎,免得关闭了一些不必要的进程,造成严重的后果。

 

以上是关于java写的通讯短链接客户端,老是会报端口被占用的错误,跪求高手帮忙分析下是啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

80端口占用解决方法(转)

关于80端口被system占用

Tomcat端口被占用怎么查看占用程序

服务器80端口被占用 linux

golang http.client 遇到了 Connection reset by peer 问题

windows下端口占用处理工具