昨天写了一个回显服务器,今天在回显服务器的基础上开发了一个简易的聊天程序。比较简易,存下代码。
package in.sikaijian.easytalk; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketException; /** * easy talk server * @author sikaijian */ public class EasyTalkServer { private final ServerSocket server; /** * initialize port * @param port * @throws Exception */ public EasyTalkServer(int port) throws Exception{ this.server = new ServerSocket(port); } /** * start up echo server */ public void startUp(){ System.out.println( "----easyTalk server start----" ); System.out.println("listening on port : " + this.server.getLocalPort() + "..."); Thread servThread = new Thread( new Runnable() { @Override public void run() { /** * wait for request socket when a request come, start up a thread to handle the request */ while (true) { try { Socket client = EasyTalkServer.this.server.accept(); Thread servThread = new Thread( new EchoThread( client ) ); servThread.start(); } catch (Exception e) { e.printStackTrace(); } } } } ); servThread.start(); } /** * request handler thread * @author sikaijian */ private class EchoThread implements Runnable{ private final Socket client; public EchoThread(Socket client){ this.client = client; } @Override public void run() { try { BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream())); System.out.println("request socket address : " + client.getRemoteSocketAddress()); /* * server a request until socket closed by client and assume that client closed when exception * occurs */ while(true){ try { String line = reader.readLine(); System.out.println( client.getRemoteSocketAddress() + " send message [ " + line + "]" ); } catch (SocketException e) { if(client!=null){ client.close(); } break; } } } catch (Exception e) { e.printStackTrace(); } } } }
package in.sikaijian.easytalk;
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; /** * easy talk client * @author sikaijian */ public class EasyTalkClient { private String netWorkName; public void setNetWorkName(String name) { this.netWorkName = name; } public void startAtalk(String talkToIp, int talkPort) { Thread talk = new Thread( new Chart( talkToIp, talkPort ) ); talk.start(); } private class Chart implements Runnable { private final String ip; private final int port; public Chart(String ip, int port) { this.ip = ip; this.port = port; } @Override public void run() { PrintWriter out = null; BufferedReader netWorkIn = null; try { Socket theSocket = new Socket( ip, port ); netWorkIn = new BufferedReader( new InputStreamReader( theSocket.getInputStream() ) ); out = new PrintWriter( new OutputStreamWriter( theSocket.getOutputStream() ) ); BufferedReader userIn = new BufferedReader( new InputStreamReader( System.in ) ); System.out.println( "----Connect to " + ip + " server successed, input 'exit' to end a chart---" ); while (true) { String line = userIn.readLine(); if (line.equals( "exit" )) break; out.println( EasyTalkClient.this.netWorkName + " say : " + line ); out.flush(); System.out.println( netWorkIn.readLine() ); } } catch (Exception e) { e.printStackTrace(); } } } }
package in.sikaijian.easytalk;
import java.io.BufferedReader; import java.io.InputStreamReader; public class EasyTalk { private final EasyTalkServer server; private final EasyTalkClient client; public static final int defaultServPort = 19891; public EasyTalk(int localServPort) throws Exception { server = new EasyTalkServer( localServPort ); server.startUp(); client = new EasyTalkClient(); } public void startAtalk(String talkTo, int remoteServPort) { client.startAtalk( talkTo, remoteServPort ); } public void setName(String yourName) { client.setNetWorkName( yourName ); } public static void main(String[] args) throws Exception { System.out.println( "-------------Easy Talk Version 1.0---------------" ); BufferedReader reader = new BufferedReader( new InputStreamReader( System.in ) ); System.out.println( "Input your local server port : " ); int localServPort = Integer.parseInt( reader.readLine() ); EasyTalk aTalk = new EasyTalk( localServPort ); System.out.print( "Input your name : " ); String name = reader.readLine(); System.out.print( "Input the ip you want to talk to : " ); String talkTo = reader.readLine(); System.out.print( "Input the remote server port : " ); int remoteServPort = Integer.parseInt( reader.readLine() ); System.out.println( "---Nice to meet you " + name + " your are talking to " + talkTo + "---" ); System.out.println(); aTalk.setName( name ); aTalk.startAtalk( talkTo, remoteServPort ); } }