对于服务器端来说,如果要加入多线程机制,则应该在每个用户连接之后启动一个新的线程
建立一个EchoThread类,此类专门用于处理多线程操作,此时的多线程使用Runnable接口实现
package Socket;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintStream;import java.net.Socket;/** * 接收每一个客户端的Socket,并通过循环的方式接收客户端的输入信息及向客户端输出信息 */public class EchoThread implements Runnable { private Socket client=null; //接收客户端 public EchoThread(Socket client){ //通过构造方法设置Socket this.client=client; } public void run() { PrintStream out=null; BufferedReader buf=null; try { buf=new BufferedReader(new InputStreamReader(client.getInputStream()));//得到客户端输入信息 out=new PrintStream(client.getOutputStream());//实例化客户端的输出流 boolean flag=true; while(flag){ //客户端循环操作 String str=buf.readLine();//不断接收信息 if(str==null||"".equals(str)){ flag=false; } else{ if("bye".equals(str)){ //如果输入bye,结束操作 flag=false; } else{ out.println("ECHO:"+str);//向客户端回显信息 } } } out.close(); client.close(); } catch (IOException e) { e.printStackTrace(); } }}
是是
package Socket;import java.io.BufferedReader;import java.io.IOException;import java.io.PrintStream;import java.net.ServerSocket;import java.net.Socket;/* * 在服务器端,每一个连接到服务器的客户端Socket都会以一个线程的方式运行, * 这样,无论有多少个客户端连接都可以同时完成操作 */public class EchoThreadServer { public static void main(String[] args) throws Exception { ServerSocket server =null;//定义ServerSocket对象 Socket client=null;//定义socket对象,表示客户端 server = new ServerSocket(8888);//此服务器在8888端口进行监听 boolean f=true; while(f){ System.out.println("服务器运行,等待客户端连接。"); client=server.accept(); new Thread(new EchoThread(client)).start();//实例化并启动一个线程对象 } server.close(); }}