有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在开发一个简单的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

共 (1) 个答案

  1. # 1 楼答案

    您的客户机代码主要是错误的:main()启动、连接、读取来自服务器的一行输入,然后退出,而从未向服务器写入任何内容或要求用户输入任何输入

    你的服务器应该更优雅地处理客户端终止;服务器明显更难理解,但在您接受客户端输入的每个地方,您都应该准备好处理表明客户端已断开连接的异常,而不是礼貌地要求断开连接。(这种情况经常发生;机器重新启动,路由器死亡。手机覆盖率下降……)当出现异常时,您的代码应该确定哪个客户端负责,并将其从连接列表中删除