聊天客户端未连接到服务器

问题描述:

我正在研究一个简单的Java聊天服务器。我已经完成了服务器,现在我试图让我的客户端连接。到目前为止,它没有连接和给服务器端的错误,我不知道有关网络编程的很多内容,但客户端应该通过键入java <ChatClient> <IP> <Port>进行连接,而且这种方式看起来像是他们说得不对。我知道服务器的工作原理是因为我一直在TELNET进行测试。有没有人有什么建议?聊天客户端未连接到服务器

服务器输出

Server Started... 
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 javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import static java.lang.System.out; 

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

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 

// inner class for Messages Thread 
class MessagesThread extends Thread { 
    public void run() { 
     String line; 
     try { 
      while(true) { 
       line = input.readLine(); 

      } // end of while 
     } catch(Exception ex) {} 
    } 
} 
} // end of client 

聊天服务器

// Chat Server runs at port no. 9020 
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; 
        } 
      else if("get".equals(line)){ 
       output.println(buffer.toString()); 
      } 
      else if("getNames".equals(line)){ 
       output.println(users.toString()); 
      } 
      //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("get: receives a response of the entire chat buffer"); 
       output.println("help: lists the commands and their syntax"); 
       output.println("name: receives a response of \"OK\" and adds the name to a list"); 
      } 
      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("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 

} // end of Server 

你的CLIE nt代码大部分出现故障:main()启动,连接,从服务器读取一行输入,然后退出,而无需向服务器写入任何内容或要求用户键入任何输入。

您的服务器处理客户端终止更优雅;服务器显著很难理解,但每一个地方,你接受客户端输入你应该准备处理异常,表示客户端的地方已经断开无礼貌足以的脱节。 (这种情况一直发生,机器重新启动,路由器死机,单元覆盖范围失效......)当引发异常时,您的代码应该确定哪个客户端负责并将它们从连接列表中删除。