TCP服务器程序模型的学习(Socket连接进一步理解学习)
服务器如果需要同时跟多个客户端会话,服务器端就需要循环调用ServerSocket.accept()方法进行不断的监听处理;另外如果服务器端程序与每个客户端的会话过程不能互相影响的话,就需要启动多个线程分别处理每个请求
下面给个例子(发送一行文本字符,服务器端返回倒序的文本):
1.ReverseServer.java文件
package cn.com;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;public class ReverseServer {public static void main(String[] args) {try {ServerSocket ss = new ServerSocket(8001);boolean bRunning = true;while (bRunning) {Socket s = ss.accept();new Thread(new Servicer(s)).start();}ss.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
package cn.com;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.net.Socket;public class Servicer implements Runnable {Socket s;public Servicer(Socket s) {this.s = s;}@Overridepublic void run() {// TODO Auto-generated method stubtry {InputStream ips = s.getInputStream();OutputStream ops = s.getOutputStream();BufferedReader br = new BufferedReader(new InputStreamReader(ips)); //需要启动自动flush功能PrintWriter pw = new PrintWriter(ops,true);while (true) {String strLine = br.readLine();if (strLine.equalsIgnoreCase("quit")) {break;}System.out.println("strLine =="+strLine);String strEcho = (new StringBuffer(strLine).reverse()).toString();pw.println(strLine + "---->>>" + strEcho);}br.close();pw.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
cmd---->telnet 127.0.0.1 8001---->输入一行字符,回车就会看到效果