Java Socket编程之回显服务器

初学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();
		}
	}
}

猜你喜欢

转载自sikaijian.iteye.com/blog/1549434
今日推荐