Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java,使用套接字连接发送消息时出现问题_Java_Sockets_Client_Message - Fatal编程技术网

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

我的Java程序有问题。它在服务器和许多客户端之间有一个套接字连接。以下是服务器(与问题有关的部分):

这是客户:

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