保持服务器和客户端之间的通信 - Java

时间:2014-12-17 12:54:33

标签: java sockets client server serversocket

如何使客户端能够随时向服务器发送多条消息,从而使服务器始终监听消息。

现在我写了一些代码,只允许我发送一次消息。我认为这是由于我关闭输入/输出流和套接字。所以我现在已经玩了一段时间,我似乎无法做到这一点!

客户端:

public class Client {
    private Socket socket;
    private OutputStream os;

    public Client() {}

    public void connectToServer(String host, int port) {
        try {
            socket = new Socket(host, port);
        } catch (IOException e) {
            e.printStackTrace();
        }
        sendMessage();
    }

    public void sendMessage() {
        try {
            os = socket.getOutputStream();

            String string = "Anthony";
            byte[] b = string.getBytes(Charset.forName("UTF-8"));

            os.write(b);
            os.flush();

            os.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void STOP() {
        stopOutput();
        stopServer();
    }

    public void stopServer() {
        try {
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void stopOutput() {
        try {
            os.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

服务器:

public class ConnectionHandler implements Runnable {
    private Socket clientSocket;
    private BufferedReader in;

    public ConnectionHandler(Socket clientSocket) {
        this.clientSocket = clientSocket;
        String clientAddress = clientSocket.getInetAddress().toString()
            .substring(1);
        System.out.println("Connected to " + clientAddress);

        try {
            in = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while (true) {
            try {
                ArrayList<String> data = new ArrayList<String>();
                String inputLine;
                while ((inputLine = in.readLine()) != null) {
                    data.add(inputLine);
                }

                if (data.size() > 0) {
                    System.out.println(data.toString());
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public void STOP() {
        stopInput();
        stopConnection();
    }

    public void stopInput() {
        try {
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void stopConnection() {
        try {
            clientSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

目前在客户端,我会在套接字打开后立即发送消息,但是当我从另一个类调用send函数后,它不发送...

我该怎么做?或者我做错了什么?

提前致谢。

P.S。我猜客户端服务器和服务器客户端是一样的,所以如果我知道怎样做,我可以轻松切换它...对吗?

2 个答案:

答案 0 :(得分:1)

原来这是一个简单的错误。

我作为OutputStream编写(发送客户端)但是我当时正在读取(接收服务器)作为BufferedReader!公顷

任何人都可以快速提示,确保以与发送邮件相同的方式接收邮件!

感谢所有尝试过帮助的人。

答案 1 :(得分:0)

您的服务器一直在接受数据,因此您只需要将客户端的OutputStream保存在某处并随时向其中写入数据。但是不要关闭它,因为那样你也关闭了Client套接字。

完成后,您需要更改其他内容,因为现在您调用in.readLine()会阻止您的服务器,因为它等待客户端发送内容。为了防止这种情况,您可以尝试添加发送字符串,例如&#34;关闭&#34;当你想关闭你的客户端时,到服务器,类似的东西:

public void STOP() {
    os.write("close".getBytes(Charset.forName("UTF-8")));
    stopOutput();
    stopServer();
}

并将服务器中的代码更改为

try {
    ArrayList<String> data = new ArrayList<String>();
    String inputLine;
    while (!(inputLine = in.readLine()).equals("close")) {
        data.add(inputLine);
    }

    if (data.size() > 0) {
        System.out.println(data.toString());
    }
} catch (IOException e) {
    e.printStackTrace();
}