Java套接字聊天未显示所有消息
我正试图通过一个套接字与一个客户端和服务器聊天。我成功地运行了它,因为服务器能够来回传递消息,但当我试图使服务器端实现更复杂一些,添加命令等,以便客户端可以使用时,通信失败。看起来它可能会失去同步,即使反复使用相同的命令会产生不同的结果,即使我在每个命令之后刷新所有内容 这是一个简单化输出的示例,每次都能按预期工作: 客户:Java套接字聊天未显示所有消息,java,sockets,chat,sync,Java,Sockets,Chat,Sync,我正试图通过一个套接字与一个客户端和服务器聊天。我成功地运行了它,因为服务器能够来回传递消息,但当我试图使服务器端实现更复杂一些,添加命令等,以便客户端可以使用时,通信失败。看起来它可能会失去同步,即使反复使用相同的命令会产生不同的结果,即使我在每个命令之后刷新所有内容 这是一个简单化输出的示例,每次都能按预期工作: 客户: import java.io.*; import java.net.*; public class Test1Client { public static void ma
import java.io.*;
import java.net.*;
public class Test1Client
{
public static void main(String args[])
{
InputStreamReader convert = new InputStreamReader(System.in);
BufferedReader stdin = new BufferedReader(convert);
try
{
Socket echoClient = new Socket("localhost", 17);
PrintStream outs = new PrintStream(echoClient.getOutputStream());
BufferedReader ins = new BufferedReader(new InputStreamReader(echoClient.getInputStream()));
while(true){
System.out.print("Type whatever you want: ");
String line = stdin.readLine();
outs.println(line);
System.out.println("Server says: " + ins.readLine());
}
}
catch (IOException e)
{
System.out.println(e);
}
}
}
服务器:
import java.net.*;
import java.util.ArrayList;
import java.io.*;
public class Test1Server
{
public static void main(String args[])
{
try
{
ServerSocket socket= new ServerSocket(12167);
//Try not to use port number < 2000.
System.out.println("Waiting for a client to connect...");
Socket s = socket.accept();
System.out.println("Client Connected.");
BufferedReader ins = new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintStream outs = new PrintStream(s.getOutputStream());
while (true)
{
String line = ins.readLine();
outs.println(line);
}
}
catch (IOException e)
{
e.getStackTrace();
}
}
}
但是,当我将服务器端的while(true)
块替换为以下内容,从而使服务器端变得更加复杂时,我会得到一个更加混乱的结果:
String line = ins.readLine();
String response = manager.process(line);
outs.println(response);
outs.flush();
过程:
msg= "User logged in successfully \n";
return msg;
您还会注意到流程命令代码中的一些注释行。当我返回一条简单的消息时,服务器似乎会跟上,但当我同时使用登录功能时,它会给出如下可怕的输出:
Type whatever you want: login ryanne
Server says: ryanne logged in successfully
Type whatever you want: login ryanne
Server says:
Type whatever you want: login ryanne
Server says: You may already be logged in or did not use correct username or password
Type whatever you want: login ryanne
Server says:
Type whatever you want: newuser jeff
Server says: You may already be logged in or did not use correct username or password
Type whatever you want: newuser jeff 12345
Server says:
Type whatever you want: new user jeff 12345
Server says: You may already be logged in or did not use correct username or password
Type whatever you want:
同样,请注意空白处没有从服务器返回任何内容,然后即使命令中的更改也不会提示不同的响应。仅仅使用一个附加功能,它就好像失去了同步?也许,您发送的数据没有刷新。使用
out.flush()代码>在<代码>输出之后。println(行)
或将其构造函数调用更改为PrintStream(echoClient.getOutputStream(),true)代码>(打印新行时启用自动刷新)可能是因为您发送的数据未刷新。使用out.flush()代码>在<代码>输出之后。println(行)
或将其构造函数调用更改为PrintStream(echoClient.getOutputStream(),true)代码>(打印新行时启用自动刷新)可能是因为您发送的数据未刷新。使用out.flush()代码>在<代码>输出之后。println(行)
或将其构造函数调用更改为PrintStream(echoClient.getOutputStream(),true)代码>(打印新行时启用自动刷新)可能是因为您发送的数据未刷新。使用out.flush()代码>在<代码>输出之后。println(行)
或将其构造函数调用更改为PrintStream(echoClient.getOutputStream(),true)
(打印新行时启用自动刷新)在某些字符串的末尾有一些“\n”
。
如果您同时放置“\n”
并使用println
,您将得到双回车,这将破坏您的协议。删除“\n”
,它会工作得更好。在某些字符串的末尾有一些“\n”
。
如果您同时放置“\n”
并使用println
,您将得到双回车,这将破坏您的协议。删除“\n”
,它会工作得更好。在某些字符串的末尾有一些“\n”
。
如果您同时放置“\n”
并使用println
,您将得到双回车,这将破坏您的协议。删除“\n”
,它会工作得更好。在某些字符串的末尾有一些“\n”
。
如果您同时放置“\n”
并使用println
,您将得到双回车,这将破坏您的协议。删除“\n”
,它会工作得更好。您的服务器端代码似乎与客户端代码相同?:)我猜粘贴错误。你在“客户端”和“服务器”下发布了相同的代码@PeterButkovic修复了!对不起!您的服务器端代码似乎与客户端代码相同?:)我猜粘贴错误。你在“客户端”和“服务器”下发布了相同的代码@PeterButkovic修复了!对不起!您的服务器端代码似乎与客户端代码相同?:)我猜粘贴错误。你在“客户端”和“服务器”下发布了相同的代码@PeterButkovic修复了!对不起!您的服务器端代码似乎与客户端代码相同?:)我猜粘贴错误。你在“客户端”和“服务器”下发布了相同的代码@PeterButkovic修复了!对不起!在替换代码中,对于服务器,我的更“复杂”的版本,如果你想替换while循环,我会按照你的建议使用outs.flush(),不是吗?虽然没有发布,但我也有一个稍微复杂一点的客户端版本,其中包括outs.flush()方法:/还有其他想法或方法吗?这让我抓狂在替换代码中,对于服务器,我的更“复杂”的版本如果你愿意,在我替换while循环的地方,我使用outs.flush()作为你的建议,不是吗?虽然没有发布,但我也有一个稍微复杂一点的客户端版本,其中包括outs.flush()方法:/还有其他想法或方法吗?这让我抓狂在替换代码中,对于服务器,我的更“复杂”的版本如果你愿意,在我替换while循环的地方,我使用outs.flush()作为你的建议,不是吗?虽然没有发布,但我也有一个稍微复杂一点的客户端版本,其中包括outs.flush()方法:/还有其他想法或方法吗?这让我抓狂在替换代码中,对于服务器,我的更“复杂”的版本如果你愿意,在我替换while循环的地方,我使用outs.flush()作为你的建议,不是吗?虽然没有发布,但我也有一个稍微复杂一点的客户端版本,其中包括outs.flush()方法:/还有其他想法或方法吗?我简直要发疯了,真不敢相信这就是问题所在!非常感谢你!我不知道println的警告!真不敢相信这就是问题所在!非常感谢你!我不知道println的警告!真不敢相信这就是问题所在!非常感谢你!我不知道println的警告!真不敢相信这就是问题所在!非常感谢你!我不知道println的警告!
Type whatever you want: login ryanne
Server says: ryanne logged in successfully
Type whatever you want: login ryanne
Server says:
Type whatever you want: login ryanne
Server says: You may already be logged in or did not use correct username or password
Type whatever you want: login ryanne
Server says:
Type whatever you want: newuser jeff
Server says: You may already be logged in or did not use correct username or password
Type whatever you want: newuser jeff 12345
Server says:
Type whatever you want: new user jeff 12345
Server says: You may already be logged in or did not use correct username or password
Type whatever you want: