聊天客户端未连接到服务器
问题描述:
我正在研究一个简单的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()
启动,连接,从服务器读取一行输入,然后退出,而无需向服务器写入任何内容或要求用户键入任何输入。
您的服务器处理客户端终止更优雅;服务器显著很难理解,但每一个地方,你接受客户端输入你应该准备处理异常,表示客户端的地方已经断开无礼貌足以问的脱节。 (这种情况一直发生,机器重新启动,路由器死机,单元覆盖范围失效......)当引发异常时,您的代码应该确定哪个客户端负责并将它们从连接列表中删除。