gpt4 book ai didi

Java 服务器套接字卡在接受调用(Android 客户端、Java 服务器)

转载 作者:行者123 更新时间:2023-11-29 08:16:27 25 4
gpt4 key购买 nike

下面我放了一段代码来帮助理解我的问题。我有一个服务器代码,客户端第一次加载和发送数据包时工作正常。收到第一个数据包后,服务器卡在“接受”。

我为此端口配置了 wireshark,服务器正在获取这些数据包。我只是想知道为什么接受不会不止一次返回。这让我发疯。

服务器代码

 public class DAPool implements Runnable {
private ServerSocket serverSocket;
private ArrayList<DA> pool;
private LinkedList<Socket> clientConnQ;
public DAPool(int newPoolSize, int serverPort) {
try {
serverSocket = new ServerSocket(serverPort, 500, InetAddress.getByName("127.0.0.1"));
} catch (IOException e) {
e.printStackTrace();
return;
}
poolSize = newPoolSize;
clientConnQ = new LinkedList<Socket>();
pool = new ArrayList<DA>(poolSize);
DA deviceThread;
for (int threads = 0; threads < poolSize; threads++) {
deviceThread = new DA();
connPool.add(deviceThread);
deviceThread.start();
}
}
public void run() {
while (true) {
Socket incomingSocket;
try {
incomingSocket = serverSocket.accept();
} catch (IOException e) {
e.printStackTrace();
return;
}
insertNewConnToQ(incomingSocket);
}
}


private class DA extends Thread {
private Socket clientSocket;
private ObjectInputStream inputObjectStream;
public DA() {
}
public void run() {
while (true) {

while (clientConnQ.isEmpty()) {
synchronized (clientConnQ) {
try {
clientConnQ.wait();
} catch (InterruptedException ignored) {
ignored.printStackTrace();
}
}
}
synchronized (clientConnQ) {
clientSocket = (Socket) clientConnQ.removeFirst();
try {
inputObjectStream = new ObjectInputStream(clientSocket.getInputStream());
} catch (IOException e) {
e.printStackTrace();
return;
}
// Do something useful here
}
}
}
}
}

客户端代码

public class SendQueue extends Thread {
LinkedList<Message> requestQ;
Message sendRequest, requestMessage;

Socket clientSocket;
OutputStream outputStream;
ObjectOutputStream objectOutputStream;

public SendQueue(Socket newClientSocket) {
requestQ = new LinkedList<Message>();
clientSocket = newClientSocket;
}

public void run() {
while (true) {
synchronized (requestQ) {
while (requestQ.isEmpty()) {
try {
requestQ.wait();
} catch (InterruptedException ignored) {
ignored.printStackTrace();
}
}
sendRequest = requestQ.removeFirst();
}
try {
outputStream = clientSocket.getOutputStream();
objectOutputStream = new ObjectOutputStream(outputStream);
objectOutputStream.writeObject(sendRequest);
objectOutputStream.flush();
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
} catch (RuntimeException e) {
e.printStackTrace();
}
}
}

public int sendRequest(Message message) {
synchronized (requestQ) {
requestQ.addLast(message);
requestQ.notify();
}
return 0;
}
}

最佳答案

我没有看到在 serverSocket 上设置了超时。

ServerSocket.accept() 是一个阻塞操作,因此它将阻塞直到发生错误、超时或连接被接受。

尝试

SererSocket.setSOTimeout(10000)

完成后,您似乎也没有关闭流。

关于Java 服务器套接字卡在接受调用(Android 客户端、Java 服务器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4489232/

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