每当我想从聊天服务器发送数据时,是否应该重新打开套接字I / O流?

时间:2018-10-20 07:27:04

标签: java sockets server inputstream outputstream

我最近开始学习android,目前正在edx.org学习Java基础知识。我正在创建一个聊天应用程序(客户端/服务器)。现在,我要做的就是在任何新用户连接时向所有用户显示“用户已连接”消息。我将每个用户的输出流保存在ArrayList中。

1-可以吗?我应该存储完整的套接字吗?

第二,起初我的服务器端代码如下

    int serverPort = 11223;
    List<PrintWriter> clientsOut = new ArrayList<PrintWriter>();
    ServerSocket serverSocket = new ServerSocket(serverPort);
    System.out.println("Listening...");
    while(true) {
        try (
            Socket clientSocket = serverSocket.accept();
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
        )
        {
            out.println("Hello from server");
            clientsOut.add(out);
            String ID = clientSocket.getInetAddress().getHostName();
            for (PrintWriter client : clientsOut)
            {
                client.println("user(" + ID + ") : connected");
            }

        } catch (Exception e) {
            System.out.print("ERROR : " + e.getMessage());
        }

我意识到除了新连接的客户端之外,没有人收到有关自己已连接的消息。问题是输出流被关闭,因为它们在( )之后的圆括号try中声明try块之后会自动关闭它们。

我只是将放在方括号中的代码放在try的花括号中,并且一切正常,但是我始终保持打开状态连接所有用户的输出流。

2-可以吗?循环阵列以发送消息时,是否应该重新打开每个连接的客户端的IO流?

谢谢

0 个答案:

没有答案