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

标签 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();
        }
    }
}

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

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

提前致谢。

附:我猜客户端-服务器与服务器-客户端相同,所以如果我知道如何做一种方式,我可以轻松地切换它......对吗?

最佳答案

事实证明这是一个简单的错误。

我将(发送客户端)写为OutputStream,但是然后我将(接收服务器)读为BufferedReader!公顷

对于任何人来说,这是一个快速提示,请确保您以发送消息的方式接收消息!

感谢所有尝试提供帮助的人。

关于java - 保持服务器和客户端之间的通信畅通 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27526116/

相关文章:

delphi - Soap Delphi 客户端因 1MB 调用超时而结束

C语言,使用结构体从客户端向服务器端发送数据

java - 如何从 vector 中获取特定索引的值?

java - 文件传输后保留文件名

java - Apache Mina,如何检测何时使用无效套接字向客户端发送消息?

perl客户端到服务器文件发送,反之亦然使用套接字

java - 在 Docker 容器上开发 Java (Maven) 应用程序

java - 双击 : zoom on Android MapView?

java - 选择不能在任何服务器上运行

java - JAX-WS 客户端 : what's the correct path to access the local WSDL?