(客户端 - 服务器)当服务器的serversocket接受客户端时Java控制不起作用

时间:2014-02-26 04:16:15

标签: java sockets client-server serversocket

我目前正在学习套接字,我的作业是创建一个聊天室,让多个客户可以自由交谈。老师给出的提示是,当客户端尝试发送消息时,聊天室服务器只接受客户端。这项功课应该在不使用线程的情况下完成。

根据提示,我尝试在客户端和服务器代码中创建未绑定的ServerSocket和Socket。关键的想法是,当客户端尝试向服务器发送消息时,客户端代码将连接未绑定的Socket,然后触发服务器连接未绑定的ServerSocket并接受客户端。

但是,当我运行代码时,服务器和客户端代码都在运行,他们声称所有连接都已建立,但我根本无法在客户端和服务器之间传输消息。

我试过在线寻找答案,但我找不到任何答案。我想询问我决定服务器何时接受客户端的方式是否正确。

我的ChatRoom服务器:

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

        int portNum = 4321;

        ServerSocket serverSocket = new ServerSocket();

        int count = 1;

        while (true) {

            // redeclare everything each round
            Socket socket = null;
            PrintWriter out = null;
            BufferedReader in = null;
            BufferedReader stdIn = null;
            String inputLine = null;

            // accept each time round
            serverSocket.bind(new InetSocketAddress(portNum));
            socket = serverSocket.accept();
            System.out.println("newly accepted!");

            out = new PrintWriter(socket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            stdIn = new BufferedReader(new InputStreamReader(System.in));

            if (!((inputLine = in.readLine()).equals("Bye"))) {
                System.out.println("Client says: " + inputLine);
                out.println(stdIn.readLine());
                out.flush();

                System.out.println("Message Count: " + count);
                count++;
            }
            else {
                out.println(inputLine);
                serverSocket.close();
                socket.close();
                out.close();
                in.close();
            }
        }
    }   
}

我的ChatRoomClient:

public class ChatRoomClient {
    public static void main(String[] args) throws Exception {
        String hostName = "localhost";
        int portNumber = 4321;

        Socket echoSocket = new Socket();   // creates an unbound socket

        PrintWriter out = null;
        BufferedReader in = null;
        BufferedReader stdIn = null;

        String userInput;
        do {
            out = null;
            in = null;
            stdIn = null;

            // each time round the unbound socket attempts to connect to send a message
            echoSocket.connect(new InetSocketAddress(hostName, portNumber));
            System.out.println("successfully connected");
            out = new PrintWriter(echoSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
            stdIn = new BufferedReader(new InputStreamReader(System.in));

            userInput = stdIn.readLine();
            out.flush();
            System.out.println("Server says: " + in.readLine());
        }
        while (!userInput.equals("Bye"));

        // close everything
        echoSocket.close();
        in.close();
        stdIn.close();
    }
}

谢谢!

3 个答案:

答案 0 :(得分:0)

啊......没有为服务器使用线程,您将无法为多个客户端提供服务。无论如何,您当前的代码存在问题,而且您的逻辑不正确。

  • 你的stdIn应该在循环之外声明和实例化,你不需要继续为每个循环创建stdIn对象。
  • 您的“in”套接字accept()和echoSocket.connect()也应该在循环之外,这就是为什么您没有从服务器获得任何答案,因为您没有在同一行上收听。这就像你的手机一样,每次都要用FLASH拨打新号码。所有都指向同一台服务器,但它是不同的连接。

因此,我们的想法是在服务器和客户端之间建立连接(单一连接),这种连接可以双向通信(通过输入和输出流)。然后你可以循环和谈话开始与客户端,然后服务器接收,然后服务器谈话,然后客户端接收然后客户端谈话....直到客户说再见......

了解更多:http://ta.cnci.org/basicirc

答案 1 :(得分:0)

  

老师提供的提示是聊天室服务器仅在客户端尝试发送消息时才接受客户端。这项功课应该在不使用线程的情况下完成。

老师给出的暗示没有意义。客户端必须连接,然后服务器接受。如果没有先连接,客户端就无法发送消息。也许老师真的意味着客户端在有东西发送之前不应该连接?

  

根据提示,我尝试在客户端和服务器代码中创建未绑定的ServerSocket和Socket。关键的想法是,当客户端尝试向服务器发送消息时,客户端代码将连接未绑定的Socket,然后触发服务器连接未绑定的ServerSocket并接受客户端。

但这不会发生。不可能。如果您尝试连接到未侦听的端口,您将获得ConnectException.将端口置于侦听状态的唯一方法是绑定ServerSocket.没有神奇的后门服务器可能知道客户端想要连接,所以它现在应该进行绑定。

  

这项功课应该在不使用线程的情况下完成。

除非您需要使用非阻塞I / O,或滥用available()工具或使用每封邮件的连接,否则无法“创建一个多个客户端可以自由交谈的聊天室”但是我不知道如何将一个客户的消息传达给其他客户,除非你被允许批量处理。

你所描述的这项任务有太多无法估量的方面。提出的问题并不合理,而您提出的解决方案肯定不会。您应该继续以正常方式编写程序,包括连接,接受和一些I / O.在老师提出澄清的同时让它工作。

答案 2 :(得分:0)

以为我想更新,我设法在不使用线程的情况下解决了我的问题。只是套接字哈哈。认为发布我的答案以供参考是好的。

我的ChatRoom服务器:

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

        ServerSocket serverSocket = new ServerSocket(4321);

        while(true) {
            Socket clientSocket = serverSocket.accept();

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

            String inputLine = in.readLine();

            System.out.println("Client says: " + inputLine);

            in.close();
            clientSocket.close();

        }       

    }   
}

我的ChatRoom客户端:

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

        String hostName = "localhost";
        int portNum = 4321;

        BufferedReader stdIn = new BufferedReader
                                   (new InputStreamReader(System.in));

        while (true) {

            String userInput;

            userInput = stdIn.readLine();

            Socket echoSocket = new Socket(hostName, portNum);

            PrintWriter out = new PrintWriter
                                      (echoSocket.getOutputStream(), true);

            out.println(userInput);
            out.flush();

            out.close();
            echoSocket.close();

            if (userInput.equals("Bye")) {
                stdIn.close();
                break;
            }
        }

    }
}