初学socket,写了个回显服务器,旨在熟悉一下原理和api。
package in.sikaijian.socket.test; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketException; /** * 回显服务器 * @author sikaijian */ public class EchoServer { private ServerSocket server; /** * 构造,端口初始化 * @param port * @throws Exception */ public EchoServer(int port) throws Exception{ this.server = new ServerSocket(port); } /** * 启动服务器 */ public void startUp(){ System.out.println("----echo server start----"); System.out.println("listening on port : " + this.server.getLocalPort() + "..."); /** * ServerSocket的accept方法会一直阻塞直到有新的socket连接 * 接受到新的连接后,启动一个线程来处理 * 线程启动后,继续进入while循环,accept仿佛继续阻塞 */ while(true){ try { Socket client = this.server.accept(); Thread servThread = new Thread(new EchoThread(client)); servThread.start(); } catch (Exception e) { e.printStackTrace(); } } } /** * 服务线程实现 * @author sikaijian */ private class EchoThread implements Runnable{ private Socket client; public EchoThread(Socket client){ this.client = client; } @Override public void run() { try { BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream())); PrintWriter out = new PrintWriter(new OutputStreamWriter(client.getOutputStream())); System.out.println("----------------------------"); System.out.println("request socket address : " + client.getRemoteSocketAddress()); System.out.println("doing service..."); // 循环读,直到出现异常,认为是客户端关闭socket连接 while(true){ try { String line = reader.readLine(); out.println(line); out.flush(); System.out.println("From client : " + line); } catch (SocketException e) { if(client!=null){ client.close(); } System.out.println("----------------------------"); break; } } } catch (Exception e) { e.printStackTrace(); } } } public static void main(String[] args) { try { EchoServer echo = new EchoServer(18088); echo.startUp(); } catch (Exception e) { e.printStackTrace(); } } }
package in.sikaijian.socket.test;
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; /** * 客户端,连接回显服务器,循环发送字符串 * @author sikaijian */ public class EchoClient { public static void main(String[] args) { String host = "localhost"; PrintWriter out = null; BufferedReader netWorkIn = null; try { Socket theSocket = new Socket(host, 18088); 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 echo server---"); System.out.println("Try to type something...."); while(true){ String line = userIn.readLine(); if(line.equals("exit")) break; out.println(line); out.flush(); System.out.println("echo : " + netWorkIn.readLine()); } } catch (Exception e) { e.printStackTrace(); } } }