2012-01-28 213 views
0

我正在修改关于如何创建接受多个客户端的TCP聊天服务器的教程。我最终还会创建一个客户端类,但到目前为止,我正在使用TELNET进行测试。TCP聊天服务器

我希望服务器不断检查输入,以便我可以使用关键字预先形成服务器功能。因此,字符串单词“EXIT”断开客户端和字符串单词“Name:”以打印“OK”。

这是我在想什么,但它不工作:

public void run() 
    { 
     String line; 
     try  
     { 
      while(true) 
      { 
       if (input.readline("EXIT"))//Should close and remove client 
       { 
        clients.remove(this); 
        users.remove(name); 
        break; 
       } 
       if(input.readline("Name:"))//Should print OK with username 
       { 
        System.out.println("OK"); 
       } 
       boradcast(name,line); // method of outer class - send messages to all 
      }// end of while 
     } // try 
     catch(Exception e) 
     { 
      System.out.println(e.getMessage()); 
     } 
    } // end of run() 
} 

}

这里是整个服务器类

// Chat Server runs at port no. 9020 
import java.io.*; 
import java.util.*; 
import java.net.*; 
import static java.lang.System.out; 

public class TCPServer 
{ 
    Vector<String> users = new Vector<String>(); 
    Vector<HandleClient> clients = new Vector<HandleClient>(); 

    int PORT = 9020; 
    int NumClients = 10; 

    public void process() throws Exception 
    { 
     ServerSocket server = new ServerSocket(PORT,NumClients); 
     out.println("Server Connected..."); 
     while(true) 
     { 
     Socket client = server.accept(); 
     HandleClient c = new HandleClient(client); 
     clients.add(c); 
    } // end of while 
    } 

    public static void main(String ... args) throws Exception 
    { 
     new TCPServer().process(); 
    } // end of main 

    public void boradcast(String user, String message) 
    { 
     // send message to all connected users 
     for (HandleClient c : clients) 
      if (!c.getUserName().equals(user)) 
      { 
       c.sendMessage(user,message); 
      } 
    } 

    class HandleClient extends Thread 
    { 
    String name = ""; 
    BufferedReader input; 
    PrintWriter output; 

    public HandleClient(Socket client) throws Exception 
    { 
      // get input and output streams 
     input = new BufferedReader(new InputStreamReader(client.getInputStream())) ; 
     output = new PrintWriter (client.getOutputStream(),true); 
     output.println("Welcome to Bob's Chat Server!\n"); 
     // read name 
     output.println("Please Enter a User Name: "); 
     name = input.readLine(); 
     users.add(name); // add to vector 
     output.println("Welcome "+name+" we hope you enjoy your chat today"); 
     start(); 
    } 

    public void sendMessage(String uname,String msg) 
    { 
     output.println(uname + ":" + msg); 
    } 

    public String getUserName() 
    { 
     return name; 
    } 

    public void run() 
    { 
     String line; 
     try  
     { 
      while(true) 
      { 
       if (input.readline("EXIT")) 
       { 
        clients.remove(this); 
        users.remove(name); 
        break; 
       } 
       if(input.readline(name)) 
       { 
        System.out.println("OK"); 
       } 
       boradcast(name,line); // method of outer class - send messages to all 
      }// end of while 
     } // try 
     catch(Exception e) 
     { 
      System.out.println(e.getMessage()); 
     } 
    } // end of run() 
    } // end of inner class 
} // end of Server 
+0

请根据“*不起作用*”进行展开。编译错误?运行时错误?意外的功能? (你看到什么,与你期望的是什么?) – ziesemer 2012-01-28 19:48:03

+0

现在,这是我编译时得到的结果: TCPServer.java:79:找不到符号 symbol:method readline(java.lang.String ) 位置:类java.io.BufferedReader中 \t \t如果(input.readline( “EXIT”)) \t \t^ TCPServer.java:85:找不到符号 符号:方法的ReadLine(java.lang.String中) 位置:类java.io.BufferedReader中 \t \t如果(input.readline( “姓名:”)) \t \t^ 2错误 – user1174834 2012-01-28 19:57:03

+0

您应该使用“WebSockets”代替聊天服务器。这是现代化的做法。 – djangofan 2012-01-28 20:01:33

回答

3

不知道到底是什么你希望在输入行等于当前用户名时执行此操作,我认为这更多你要找的是什么:

public void run(){ 
     try{ 
      while(true){ 
       String line = input.readLine(); 

       if("EXIT".equals(line)){ 
        clients.remove(this); 
        users.remove(name); 
        break; 
       }else if(name.equals(line)){ 
        System.out.println("OK"); 
       } 
       boradcast(name, line); // method of outer class - send messages to all 
      }// end of while 
     } // try 
     catch(Exception e){ 
      System.out.println(e.getMessage()); 
     } 
    } // end of run() 

这解决的几个问题:

  • input.readline不是方法,而是input.readLine是 - 它不接受任何参数。 (这应该显示为一个编译错误。)
  • 你从来没有分配任何东西给line字符串。
  • 您正在多次阅读该行。如果它与“EXIT”不匹配,您将读取一条新行,与name进行比较 - 无论用户输入的是上一行。
+0

谢谢,这有很大的帮助。我试图使用input.readLine我想我输入错了。 – user1174834 2012-01-28 21:07:40