通信学习-----循序渐进2

2.多线程服务器的实现

 

 

在前面已经实现的服务器是不能让多个客户端连接进来的,只能让单个客户端的接入,首先阐明一点不能够让多个客户端接入的原因:ServerSocket在调用accept方法时是阻塞的,在一个客户端接入后,另外需要连接进来的客户端必须等待前面这个客户端正常退出以后才能够进入。有了多线程的知识,我们就可以让阻塞的部分在一个独立的线程里面独立的运行,每当一个客户端接入以后就创建一个线程对象去处理,这就是多线程服务器的基本原理。下面看代码示例:

 

 

首先创建ServerSocket对象,打开一个端口,让客户端连接进来这个类主要负责构建服务器

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerSet{
	private InputStream in;
	private OutputStream ou;
	private ServerSocket ss;
	
	/**
	 * 创建服务器
	 * 
	 * @param port
	 *            :端口号
	 */
	public void setupServer(int port) {
		try {
			// 创建服务器套接字
			ss = new ServerSocket(port);
			
			while(true){
				Socket sc=ss.accept();
				//创建客户端处理线程对象
				ServerThread st=new ServerThread(sc);
				//启动线程
				st.start();
			}
			
		} catch (Exception ef) {
			ef.printStackTrace();
		}

	}
	
	
	
	//程序入口
	public static void main(String args[]) {
		ServerSet s=new ServerSet();
		s.setupServer(12345);

	}
	
}

 

 

单独创建一个线程类,处理客户端的阻塞部分

import java.io.InputStream;   
import java.io.OutputStream;   
import java.net.Socket;   
  
public class ServerThread extends Thread{   
    private Socket sc;   
    private InputStream in;   
    private OutputStream ou;   
       
       
    /**  
     * 通过该类的构造器方法把需要的参数传递过来  
     * @param sc:客户端套接字对象  
     */  
    public ServerThread(Socket sc){   
        this.sc=sc;   
    }   
       
       
       
    public void run(){   
        this.clientPro();   
    }   
       
    /**  
     * 处理客户端的方法  
     */  
    public void clientPro(){   
        try{   
               
            System.out.println("一个客户端接入");   
            //得到输入输出流对象   
            in=sc.getInputStream();   
            ou=sc.getOutputStream();   
               
            String s="欢迎那个谁!";   
            this.sendMsg(s);   
               
            int t;   
            //遇到回车结束读取   
            while((t=in.read())!=13){   
                   
                System.out.println(t);   
            }   
               
            //关闭客户端的链接   
            sc.close();   
        }catch(Exception ef){   
            ef.printStackTrace();   
        }   
           
    }   
       
       
       
    //发送信息的私有方法   
    private void sendMsg(String msg)throws Exception{   
        ou.write(msg.getBytes());   
        ou.flush();   
    }   
       
       
       
}  

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值