gpt4 book ai didi

Java – 服务器仅在客户端停止时响应

转载 作者:太空宇宙 更新时间:2023-11-04 13:36:19 25 4
gpt4 key购买 nike

我最近编写了一个简单的Java服务器和一个客户端来测试服务器。服务器应该接收来自客户端的消息,并发送回消息的随机子字符串。问题是这样的:当我使用客户端程序发送消息时,服务器没有响应。然后,当我终止客户端程序时,服务器会立即采取行动,并尝试将数据发送回客户端。服务器正确读取数据,但只有当我停止客户端程序时才开始处理它。

这是客户端代码:

import java.io.*;
import java.net.*;

class ServerTest{

public static void main(String args[]) throws Exception{

Socket clientSocket = new Socket(myIpAdress, 8001);

//Send the message to the server
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));

String sendMessage = "randSubstring:StackOverflowIsAwsome";

bw.write(sendMessage);
bw.flush();
System.out.println("Message sent: "+sendMessage);


String message = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())).readLine();

System.out.println("Message received from the server : " +message);

clientSocket.close();

}

}

我的服务器代码由两个类组成。这是听众:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerListener {
public static void main(String args[]) throws Exception {
String clientSentence;
ServerSocket socket = new ServerSocket(8001);

while(true) {
Socket connectionSocket = socket.accept();
BufferedReader input = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
//DataOutputStream output = new DataOutputStream(connectionSocket.getOutputStream());
clientSentence = input.readLine();

if(clientSentence.startsWith("randSubstring:")){

Thread connection = new Thread(new ServerConnection(connectionSocket, clientSentence));
connection.start();
}

Thread.sleep(300);
}

}
}

这是在客户端停止之前不会启动的线程:

import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Random;

public class ServerConnection implements Runnable{

private Socket serverConnection;
private String sentence;

public ServerConnection(Socket connection, String clientSentence){

serverConnection = connection;
sentence = clientSentence;

}

@Override
public void run() {
Random r = new Random();
String substring = sentence.substring(0, r.nextInt(sentence.length()));

try {
OutputStream os = serverConnection.getOutputStream();
OutputStream out = new BufferedOutputStream(os);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
bw.write(substring);
bw.close();
out.close();
os.close();


} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}

我正在使用装有 Yosemite 的 Macintosh。发生这种情况是因为我尝试在同一台计算机上运行这些程序,还是如果从不同的计算机运行这些程序会出现此问题?如有任何帮助,我们将不胜感激。

最佳答案

在服务器中,您执行 readLine(..),这意味着它将等待行结束符。

但是在您的发件人代码中,您只需发送一个没有行结尾的字符串。

因此,要么确保您也发送行尾字符,要么您的服务器等待其他内容作为“分隔符”

关于Java – 服务器仅在客户端停止时响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31662971/

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