当前位置: 动力学知识库 > 问答 > 编程问答 >

java - Chat Client not Connecting to Server

问题描述:

I am working on a simple Java chat server. I have the server completed and now I'm trying to get my client to connect. So far its not connecting and giving errors on the server side I don't know a whole lot about network programming but the client is supposed to connect by typing java <ChatClient> <IP> <Port>, and that works it just looks like they are not talking correctly. I know the server works because I have been testing in TELNET. Does anyone have any suggestions?

SERVER OUTPUT

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)

CHAT CLIENT

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

// 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

网友答案:

Your client code is mostly at fault: main() starts, connects, reads a single line of input from the server, then quits without ever writing any content to the server or asking the user to type in any input.

Your server should handle client termination more gracefully; the server is significantly harder to understand, but every place where you accept client input you should be prepared to handle an exception that indicates a client has disconnected without being polite enough to ask for a disconnect. (This happens all the time; machines reboot and routers die. Cell coverage goes dead...) When an exception is raised, your code should figure which client is responsible and remove them from the connected lists.

分享给朋友:
您可能感兴趣的文章:
随机阅读: