[英]Address already in use after attempting socket connection
嗨,我是Java套接字的新手,我一直在尝试创建服务器套接字。 我知道可能有人问过这个问题,但是我想请别人看看我的代码。 有人可以告诉我我要去哪里了,因为我遇到一个错误,说“地址已在使用中”,请帮忙吗? 我还意识到,通过一些研究,我可能会同时运行两个服务器。 任何人都可以解释一下吗?这里是服务器类和客户端类。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket;
public class MessageServer {
public static void main(String[] args) throws IOException{
//int port = 25000;
//int port = Integer.parseInt(args[0]);
ServerSocket serverr = new ServerSocket(3456);
while(true){
System.out.println("Waiting for client...");
//ServerSocket serverSocket = new ServerSocket(53705);
//System.out.println("listening on port " + serverSocket.getLocalPort());
Socket client = serverr.accept();
System.out.println("Client from " + client.getInetAddress() + " connected.");
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
String inputLine = in.readLine();
System.out.println("Client said: '"+inputLine+"'");
Writer count = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
byte c [] = count.toString().getBytes();
count.flush();
//server.close();
}
}
}
import java.net.*;
import java.io.*;
public class MessageSendClient {
public static void man(String args[]) throws IOException{
Socket client = new Socket ("localhost", 3456);
System.out.println("Connected to " + client.getInetAddress());
InputStream in = client.getInputStream();
byte c[] = new byte[100];
int num = in.read(c);
String count = new String(c);
System.out.println("Server said: " + count);
client.close();
}
}
异常堆栈跟踪:
Exception in thread "main" java.net.BindException: Address already in use at
java.net.PlainSocketImpl.socketBind(Native Method) at
java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:376) at
java.net.ServerSocket.bind(ServerSocket.java:376) at
java.net.ServerSocket.<init>(ServerSocket.java:237) at
java.net.ServerSocket.<init>(ServerSocket.java:128) at
MessageServer.main(MessageServer.java:18)
此错误消息表示某些应用程序已经在您指定的端口( 3456
)上创建了套接字。
要解决该问题,您需要将此端口更改为其他端口,或者找出占用该程序的程序并终止该程序。 在Linux中,可以使用netstat
命令执行此操作:
# netstat -tulpn | grep :3456
有关netstat
命令的更多详细信息,请参阅本文 。
当您使用我上面写的技术确定了该过程后,您可能想要终止它。 假设该进程的PID
为1234
。 然后我们将需要以下命令:
# kill -9 1234
您可能需要root
权限才能执行此操作。
如果以上方法均无济于事,则可能是某些外部软件阻止了您的连接。 它可以是selinux
,也可以是网络防火墙设置-也可以考虑进行检查。
这与某个先前的套接字(该程序的先前运行的套接字)保持活动状态有关,以完成关闭机制上的双重ACK。 您可以通过为套接字指定一个特定的选项来绕开它:
socket.setReuseAddress(true);
(其中socket
是您的服务器套接字)。
要么:
程序的上一个实例退出后,连接端口仍处于TIME_WAIT状态。 等待两分钟,或按如下所示创建ServerSocket:
ServerSocket ss = new ServerSocket(); // create an unbound socket ss.setReuseAddress(true); ss.bind(...); // argument(s) left as an exercise for the reader
问题在于,当您对代码进行两次测试时,您并未完全杀死之前的过程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.