java Socket 使用多线程实现一对多的通信

             在上一篇完成了P2P的通行之后,只需要在服务端和客户端加入多线程,就可以实现服务器端和多个客户端进行通信,代码如下:

服务端线程:

</pre><pre name="code" class="java">import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

/***
 * 
 * @author dell
 *服务器端每次都要启动一个线程来对当前监听到的Socket进行通信处理
 */
public class ServerThread implements Runnable{
	private Socket client;  // 当前客户端对应的Socket
	private BufferedReader read=new BufferedReader(new InputStreamReader(System.in));  // 用来从键盘读取信息
	private PrintStream out;  // 用来向当前的客户端Socket输出信息
	private BufferedReader in;// 用来向当前的客户端的Socket读取信息
	public ServerThread(Socket client) {  // 构造方法
		super();
		this.client = client;
	}

	public void run() {
		try {
			out=new PrintStream(client.getOutputStream());
			in=new BufferedReader(new InputStreamReader(client.getInputStream()));
			out.println("服务器已经连接成功");  // 告诉客户端已经连接成功
			out.flush();             
			while(true){
				String msg=in.readLine();  // 读取客户端的信息
				System.out.println("端口为"+client.getLocalPort()+"的客户说:"+msg);// 输出客户端的信息
				msg=read.readLine(); // 从键盘得到服务器端的回复信息
				out.println(msg);
				out.flush();     // 输出缓冲流
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println(e.getMessage()); // 打印错误信息
		}
		finally{
			try {
				out.close();
				in.close();
				client.close();
			} catch (Exception e) {
				e.printStackTrace();
				System.out.println(e.getMessage());
			}
		}
	}
	

}
客户端线程:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

/***
 * 
 * @author dell
 *服务器使用Socket连接上服务器之后,启动ClientThread 线程来处理该线程的Socket
 */
public class ClientThread implements Runnable {
	private Socket server;  //与服务器端对应的Socket
	private BufferedReader read=new BufferedReader(new InputStreamReader(System.in));  // 用来从键盘读取信息
	private PrintStream out;  // 用来向当前的服务器端Socket输出信息
	private BufferedReader in;// 用来向当前的服务器的Socket读取信息
	public ClientThread(Socket server) {
		super();
		this.server = server;
	}
	public void run() {
		try {
			out=new PrintStream(server.getOutputStream());
			in=new BufferedReader(new InputStreamReader(server.getInputStream()));
			while(true){
				String msg=in.readLine();  // 读取服务器的信息
				System.out.println("服务器端的回复:"+msg);// 输出服务器的信息
				msg=read.readLine(); // 从键盘得到向服务器的回复信息
				out.println(msg);
				out.flush();     // 输出缓冲流
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println(e.getMessage()); // 打印错误信息
		}
		finally{
			try {
				out.close();
				in.close();
				server.close();
			} catch (Exception e) {
				e.printStackTrace();
				System.out.println(e.getMessage());
			}
		}
		
	}

	
	
}

服务器代码:

import java.net.ServerSocket;
import java.net.Socket;

public class MyServer {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			ServerSocket ss=new ServerSocket(30000);
			while(true){
				Socket client=ss.accept();
				ServerThread serverThread=new ServerThread(client);
				new Thread(serverThread).start();  // 启动线程
				
			}
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

客户端代码:
import java.net.Socket;

public class MyClient {
	public static void main(String[] args) {
		try {
			Socket client=new Socket("127.0.0.1",30000);
			new Thread(new ClientThread(client)).start();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}

}
由此可以运行多个客户端和同一个服务器端进行通信。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值