使用多线程实现多客户端的通信

转载请注明:

问题:一个服务端可以跟多个客户端通讯

基本步骤:

1.服务器端创建ServerSocket方法,循环调用accept()方法等待客户端连接

2.客户端创建socket和服务的请求连接

3.服务端接受客户端的请求,建立专线连接

4.建立连接的两个socket在一个单独的线程上对话

5.服务器端继续等待新的连接

创建一个服务器相关的线程类:

package com.test;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.net.Socket;/* * 服务器线程处理类 */public class ServerThread extends Thread {// 和本线程相关的SocketSocket socket = null;public ServerThread(Socket socket) {this.socket = socket;}//线程执行的操作,响应客户端的请求public void run(){InputStream is=null;InputStreamReader isr=null;BufferedReader br=null;OutputStream os=null;PrintWriter pw=null;try {//获取输入流,并读取客户端信息is = socket.getInputStream();isr = new InputStreamReader(is);br = new BufferedReader(isr);String info=null;while((info=br.readLine())!=null){//循环读取客户端的信息System.out.println("我是服务器,客户端说:"+info);}socket.shutdownInput();//关闭输入流//获取输出流,响应客户端的请求os = socket.getOutputStream();pw = new PrintWriter(os);pw.write("欢迎您!");pw.flush();//调用flush()方法将缓冲输出} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{//关闭资源try {if(pw!=null)pw.close();if(os!=null)os.close();if(br!=null)br.close();if(isr!=null)isr.close();if(is!=null)is.close();if(socket!=null)socket.close();} catch (IOException e) {e.printStackTrace();}}}}

2.server服务器端

package com.test;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.net.InetAddress;import java.net.ServerSocket;import java.net.Socket;/* * 基于TCP协议的Socket通信,实现用户登陆 * 服务器端 */public class server {public static void main(String[] args) {try {//1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口,,并监听此端口ServerSocket serverSocket=new ServerSocket(8888);Socket socket=null;//记录客户端的数量int count=0;System.out.println("***服务器即将启动,等待客户端的连接***");//循环监听等待客户端的连接while(true){//调用accept()方法开始监听,等待客户端的连接socket=serverSocket.accept();//创建一个新的线程ServerThread serverThread=new ServerThread(socket);//启动线程serverThread.start();count++;//统计客户端的数量System.out.println("客户端的数量:"+count);InetAddress address=socket.getInetAddress();System.out.println("当前客户端的IP:"+address.getHostAddress());}} catch (IOException e) {e.printStackTrace();}}}

3.client客户端

package com.test;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.net.Socket;import java.util.logging.Level;import java.util.logging.Logger;/** * * @author wonderq */public class client {//客户端public static void main(String[] args) {try {//1.创建客户端Socket,指定服务器地址和端口号Socket socket=new Socket("127.0.0.1", 8888);//2.获取输出流,用来向服务器发送信息OutputStream os=socket.getOutputStream();//字节输出流//转换为打印流PrintWriter pw=new PrintWriter(os);pw.write("用户名:wonderq;密码:root");pw.flush();//刷新缓存,向服务器端输出信息//关闭输出流socket.shutdownOutput();//3.获取输入流,用来读取服务器端的响应信息InputStream is=socket.getInputStream();BufferedReader br=new BufferedReader(new InputStreamReader(is));String info=null;while((info=br.readLine())!=null){System.out.println("我是客户端,服务器端返回的信息是:"+info);}//4.关闭资源br.close();is.close();pw.close();os.close();socket.close();} catch (IOException ex) {Logger.getLogger(client.class.getName()).log(Level.SEVERE, null, ex);}}}

先运行服务器端输出:

***服务器即将启动,等待客户端的连接***

之后再运行客户端:

再查看服务端:

更改客户端的输出信息,pw.write("用户名:user;密码:admin");

然后再启动一个客户端。启动后客户端输出信息不变,服务端信息变化如下:

可以说明服务器端在一直循环监听新的客户端的连接。

因为都是本机,所有ip都是127.0.0.1如果在真是情况下,那么会大不一样。

版权声明:本文为博主原创文章,未经博主允许不得转载。

要愈合不能,要忘却不能,要再次拥抱,却鼓不起足够的勇气,

使用多线程实现多客户端的通信

相关文章:

你感兴趣的文章:

标签云: