无法将String从客户端套接字发送到服务器套接字,反之亦然

时间:2015-11-11 19:09:47

标签: java sockets

我正在尝试创建一个应用程序,它将计算单击按钮的次数。此客户端将连接到服务器,当用户单击该按钮时,它应该递增服务器上的计数器。然后,服务器应将当前的点击量发送回客户端。但那是我遇到一些问题的地方。

这是相关的客户端代码。

public void actionPerformed(ActionEvent arg0) {
            try {
                OutputStream os = socket.getOutputStream();
                OutputStreamWriter osw = new OutputStreamWriter(os);
                BufferedWriter bw = new BufferedWriter(osw);
            String target = "";
            bw.write("increment" + "\n");
            bw.flush();

            InputStream is = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String id = br.readLine();
            System.out.println("test: " + id);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });

客户停在:

String id = br.readLine();

我只想从服务器获取输出。

这是相关的服务器端代码。

public void run() {
        try {
            while (true) {
                InputStream is = socket.getInputStream();
                InputStreamReader isr = new InputStreamReader(is); //Create the input Streams
                BufferedReader br = new BufferedReader(isr);
                String input = br.readLine();
                System.out.println("got input");
                OutputStream os = socket.getOutputStream();
                OutputStreamWriter osw = new OutputStreamWriter(os);
                BufferedWriter bw = new BufferedWriter(osw);
                System.out.println("wrote to out");
                if(input.equals("increment" + "\n")) {
                    totalBets++;
                    System.out.println("inif");
                    bw.write(totalBets);    
                    System.out.println("wrote");
                    bw.flush();
                    System.out.println("flushed");
                    System.out.println("Total Bets: " + totalBets);
                }
            }
        } catch (IOException e) {
            log("Error handling client# " + clientNumber + ": " + e);
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                log("Couldn't close a socket, what's going on?");
            }
            log("Connection with client# " + clientNumber + " closed");
        }
    }

我发现它也停在这里:

String input = br.readLine();

我只是想从客户端获取bw.write(“imcrement”),因此服务器可以递增计数器,并发回总点击次数。

任何帮助?

谢谢。

2 个答案:

答案 0 :(得分:0)

您需要在客户端的套接字上设置TCP_NODELAY。默认情况下,数据将被缓冲,直到它将填满整个数据包。当缓冲区已满时,将发送数据包。但是,对于此协议,您希望立即发送数据,以便服务器可以响应。

我在测试和调试网络代码时经常使用wireshark。它将准确显示发送和接收的数据包。 (请注意,在Windows上,您无法从环回接口捕获;这是Windows的限制,不适用于其他系统)

答案 1 :(得分:0)

您正在使用BufferedWriter.write(int)撰写totalBets值。

将值解释为单个字符。因此,例如,如果totalBets为65,则会写入字符'A'

此外,它不会添加换行符。因此客户端读取'A'但尝试读取更多字符,因为它试图读取整行。请记住,您必须编写来读取行。

因此,您应该将编写totalBets的部分替换为:

bw.write(String.valueOf(totalBets));
bw.newLine();

另外请记住,正如我在评论中指出的那样,你必须用\n(或者最好是BufferedWriter.newLine())来写一行,但是当你读到另一边的那一行时,该行分隔符被剥离,所以你应该比较你期望的字符串而不用 \n