Socket技术二(一个服务器,多个客户端)

        主要用到线程和线程池。没个客户端访问都要启动一个线程,然后将其存放在线程池中。这样就实现了多个用户的同时访问!

        启动一个服务器,三个客户端,将其发送是信息分别为“send1”“send2”“send3”。运行结果为:

server控制台:send1

                                  send2

                        send3

send1客户端:已收到信息为:send1

send2客户端:已收到信息为:send2

send3客户端:已收到信息为:send3

package testSocket_Thread;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


public class Server {
	ServerSocket server; //其方法accept 用来监听客户端的链接
	Socket socket;
	static List<Socket> list = new ArrayList<Socket>();//保存链接的Socket对象
	ExecutorService exec;  //线程池类(说白了就是存放线程用的)
						   //1. Executors.newCachedThreadPool()缓存型池子,先查看池中有没有以前建立的线程,如果有,就reuse.如果没有,就建一个新的线程加入池中
						   //2. execute(Runnable r) 其实就是对Runnable对象调用start()方法
						   //3. exec.shutdownNow(); 一旦执行,线程将从线程池消失(客户端)
	public Server(){
		try {
			server = new ServerSocket(22222);//启动监听,端口为22222
			exec = Executors.newCachedThreadPool();
			while(true) {
				socket = server.accept();
				list.add(socket);
				exec.execute(new Tast(socket)); 
			}
		} catch (IOException e) {
			e.printStackTrace();
		}  
	}
	class Tast implements Runnable {
		Socket socket;      //服务器端Socket对象
		DataInputStream in;	//数据输入输出流
		DataOutputStream ou;
		public Tast(Socket socket) throws IOException{
			this.socket = socket;
			in = new DataInputStream(socket.getInputStream()); //获取Socket中的出入输出流,以完成通信
			ou = new DataOutputStream(socket.getOutputStream());
		}
		public void run() {
			try {
				
				//---------- 这里可以换成任何数据包的接受和发送  ----------
				String receive = in.readUTF();  //读取客户端信息
				ou.writeUTF("已收到信息为:"+receive);//向客户端发送信息
												//注意:读取和发送的顺序不能错
				
				ou.close();
				in.close();
				socket.close();
				System.out.println(receive);   
				
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args) {
		new Server();
	}
}

 

package testSocket_Thread;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

 
public class Client {
	static ExecutorService exec = Executors.newCachedThreadPool();
	
	public Client() {
		try {
			Socket socket = new Socket("127.0.0.1", 22222);
			exec.execute(new Sender(socket));   
		} catch (Exception e) {
			e.printStackTrace();
		}  
	}
	
	class Sender implements Runnable {
		Socket socket;	 //客户端Socket对象
		DataInputStream in; //输入输出流
		DataOutputStream ou;
		public Sender(Socket s){
			socket = s;
		}
		public void run() {
			try { 
				in = new DataInputStream(socket.getInputStream());//获取Socket中的出入输出流,以完成通信
				ou = new DataOutputStream(socket.getOutputStream());
				//---------- 这里可以换成任何数据包的接受和发送  ----------
				ou.writeUTF("send2");  //向服务器端发送信息
				String receive = in.readUTF();  //接受服务器的反馈信息
				
				in.close();
				ou.close();
				socket.close();
				//exec.shutdownNow(); 一旦执行,线程将从线程池消失
				System.out.println(receive);
				
			}catch (Exception e) {
			e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args) {
		new Client();
	}
}

 

 

下一篇将是客户端与客户端交互信息。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值