网络编程——服务器与多客户端通信

要想服务器同时支持多个客户端的连接,就必须加入多线程的处理机制,将每一个连接的客户端都创建一个新的线程对象。

package com.vince;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MutilServerDemo {

    /**
     * 服务器*/
    public static void main(String[] args) {
        ExecutorService es=Executors.newCachedThreadPool();
        try {
            //端口号从1024~65535
            ServerSocket ss=new ServerSocket(8000);
            System.out.println("服务器已启动,正在等待连接...");
            while(true){
                Socket socket=ss.accept();//等待客户端连接,该方法会阻塞     
                es.execute(new ClientThread(socket));
            }
            
            
        } catch (IOException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    }
    //处理客户请求的线程
    static class ClientThread implements Runnable{
        private Socket socket;
        public ClientThread(Socket socket){
            this.socket=socket;
        }
        
        public void run() {
            try {
                System.out.println("客户端的IP为:"+socket.getInetAddress().getHostAddress());
                InputStream input=socket.getInputStream();
                BufferedReader br=new BufferedReader(new InputStreamReader(input));
                OutputStream output=socket.getOutputStream();
                PrintStream ps=new PrintStream(output);
                while(true){
                String info=br.readLine();
                if(info==null||"bye".equals(info)){
                    break;
                }
                System.out.println(info);
                ps.println("echo:"+info);
                }
                input.close();
                output.close();
            } catch (IOException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
            
        }
        
    }
}
package com.vince;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
//客户端
public class MutilClientDemo {

    public static void main(String[] args) {
        // 连接服务器
        try {
            Socket socket = new Socket("localhost", 8000);
            System.out.println("连接成功!");
            boolean flag=true;
            OutputStream out = socket.getOutputStream();
            InputStream in = socket.getInputStream();
            PrintStream ps = new PrintStream(out);
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            Scanner input=new Scanner(System.in);
            while(flag){
                System.out.println("请输入:");
                String info=input.next();
                if("bye".equals(info)){
                    flag=false;
                
                }
            ps.println(info);
            info = br.readLine();
            System.out.println(info);
            }
            out.close();
            in.close();
        } catch (IOException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    }

}

测试时,使用cmd命令打开多个框(代表多个客户端),执行java命令。

posted on 2016-02-04 15:41  深海溺心  阅读(216)  评论(0编辑  收藏  举报

导航