我需要一些帮助,我想我遇到了一个简单的网络相关问题。这也将帮助我更好地了解这一切是如何运作的,因为我知道什么不是close()。我相信这很简单,但对我来说这一切都是全新的。这是客户端程序。如果我能弄清楚的话,我很可能会附加服务器。感谢
public class Server {
public static void main(String[] args) {
start();
}
static int start = 0;
public static void start() {
try {
ServerSocket serverSocket = new ServerSocket(4567);
Socket socket = serverSocket.accept();
//1) Take and echo input (In this case a message)
BufferedReader bf = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String message = bf.readLine();
System.out.println("Message recieved from Client:" + message);
//2) Response of client message
PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
printWriter.println("Server echoing back the message ' " + message + " ' from Client");
} catch (IOException e) {
System.out.println("e " + e);
System.exit(-1);
}
start++;
clearUp();
if (start < 5) {
System.out.println("Closing binds and Restarting" + start);
start();
}
}
public void clearUp(){
//How would I clear the stuff that is left bound
so I can restart via start() and avoid the
java.net.BindException: Address already in use: JVM_Bind ?
}
}
如何清除保留绑定的内容,以便通过start()重新启动并避免java.net.BindException:地址已在使用:JVM_Bind?
问题就在这些行中。
public static void start() {
try {
ServerSocket serverSocket = new ServerSocket(4567);
//tells server to listen on 4567
....
if (start < 5) {
System.out.println("Closing binds and Restarting" + start);
start();
}
您正在反复调用start,并告诉ServerSocket在同一端口上侦听
相反,您想要做的是拥有一个ServerSocket,由服务器持有以进行侦听。然后,一个常规的Socket连接到ServerSocket,服务器accepts
连接,这会返回一个新的Socket
供他们通信。你的问题似乎表明这是客户端代码,传统客户端不应该有ServerSocket。因为它没有在某个端口上侦听。
你想做的是服务器:
- 在某个端口上制作serversocket。在其中循环
- 等待来自客户端的连接
- 接受连接。这将导致创建一个新的套接字,供您和客户端进行通信
客户:
- 连接到服务器套接字
- 通过插座与它交谈
如果这没有意义,我可以给出一些代码示例。
请注意,为了让服务器与多个客户端进行通信,您需要使用线程。
我不知道你为什么要重新绑定,所以我删除了那个位。
您也没有关闭任何插座。
它们是资源,所以您不应该依赖java自己正确地清理它们。
public static void start() {
ServerSocket serverSocket = null;
int exitCode = 0;
try {
serverSocket = new ServerSocket(4567);
while(start < 5){
Socket socket = serverSocket.accept();
//1) Take and echo input (In this case a message)
BufferedReader bf = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String message = bf.readLine();
System.out.println("Message recieved from Client:" + message);
//2) Response of client message
PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
printWriter.println("Server echoing back the message ' " + message + " ' from Client");
// close resource
socket.close();
start++;
}
} catch (IOException e) {
System.out.println("e " + e);
exitCode = -1;
} finally {
if (serverSocket != null){
try {
// close server
serverSocket .close();
} catch (IOException e) {
System.out.println("e " + e);
}
}
}
if (exitCode != 0){
System.exit(exitCode);
}
}