2014-02-26 50 views
-1

目前我正在学习有关插座和我的家庭作业是创建一个聊天室,多个客户端可以自由交谈控制。老师给出的提示是聊天室服务器只在客户端试图发送消息时才接受客户端。这个作业应该不用线程完成。(客户端 - 服务器)的Java服务器时的的ServerSocket接受客户机不能正常工作

下面给出的提示,我试图在客户端和服务器代码都创建未绑定的ServerSocket和Socket。关键的想法是,当客户端尝试向服务器发送消息时,客户端代码将连接未绑定的套接字,然后该套接字将触发服务器连接未绑定的ServerSocket并接受客户端。

然而,当我运行的代码,同时在服务器和客户端代码运行,他们要求所有的连接完成,但我无法传输客户端和服务器都之间的消息。

我尝试过在网上找到答案,但找不到任何答案。我想问一下,如果我决定服务器何时接受客户端的方式是正确的。

我的聊天室服务器:

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

谢谢!

+0

有一些事情是错的/不在你的代码中有很多意义。也许[Oracle教程显示如何做到这一点](http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html)将是一个很好的开始。 –

+0

谢谢!这是一个很好的教程,我会翻阅。但是,是否有可能不使用线程呢? – Imma

+0

@Imma线程是迄今为止最方便的方法。有可能*不使用线程。如果您一次有数百个连接,您将遇到线程的性能问题,并且必须以其他方式执行此操作,但是如果您没有多个连接,则只需使用线程即可。 – immibis

回答

0

老师给出的提示是聊天室服务器只在客户端试图发送消息时才接受客户端。这个作业应该不用线程完成。

老师给出没有意义的暗示。客户端必须连接,然后服务器才能接受。客户端无法先发送消息而无法连接。也许老师真的意味着客户不应该连接,直到他有东西要发送?

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

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

这个家庭作业应该是没有使用线程。

不可能“创建一个聊天室,多个客户端可以自由交谈”这样一来,除非你预计将使用非阻塞I/O,或滥用available()设施,或使用每封邮件的连接,但那么我不知道如何将一个客户端的消息传达给其他客户端,除非您允许将它们批量处理。

如你所描述的,这个任务有太多无法估量的方面。提出的问题不具有实际意义,您提出的解决方案当然不适用。您应该继续以正常方式编写程序,包括连接,接受和一些I/O。在老师提出澄清时让它工作。

+0

谢谢!我想我对这个问题有一些误解haha – Imma

0

啊......对于使用线程的服务器出你将不能够服务于多个客户端。无论如何,你目前的代码有问题,你的逻辑是不正确的。

  • 你的标准输入应申报和循环之外实例化,你并不需要不断创造每个循环的标准输入对象。
  • 你“在”插座接受()和echoSocket.connect()也应循环之外,这就是为什么你不是因为你是不是在同一条线上收听从服务器得到任何答复。这就像你的手机,每次都要在FLASH上拨打新号码。所有指向同一台服务器,但它是不同的连接。

所以,这个想法是建立一个服务器和客户端(单一连接),可以通过双向(通过输入和输出流)沟通的连接。然后你就可以循环和说话开始与客户端,然后服务器接收,然后服务器交谈,然后客户端收到然后客户交谈....直到客户说再见......

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

0

以为我想更新,我设法解决我的问题,而不使用线程。只是套接字哈哈。认为这将是很好的张贴我的参考答案..

我的聊天室服务器:

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(); 

     }  

    } 
} 

我的聊天室客户:

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; 
      } 
     } 

    } 
} 
+0

这是一个聊天系统吗? “多个客户可以自由交谈”在哪里?不。 – EJP

+0

Yupp,这是一个在控制台上运行的聊天系统。我不认为这是一个真正的聊天系统,因为我被告知要多次运行客户端文件来模拟连接到服务器的多个客户端 – Imma