对于服务器端来说,如果要加入多线程机制,则应该在每个用户连接之后启动一个新的线程

建立一个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();
    }

}

 

 posted on 2016-12-19 14:51  布鲁布鲁sky  阅读(696)  评论(0编辑  收藏  举报