Java,使用套接字连接发送消息时出现问题
我的Java程序有问题。它在服务器和许多客户端之间有一个套接字连接。以下是服务器(与问题有关的部分): 这是客户:Java,使用套接字连接发送消息时出现问题,java,sockets,client,message,Java,Sockets,Client,Message,我的Java程序有问题。它在服务器和许多客户端之间有一个套接字连接。以下是服务器(与问题有关的部分): 这是客户: private String serverurl = "localhost"; private int serverport = 7777; private PrintWriter printwriter; private InputStreamReader inputstreamreader; private BufferedReader bufferedreader; priv
private String serverurl = "localhost";
private int serverport = 7777;
private PrintWriter printwriter;
private InputStreamReader inputstreamreader;
private BufferedReader bufferedreader;
private Socket server;
public Client() {
server = null;
try {
server = new Socket(serverurl, serverport);
server.setSoTimeout(5000);
} catch (UnknownHostException unhe) {
System.out.println("UnknownHostException: " + unhe.getMessage());
} catch (InterruptedIOException intioe) {
System.out.println("Timeout while attempting to establish socket connection.");
} catch (IOException ioe) {
JOptionPane.showMessageDialog(new JFrame(),"Unable to reach the server!","ERROE!",JOptionPane.ERROR_MESSAGE);
}
}
public String sendCommand(String command) throws IOException {
if(server == null) {
try {
server = new Socket(serverurl, serverport);
server.setSoTimeout(5000);
} catch (UnknownHostException unhe) {
System.out.println("UnknownHostException: " + unhe.getMessage());
} catch (InterruptedIOException intioe) {
System.out.println("Timeout while attempting to establish socket connection.");
} catch (IOException ioe) {
JOptionPane.showMessageDialog(new JFrame(),"Unable to reach the server!","ERROR!",JOptionPane.ERROR_MESSAGE);
}
}
if(server != null) {
printwriter = new PrintWriter(server.getOutputStream(), true);
printwriter.println(command);
printwriter.flush();
inputstreamreader = new InputStreamReader(server.getInputStream());
bufferedreader = new BufferedReader(inputstreamreader);
return bufferedreader.readLine();
}
else
return "@serverProblem";
}
这个程序是一个简单的在线游戏。玩家的回合是通过队列创建的,当玩家通过他的回合时,服务器会发送一条广播消息,上面写着“现在是‘玩家1’回合”(例如)。我的问题是,当一个客户收到消息时,它就像在下一条消息中添加了“现在轮到‘玩家1’”的答案。在我的例子中:当一个玩家通过他的回合时,他发送“@passTurn,username”。ParallelServer类从队列中轮询它,将它放在队列的底部,发送客户端“@ok”告诉它回合已成功更改,并告诉服务器类发送广播消息。然后,当同一个客户端尝试做进一步的动作时,它会考虑“现在是‘玩家1’回合”。相反,我希望服务器和客户机一如既往地工作,当广播消息发出时,会通知客户机,而不会产生任何附带影响。
我能做什么?
谢谢。您的双向消息传递机制应该如下所示: 服务器:
Wait on any client InputStream
if (broadcast)
broadcast_message()
else
process_message()
客户:
Receiving Thread:
Wait on server broadcast
Sending Thread:
Wait on messages to be sent to server from the User Input
这应该可以做到:)
希望能有帮助。干杯 您的输出是在控制台中还是在IDE中?另外,您确定您没有看到正在缓冲的上一条消息吗?@Vern:我的输出是一个IDE。关于缓冲区,它是这样发生的:客户端发送“@passTurn”->服务器发送“@ok”->客户端接收它->服务器然后发送“@changeTurn,player1”(客户端什么也不做,因为它没有发送消息,也没有等待回答)->客户端发送“@otherAction”并读取“@changeTurn,player1”作为答案。因此,在消息交换的哪一点失败了?我希望客户端检测到“@changeTurn,player1”,但现在它无法检测到,因为它只检测到使用“sendCommand”的类的应答。每个使用它的类都会这样做:“我发送这个,然后我接收这个”。但是对于广播消息,没有“我发送这个”,因为服务器发送它时没有收到客户端的任何命令,所以没有“我接收这个”。即使我在“readAnswer”(if(…readLine().contains(“changeTurn”))中加上“if else”),也不会被检测到,因为“readAnswer”没有被任何类调用(客户端不知道将发送“@changeTurn”)。在这种情况下,听起来更像是需要更改消息传递机制。此外,您可能希望查看我在下面的回复中建议的非阻塞双向消息。太多的文本无法添加注释。我无法用这种方式编写服务器,因为广播消息不是在InputStream之后发送的。我尝试按照您的建议组织客户机,创建一个新线程来等待广播消息,但bufferedreader出错了(我的想法是在两个不同的bufferedreader上读取相同的输入流,但它不起作用)。也许我应该试着使用互斥来达到这个目的。使用一个线程来不断地监听服务器。使用if(bufferedreader.isReady())并每3秒读取一次答案,通信工作正常。无论如何,谢谢你给了我使用两个不同线程的想法!:)嘿,别担心!很高兴你能把事情办好,我也很乐意帮忙!干杯
Wait on any client InputStream
if (broadcast)
broadcast_message()
else
process_message()
Receiving Thread:
Wait on server broadcast
Sending Thread:
Wait on messages to be sent to server from the User Input