gpt4 book ai didi

java - 在java中设置套接字选项

转载 作者:行者123 更新时间:2023-12-02 00:41:30 25 4
gpt4 key购买 nike

我有一个 Java 服务器,它监听特定端口的传入连接。一切都按预期工作,我的客户端连接到服务器,我可以在它们之间发送数据。

我的问题是,当我关闭客户端,再次打开它并尝试重新连接时,它不会连接(我的服务器始终保持打开状态)。

为了重新连接,我必须再次重新启动服务器。

所以我尝试在服务器端执行此操作:

InetSocketAddress serverAddr = new InetSocketAddress(serverIpAddress, serverPort);
serverSocket = new ServerSocket();
serverSocket.setReuseAddress(true);
//I tries setting up a reuse option
serverSocket.bind(serverAddr);

即使在 setReuseAddress() 之后,我的客户端也不会连接,除非我重新启动服务器!有谁知道如何做到这一点吗?

编辑2:

    try {
while(true){

clientSocket = serverSocket.accept();

System.out.println("S-a conectat clientul de monitorizare!");


os=new ObjectOutputStream(clientSocket.getOutputStream());
try{

coord=(Coordinate)queue.take();
System.out.println(coord.getLat()+coord.getLon()+coord.getVit()+coord.getwId()+coord.getime());
os.writeObject(coord);

os.flush();


}

catch(Exception e)

{
e.printStackTrace();

}
}

} catch (IOException e) {

System.out.println(e);

try {

clientSocket.close();

os.close();

}catch(Exception e1) {

e1.printStackTrace();

}

}
<小时/>

新编辑:

线程池服务器:

主要:

ThreadPooledServer 服务器 = new ThreadPooledServer(队列,7001); 新线程(服务器).start();

<小时/>

线程池服务器:

公共(public)类 ThreadPooledServer 实现 Runnable {

 protected ExecutorService threadPool =
Executors.newFixedThreadPool(5);


public void run() {

openServerSocket();

while (!isStopped()) {
Socket clientSocket = null;
try {
System.out.println("Serverul asteapta clienti spre conectare");
clientSocket = this.serverSocket.accept();
clientconnection++;
System.out.println("Serverul a acceptat clientul cu numarul:"
+ clientconnection);


} catch (IOException e) {
if (isStopped()) {
System.out.println("Server Stopped.");
return;
}
throw new RuntimeException("Error accepting client connection",
e);
}

WorkerRunnable workerRunnable = new WorkerRunnable(queue,clientSocket);
this.threadPool.execute(workerRunnable);

}

System.out.println("Server Stopped.");
}

公共(public)同步无效停止(){ this.isStopped = true;

    try {

this.threadPool.shutdown();

}


catch (IOException e) {
throw new RuntimeException("Error closing server", e);
}

}

私有(private)无效 openServerSocket() {

    try {

InetSocketAddress serverAddr = new InetSocketAddress(SERVERIP,
serverPort);

serverSocket = new ServerSocket();

serverSocket.setReuseAddress(true);
serverSocket.bind(serverAddr);

} catch (IOException e) {
throw new RuntimeException("Cannot open port", e);
}
}

this.serverSocket.close();

最佳答案

在您的 run 方法中,您接受一个客户端,然后进入无限循环,尝试将数据写入ObjectOutputStream。当客户端关闭连接时,会引发异常,因为您无法再写入流。此时,我们脱离了无限循环 (while(true) { .. }),并且 run 方法结束。

如果您想继续接受客户端,我建议您将 while 循环移至代码顶部,准确地说是在接受之上。

下面的伪代码(注意:我没有捕获任何异常等):

while (true)
{
// Wait for a client to connect..
Socket clientSocket = serverSocket.accept();

// Write to the client..
ObjectOutputStream os = new ObjectOutputStream(clientSocket.getOutputStream());
os.writeObject(coord);
os.flush();
}

关于java - 在java中设置套接字选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6242394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com