Java聊天客户端和服务器

问题描述:

我写了一个与telnet协同工作的聊天服务器。我写了一个客户端连接到服务器。在终端中,我通过给它提供文件的名称和IP地址和端口来运行客户端。这似乎连接,因为它关闭服务器,并出现以下错误:Java聊天客户端和服务器

Connection reset 
    Exception in thread "main" java.net.SocketException: Connection reset 
     at java.net.SocketInputStream.read(SocketInputStream.java:130) 
     at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:282) 
     at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:324) 
     at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:176) 
     at java.io.InputStreamReader.read(InputStreamReader.java:184) 
     at java.io.BufferedReader.fill(BufferedReader.java:153) 
     at java.io.BufferedReader.readLine(BufferedReader.java:316) 
     at java.io.BufferedReader.readLine(BufferedReader.java:379) 
     at ChatServer$HandleClient.<init>(ChatServer.java:47) 
     at ChatServer.process(ChatServer.java:18) 
     at ChatServer.main(ChatServer.java:23) 

我聊天服务器的代码是:

import java.io.*; 
    import java.util.*; 
    import java.net.*; 
    import static java.lang.System.out; 

    public class ChatServer { 
     ArrayList<String> users = new ArrayList<String>(); 
     ArrayList<String> buffer = new ArrayList<String>(); 
     ArrayList<HandleClient> clients = new ArrayList<HandleClient>(); 
     Socket client; 

     public void process() throws Exception { 
      ServerSocket server = new ServerSocket(9020,10); 
      out.println("Server Started..."); 
      while(true) { 
      client = server.accept(); 
      HandleClient c = new HandleClient(client); 
      clients.add(c); 
     } // end of while 
     } 
     public static void main(String ... args) throws Exception { 
      new ChatServer().process(); 
     } // end of main 

     public void bc(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 
     start(); 
     input = new BufferedReader(new InputStreamReader(client.getInputStream())) ; 
     output = new PrintWriter (client.getOutputStream(),true); 
     output.println("Welcome to Kimberly's Chat room"); 
     // receives the name of the client 
     output.println("Enter your name: "); 
     // read name of the client 
     name = input.readLine(); 
     users.add(name); // adds the name of the client to the vector 
     output.println("Thanks for joining " + name + ". If you need help, type \"help\" for a list of commands."); 
     //start(); 
      } 

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

      public String getUserName() { 
       return name; 
      } 

     public String toString() { 
       return name; 
      } 

      public void run() { 
       String line; 
      try { 
        while(true) { 
       line = input.readLine(); 
       String[] temp; 
       temp = line.split(":"); 
        //checks different input from the client 
       //checks to see if the client wants to terminate their connection 
       //removes the client's name from the list 
       if ("adios".equals(line)){ 
        output.println("Server closing connection..."); 
        clients.remove(this); 
        users.remove(name); 
        break; 
         } 
       //checks to see if the client typed in help to receive a list of the commands 
       else if("help".equals(line)){ 
        output.println("Here is a list of user commands:"); 
        output.println("adios: exit"); 
        output.println("help: lists the commands and their syntax"); 
        output.println("get: receives a response of the entire chat buffer"); 
        output.println("name: receives a response of \"OK\" and adds the name to a list"); 
       } 
       else if("getNames".equals(line)){ 
        output.println(users.toString()); 
       } 
       else if("name".equals(temp[0])){ 
        users.add(temp[1]); 
        output.println("OK"); 
       } 
       else if("push".equals(temp[0])){ 
        buffer.add(name + ":" + temp[1]); 
        output.println("OK"); 
       } 
       else if("get".equals(line)){ 
        output.println(buffer.toString()); 
       } 
       else if("test".equals(temp[0])){ 
        output.println(temp[1].toString()); 
       } 
       else{ 
        bc(name,line); // method of outer class - send messages to all 
       } 
       } // end of while 
      } // try 
      catch(Exception e) { 
       System.out.println(e.getMessage()); 
      } 
      try{ 
      client.close(); 
      } 
      catch(Exception e) { 
       System.out.println(e.getMessage()); 
      } 
      } // end of run() 
     } // end of inner class 
} 

我的客户端代码:

public class ChatClient { 
    PrintWriter output; 
    BufferedReader input; 
    Socket client; 

    public ChatClient(String ip, int port) throws Exception { 
    client = new Socket(ip,port); 
    input = new BufferedReader(new InputStreamReader(client.getInputStream())) ; 
     output = new PrintWriter(client.getOutputStream(),true); 

    } 

    public static void main(String args[]) { 
     try { 
     String ip= args[0]; 
     int port= Integer.parseInt(args[1]); 
      new ChatClient(ip,port); 
     } catch(Exception ex) { 
      out.println("Error --> " + ex.getMessage()); 
     } 

    } // end of main 

添加

input.readLine(); 

给你的将数据发送到服务器后的ChatClient类

+0

好的。它不会崩溃,但我得到这个:“服务器启动... 空”服务器没有发送提示给客户输入他们的名字。 – user1179027 2012-01-31 20:38:55

+0

你解决了这个问题吗? – 2013-03-29 05:22:16