【问题标题】:Why won't BufferedWriter write from client to server?为什么 BufferedWriter 不会从客户端写入服务器?
【发布时间】:2015-03-06 14:48:20
【问题描述】:

我正在使用线程构建客户端-服务器应用程序,但由于某种原因,BufferedWriter 不会通过套接字将数据发送到客户端。 运行客户端后,我还收到了Socket Exception: Connection Reset。 我错过了什么? 服务器:

public class Servernew {

protected String username;

protected ServerSocket serverSocket;

protected static LinkedList<ClientThreadNew> clients;

public static LinkedList<ClientThreadNew> getClients() {
    return clients;
}

public Servernew(int port) {
    try {

        serverSocket = new ServerSocket(port);

        clients = new LinkedList<ClientThreadNew>();
        System.out.println("Server is now running on port " + port);

        while (true) {

            Socket clientSocket = serverSocket.accept();

            ClientThreadNew clientThread = new ClientThreadNew(
                    clientSocket, username);

            clients.addLast(clientThread);

            clientThread.start();



        }

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

public static void main(String[] args) { 

    new Servernew(4444);
}

}

客户端线程:

public class ClientThreadNew extends Thread implements Runnable {

protected String username;

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

protected Socket clientSocket;

protected BufferedReader inFromClientB;




protected BufferedWriter outToClient;




public ClientThreadNew(Socket clientSocket, String username)
        throws IOException {

    this.clientSocket = clientSocket;
    this.username = username;



    inFromClientB = new BufferedReader(new InputStreamReader(
            clientSocket.getInputStream()));



    outToClient = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));

}

public void run() {


    try {

        while (true) {



            String incomingMessage = inFromClientB.readLine();

            if (incomingMessage != null) {


                setUsername(incomingMessage);


                outToClient.write("hii");
                outToClient.newLine();
                outToClient.flush();




            }

        }
    } catch (IOException e) {
        System.out.print(e);

    }

}

}

客户端测试:

public class ClientTesst {
private static Socket socket;
private static BufferedWriter outToServer;
private String hostname;
private int portnum;
private static BufferedReader inFromServer;

public ClientTesst(String hostname, int portnum) throws IOException {
    this.hostname = hostname;
    this.portnum = portnum;

}

public void connect() throws UnknownHostException, IOException {

    socket = new Socket(hostname, portnum);
    System.out.println("Connection Established");
}

public String listUsers() throws IOException {

    inFromServer = new BufferedReader(new InputStreamReader(
            socket.getInputStream()));
    String listOfUsers = inFromServer.readLine().toString();

    return (listOfUsers);
}

public void sendMessage(String Msg) throws IOException {



    outToServer = new BufferedWriter(new OutputStreamWriter(
            socket.getOutputStream()));
    outToServer.write(Msg);
    outToServer.newLine();
    outToServer.flush();

}

public static void main(String[] args) throws Exception {

    ClientTesst x = new ClientTesst("localhost", 4444);
    x.connect();
    x.sendMessage("client x");

    ClientTesst y = new ClientTesst("localhost", 4444);
    y.connect();
    y.sendMessage("client y");
    y.listUsers();



}

}

【问题讨论】:

  • 您是否遇到任何错误?
  • @radimpe 我得到一个“套接字异常:连接重置”
  • 考虑将您的错误日志添加到问题中(通过编辑它),您可能会得到一些反馈。确保添加尽可能多的堆栈跟踪以识别错误。
  • 不是你的问题的答案,只是为了给你指出另一个解决方案,我写了 DataFetcher 在我搞乱套接字和 InputStreams 的那一天:sourceforge.net/p/tus/code/HEAD/tree/tjacobs/io DataFetcher 使用回调工作,所以您将 DataFetcher 连接到 InputStream 并注册一个或多个 DataListener。它被构建为同步或异步工作

标签: java sockets client server


【解决方案1】:

在你的ClientTesst 班级你有这个:

private static Socket socket;
private static BufferedReader inFromServer;
private static BufferedWriter outToServer; 

由于所有这些变量都是static,这意味着两个客户端xy 将使用相同的socketoutToServerinFromServer

将此变量设为实例变量(通过删除static),以便ClientTesst 的每个实例都有其在套接字和流上。

【讨论】:

  • 我将它们更改为 private Socket socketprivate BufferedReader inFromServer 和 BufferedWriter 相同,但它仍然无法正常工作..
  • 只有我在帖子中提到的套接字异常。我尝试将BufferedWriter全部更改为PrintWriter,但仍然没有回复客户端..
  • @batteredwings 你确定服务器没有响应吗?您应该打印来自listUsers() 方法的返回值,例如:System.out.println(y.listUsers())。此外,在您的代码中,您只读取客户端 y 获得的响应,而在您的服务器代码中,客户端套接字永远不会关闭。
【解决方案2】:

以下作品-

    class ClientThreadNew extends Thread implements Runnable {   

        protected String username;
        protected Socket clientSocket;
        protected BufferedReader inFromClientB;
        protected BufferedWriter outToClient;

        public String getUsername() {
            return username;
        }

        public void setUsername(String username) {
            this.username = username;
        }

        public ClientThreadNew(Socket clientSocket, String username) throws IOException {
            this.clientSocket = clientSocket;
            this.username = username;
        }

        public void run() {
            try {
                outToClient = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
                inFromClientB = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                String incomingMessage, outgoingMessage;
                while ((incomingMessage = inFromClientB.readLine()) != null) {
                    setUsername(incomingMessage);
                    System.out.println("From client: " + incomingMessage);
                    outgoingMessage = "hii";
                    Thread.sleep(2000);
                    outToClient.write(outgoingMessage);
                    outToClient.newLine();
                    outToClient.flush();
                    System.out.println("From server: " + outgoingMessage);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

public class ClientTest {
    private Socket socket;
    private BufferedReader inFromServer;
    private BufferedWriter outToServer;
    private String hostname;
    private int portnum;

    public ClientTest(String hostname, int portnum) throws IOException {
        this.hostname = hostname;
        this.portnum = portnum;
    }    

    public void connect() throws IOException {
        socket = new Socket(hostname, portnum);
        outToServer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        inFromServer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        System.out.println("Connection Established");
    }

    public String listUsers() throws IOException {
        return inFromServer.readLine();
    }

    public void sendMessage(String Msg) throws IOException {
        outToServer.write(Msg);
        outToServer.newLine();
        outToServer.flush();
    }    

    public static void main(String[] args) throws Exception {
        ClientTest x = new ClientTest("localhost", 4444);
        x.connect();
        x.sendMessage("client x");
        String messageFromServer;
        while ((messageFromServer = x.listUsers()) != null) {
            System.out.println("From server: " + messageFromServer);
            Thread.sleep(2000);
            x.sendMessage("client x");
            System.out.println("From client: client x");
        }
    }
}

【讨论】:

  • 这仍然没有解决客户端没有收到服务器从outToClient发送的内容的问题,在这种情况下是消息“hi”。
  • @batteredwings,我只解决了套接字重置问题,但是当您现在询问客户端没有从服务器接收数据时,我已经解决了其他问题。请参阅上面的更新代码。希望对您有所帮助。
  • BufferedWriter 终于开始工作了!但是客户端和服务器正在不断地发送消息。您尝试时是否发生过这种情况?
  • 是的,因为这只是一个测试程序,其中客户端每 2 秒发送一条消息,服务器响应客户端的每条消息。如果你想改变这种行为,你可以根据你的用例改变程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-01
  • 1970-01-01
  • 2019-09-01
  • 2017-04-01
  • 2014-02-08
  • 1970-01-01
相关资源
最近更新 更多