无法使用套接字

时间:2016-03-03 21:25:11

标签: java sockets client-server tcp-ip

我正在制作一个客户端 - 服务器应用程序,并使用以下代码来交换服务器和客户端的数据。

服务器的发送和接收代码:

public void run() {
     try {
        BufferedReader input = new BufferedReader(new InputStreamReader(socketNew.getInputStream()));
        String message=input.readLine();
        while(message.length()!=0)
        {
            for(Socket s:socs) //socs is a list containing all the connected sockets
            {
                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
                writer.write(message);
            }
        }

     } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

  }

客户端的发送方式:

private void send_data() {

    BufferedWriter writer;
    try {
        writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        writer.write(this.name+textField.getText());
        textField.setText("");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

客户的接收方式:

public  void receive_data(){
    BufferedReader input;
    try {
        input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String message=input.readLine();
        while(message.length()!=0)
        {console(message);}
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

我没有与服务器和客户进行任何数据交换。有人可以帮我吗?

2 个答案:

答案 0 :(得分:3)

您正在遭受缓冲:消息写入缓冲区,可能永远不会发送。刷新编写器以确保它发送数据:

    writer.write(...);
    writer.flush();

此外,BufferedReader.readLine读取行。必须使用换行符终止行,例如\n。您是否发送换行符并不清楚。

此外,这是一个无限循环:

    String message=input.readLine();
    while(message.length()!=0) {
        /* code that does not modify message */
    }

答案 1 :(得分:1)

不要继续创造新的读者和作家。在插座的使用寿命中使用相同的插座。您丢失了旧的BufferedReader中丢失的数据。这些缓冲的东西,错误,缓冲。

还有:

String message=input.readLine();
while(message.length()!=0)

是,错误,胡说八道。首先,您没有检查message null,因此您将在流的末尾获得NullPointerException。其次,你没有在循环中做任何进一步的输入,所以如果它不抛出NPE并且消息不是零长度它将永远循环。