[英]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.