2012-12-18 59 views
0

非常简单我想创建一个聊天室,接受多个客户端,所有客户端都可以分配自己的ID。每当他们输入任何东西时,它都会发送给所有用户。目前,我有一个回显客户端服务器,客户端输入内容并回显。我的第一个问题是如何让用户给自己一个用户名?显然我需要一个接受名称的变量,你推荐我把它放在什么类中?我怎么会得到这个名字本身像 if (theInput.equalsIgnoreCase("username" : "“))简单的java聊天室

然后,我需要做的是回应客户说什么,所有的客户端。我不知道如何做到这一点,所以任何意见虽然我在网上发现了一些教程和示例代码,但是我不明白它,如果我不明白即使它工作正常,我也不习惯使用它。我的代码: EchoClient

'// echo client 
import java.util.Scanner; 
import java.io.*; 
import java.net.*; 
public class EchoClient { 
public static void main(String[] args) throws IOException { 
    Socket echoSocket = null; 
    //PrintWriter socketOut = null; 
    try { 
     echoSocket = new Socket("127.0.0.1", 4444); // connect to self at port 4444 
     System.out.println("Connected OK"); 
     Scanner socketIn = new Scanner(echoSocket.getInputStream()); // set up input from socket 
     PrintWriter socketOut = new PrintWriter(echoSocket.getOutputStream(), true); // set up output to socket 
     Scanner kbdIn = new Scanner(System.in);  // Scanner to pick up keyboard input 
     String serverResp = ""; 
     String userInput = kbdIn.nextLine();  // get input from the user 

     while (true) { 
      socketOut.println(userInput);     // send user input to the socket 
      serverResp = socketIn.nextLine();  // get the response from the socket 
      System.out.println("echoed back: " + serverResp); // print it out 
      if (serverResp.equals("Closing connection")) { break; } //break if we're done 
      userInput = kbdIn.nextLine(); // get next user input 
     } 
     socketOut.close(); 
     kbdIn.close(); 
     socketIn.close(); 
    } 
    catch (ConnectException e) { 
     System.err.println("Could not connect to host"); 
     System.exit(1); 
    } 
    catch (IOException e) { 
     System.err.println("Couldn't get I/O for connection"); 
     System.exit(1); 
    } 
    echoSocket.close(); 
} 

}”

EchoServer的

// multiple (threaded) server 
import java.net.ServerSocket; 
import java.net.Socket; 
public class EchoServerMult { 
public static void main(String[] args) throws Exception { 
    ServerSocket serverSocket = new ServerSocket(4444); // create server socket on this machine 
    System.err.println("Started server listening on port 4444"); 
    while (true) {  // as each connection is made, pass it to a thread 
     //new EchoThread(serverSocket.accept()).start(); // this is same as next 3 lines 
     Socket x = serverSocket.accept(); // block until next connection 
     EchoThread et = new EchoThread(x); 
     et.start(); 
     System.err.println("Accepted connection from client"); 
    } 
} 

}

EchoThread

// thread to handle one echo connection 
import java.net.*; 
import java.io.*; 
import java.util.Scanner; 
public class EchoThread extends Thread { 
private Socket mySocket = null; 

public EchoThread(Socket socket) {  // constructor method 
    mySocket = socket; 
} 
public void run() { 
    try { 
     PrintWriter out = new PrintWriter(mySocket.getOutputStream(), true); 
     Scanner in = new Scanner(mySocket.getInputStream()); 
     String inputLine; 
     while (true) { 
      inputLine = in.nextLine();  
      if (inputLine.equalsIgnoreCase("Bye")) { 
       out.println("Closing connection"); 
       break;  
      } else { 
       out.println(inputLine); 
      } 
     } 
     out.close(); 
     in.close(); 
     mySocket.close(); 
    } catch (Exception e) { 
     System.err.println("Connection reset"); // bad error (client died?) 
    } 
} 

}

+1

嗨 - 1)我不确定这只是一个“有趣的实验”,一项家庭作业......或者如果您真的想创建一个人们可以使用的聊天室。如果是后者,我强烈建议你考虑编写一个Web应用程序:例如,使用Tomcat和.jsp。 2)问:“回应客户对所有客户说的话?”答:为每个客户创建一些“列表”。至少需要a)用户名和b)IP地址或套接字。 – paulsm4

回答

2

最简单的很可能是拥有所有的客户端连接到一个公共类(当它们是创建)使用observer pattern。该链接甚至给出了一些java代码。

要让客户端拥有用户名,最简单的办法就是让服务器发送的第一条消息是“输入所需的用户名:”,然后按照原样返回值。否则,您可以使用inputLine.substring(int)username:{username}获取用户名。您可以在EchoThread中存储用户名。避免重复的用户名需要您在EchoServer中存储一组用户名。然后您可以将该用户名与消息一起传递给Observable类。

当前您的程序使用顺序消息传递,如在客户端和服务器中发送消息(更具体地说,客户端发送消息,然后服务器发送相同的消息)。您需要更改此设置,以便客户可以随时接收消息。您可以通过在客户端创建一个只发送或接收的线程(并在客户端执行另一个线程)来完成此操作。在客户端:

... 
System.out.println("Connected OK"); 
PrintWriter socketOut = new PrintWriter(echoSocket.getOutputStream(), true); // set up output to socket 
new ReceiverThread(echoSocket).start(); 
while (true) 
{ 
    String userInput = kbdIn.nextLine();  // get input from the user 
    socketOut.println(userInput);     // send user input to the socket 
} 
... 

ReceiverThread run方法里面try ... catch:(其余的看起来与EchoThread)

Scanner in = new Scanner(mySocket.getInputStream()); 
while (true) 
{ 
    String inputLine = in.nextLine();  
    if (inputLine.equalsIgnoreCase("Bye")) 
    { 
     out.println("Closing connection"); 
     System.exit(0);  
    } 
    else 
    { 
     out.println(inputLine); 
    } 
} 

System.exit()的可能不是最好的主意,但是这仅仅是给你一些想法做什么。