gpt4 book ai didi

Java - 套接字 - 卡住

转载 作者:行者123 更新时间:2023-12-01 05:55:26 24 4
gpt4 key购买 nike

我有一个最小的服务器,它等待客户端连接,然后他启动一个线程,将回复发送回客户端,问题是回复。

这是服务器的代码:

 int port = 1234;
ServerSocket servSock = null;
servSock = new ServerSocket(port);
while (true) {
Socket link = servSock.accept();
serverThread st = new serverThread(link);
st.start();
}

这是线程的 run() 方法的代码,即发送回答案的方法,sk 是服务器代码中通过参数传递的套接字“链接”

 public void run() {
String dato = "";
InputStream i = null;
try {
i = sk.getInputStream();
} catch (IOException ex) {
Logger.getLogger(serverThread.class.getName()).log(Level.SEVERE, null, ex);
}
Scanner input = new Scanner(i);
//i receive the data sent
while (input.hasNext()) {
dato += input.nextLine();
}
// then i send a reply
DataOutputStream outputStream=new DataOutputStream(sk.getOutputStream());
outputStream.writeInt(1);
outputStream.close();

客户端(仅应从服务器接收答案的代码):

        Socket link;
int valid = 0;
String url="localhost";
int port=1234;
link = new Socket(InetAddress.getByName(url), port);

//i've to send some data to the server
PrintWriter output = new PrintWriter(link.getOutputStream(), true);
String a = new String(Base64.encode(mex));
output.println(createXml(tag, a));
output.flush();


//then i need to receive an answer from the server
DataInputStream answerI = new DataInputStream(link.getInputStream());

while(answerI.available()!=0)// but answerI.available() is always equal 0
valid = answerI.readInt();

answerI.close();
output.close ();
link.close();

使用此代码,指令 valid = answerI.readInt();未达到。

如果没有 while 循环,客户端会卡住在以下行:valid = answerI.readInt();

有人可以帮助我吗?

提前谢谢

最佳答案

我猜测服务器在对 input.hasNext() 的调用中被阻止。当套接字关闭时,这将返回 false,并且其 InputStream 返回 -1 以表示流结束。但是,套接字仍然打开。客户端可以发送另一行; 扫描器正在阻止查看客户端的下一步行动。

有一些方法可以关闭套接字的“一半”,以便服务器可以知道客户端已关闭其发送 channel ,但仍然可以接收响应。

但是,这种方法很复杂。我建议更改协议(protocol),以便服务器可以确定何时允许响应。

关于Java - 套接字 - 卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3189876/

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