我发现这个TCP服务器在线,我想稍微修改它以返回与客户端中输入的不同的消息。它不能按我的意愿工作; else {}
的工作原理“就像一个魅力”,但第一个如果没有 - 客户端仍在等待输入。
server.java
while(true)
{
Socket connectionSocket = welcomeSocket.accept();
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
clientSentence = inFromClient.readLine();
System.out.println("Received: " + clientSentence);
String test="hey";
String tempus="tster";
if(clientSentence.contains(test)==true){
System.out.println(tempus);
outToClient.writeBytes(tempus);
}
else{
capitalizedSentence = clientSentence.toUpperCase() + '\n';
outToClient.writeBytes(capitalizedSentence);
}
client.java
public static void main(String argv[]) throws Exception
{
String sentence;
String modifiedSentence;
BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in));
Socket clientSocket = new Socket("localhost", 6789);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
sentence = inFromUser.readLine();
outToServer.writeBytes(sentence + '\n');
modifiedSentence = inFromServer.readLine();
System.out.println("FROM SERVER: " + modifiedSentence);
clientSocket.close();
}
答案 0 :(得分:2)
读/写文件/套接字时常见的错误是将文本与二进制文件混合和匹配,并且会让人感到非常困惑。你已经使用了两者。
您需要使用文本或二进制文件,看起来您要使用文本。例如BufferedReader和PrintWriter。 (注意:PrintWriter会静默消耗底层流中的异常)
答案 1 :(得分:0)
在BufferedReader
中,您等待最后由\n
指示的一行,就像您在else
中所做的那样。如果要使用readLine,则需要发送一行(以新行字符结尾 - \n
。
如果您不想在输入的末尾添加换行符,可以使用BufferedReader#read(char[],int,int)
方法
答案 2 :(得分:0)
BufferedReader.readLine()正在尝试读取整行输入(即它正在寻找换行符'\ n')。 “else”块中的字符串会在最后添加换行符,而您的tempus
变量不会以换行符终止,因此客户端只是等待。