Running a Client-Server Chat program

This is one of the most common application scenario that can be found all over the net. and I'm not asking any questions about the java codes that I did because I was successful in running it on my laptop where both the client and server part of the .java file resides. Rather I have had problem getting it to work in between two computers. I tried establishing physical connection using cross-over cable to connect two computers, and did a test to see if file transfers successfully and it did, however, keeping one Server part of the .java file in one computer and client part in the other, I tried to run the server first and then the client but it got a "access denied" error. For reference here's my two .java files: /* */ import; import; import; import; import; import; public class ChatClient { private static int port = 5000; /* port to connect to */ private static String host = "localhost"; /* host to connect to (server's IP)*/ private static BufferedReader stdIn; private static String nick; /** * Read in a nickname from stdin and attempt to authenticate with the * server by sending a NICK command to @out. If the response from @in * is not equal to "OK" go bacl and read a nickname again */ private static String getNick(BufferedReader in, PrintWriter out) throws IOException { System.out.print("Enter your nick: "); String msg = stdIn.readLine(); out.println("NICK " + msg); String serverResponse = in.readLine(); if ("SERVER: OK".equals(serverResponse)) return msg; System.out.println(serverResponse); return getNick(in, out); } public static void main (String[] args) throws IOException { Socket server = null; try { server = new Socket(host, port); } catch (UnknownHostException e) { System.err.println(e); System.exit(1); } stdIn = new BufferedReader(new InputStreamReader(; /* obtain an output stream to the server... */ PrintWriter out = new PrintWriter(server.getOutputStream(), true); /* ... and an input stream */ BufferedReader in = new BufferedReader(new InputStreamReader( server.getInputStream())); nick = getNick(in, out); /* create a thread to asyncronously read messages from the server */ ServerConn sc = new ServerConn(server); Thread t = new Thread(sc); t.start(); String msg; /* loop reading messages from stdin and sending them to the server */ while ((msg = stdIn.readLine()) != null) { out.println(msg); } } } class ServerConn implements Runnable { private BufferedReader in = null; public ServerConn(Socket server) throws IOException { /* obtain an input stream from the server */ in = new BufferedReader(new InputStreamReader( server.getInputStream())); } public void run() { String msg; try { /* loop reading messages from the server and show them * on stdout */ while ((msg = in.readLine()) != null) { System.out.println(msg); } } catch (IOException e) { System.err.println(e); } } } and here's the /* */ import; import; import; import; import; import; import java.util.Hashtable; public class ChatServer { private static int port = 5000; /* port to listen on */ public static void main (String[] args) throws IOException { ServerSocket server = null; try { server = new ServerSocket(port); /* start listening on the port */ } catch (IOException e) { System.err.println("Could not listen on port: " + port); System.err.println(e); System.exit(1); } Socket client = null; while(true) { try { client = server.accept(); } catch (IOException e) { System.err.println("Accept failed."); System.err.println(e); System.exit(1); } /* start a new thread to handle this client */ Thread t = new Thread(new ClientConn(client)); t.start(); } } } class ChatServerProtocol { private String nick; private ClientConn conn; /* a hash table from user nicks to the corresponding connections */ private static Hashtable nicks = new Hashtable(); private static final String msg_OK = "OK"; private static final String msg_NICK_IN_USE = "NICK IN USE"; private static final String msg_SPECIFY_NICK = "SPECIFY NICK"; private static final String msg_INVALID = "INVALID COMMAND"; private static final String msg_SEND_FAILED = "FAILED TO SEND"; /** * Adds a nick to the hash table * returns false if the nick is already in the table, true otherwise */ private static boolean add_nick(String nick, ClientConn c) { if (nicks.containsKey(nick)) { return false; } else { nicks.put(nick, c); return true; } } public ChatServerProtocol(ClientConn c) { nick = null; conn = c; } private void log(String msg) { System.err.println(msg); } public boolean isAuthenticated() { return ! (nick == null); } /** * Implements the authentication protocol. * This consists of checking that the message starts with the NICK command * and that the nick following it is not already in use. * returns: * msg_OK if authenticated * msg_NICK_IN_USE if the specified nick is already in use * msg_SPECIFY_NICK if the message does not start with the NICK command */ private String authenticate(String msg) { if(msg.startsWith("NICK")) { String tryNick = msg.substring(5); if(add_nick(tryNick, this.conn)) { log("Nick " + tryNick + " joined."); this.nick = tryNick; return msg_OK; } else { return msg_NICK_IN_USE; } } else { return msg_SPECIFY_NICK; } } /** * Send a message to another user. * @recepient contains the recepient's nick * @msg contains the message to send * return true if the nick is registered in the hash, false otherwise */ private boolean sendMsg(String recipient, String msg) { if (nicks.containsKey(recipient)) { ClientConn c = nicks.get(recipient); c.sendMsg(nick + ": " + msg); return true; } else { return false; } } /** * Process a message coming from the client */ public String process(String msg) { if (!isAuthenticated()) return authenticate(msg); String[] msg_parts = msg.split(" ", 3); String msg_type = msg_parts[0]; if(msg_type.equals("MSG")) { if(msg_parts.length

以上就是Running a Client-Server Chat program的详细内容,更多请关注web前端其它相关文章!

赞(0) 打赏
未经允许不得转载:web前端首页 » JavaScript 答疑

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

前端开发相关广告投放 更专业 更精准