Java Socket(六) 使用多线程实现多客户端的通信

来源:互联网 发布:linux服务器测速脚本 编辑:程序博客网 时间:2024/06/02 04:27

问题

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

基本步骤

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

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

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

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

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

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

package com.test;/** * Created by SuPhoebe on 2015/12/27. * 服务器线程处理类 */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 {    // 和本线程相关的Socket    Socket 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 block            e.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();            }        }    }}

server服务器端:

package com.test;/** * Created by SuPhoebe on 2015/12/27. * 基于TCP协议的Socket通信,实现用户登陆 * 服务器端 */import java.io.IOException;import java.net.InetAddress;import java.net.ServerSocket;import java.net.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();        }    }}

client客户端:

package com.test;/** * Created by SuPhoebe on 2015/12/27. * 客户端 */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;import java.util.Random;public class client {    static private Random r = new Random();    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);            long name = Math.abs(r.nextLong());            long pass = Math.abs(r.nextLong());            pw.write("用户名:" + name + ";密码:" + pass);            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);        }    }}

先运行服务器端输出:

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

之后再运行客户端:

我是客户端,服务器端返回的信息是:欢迎您!

再查看服务端:

客户端的数量:1
当前客户端的IP:127.0.0.1
我是服务器,客户端说:用户名:5929171571395293558;密码:44062335022794149

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

***服务器即将启动,等待客户端的连接***
客户端的数量:1
当前客户端的IP:127.0.0.1
我是服务器,客户端说:用户名:5929171571395293558;密码:44062335022794149
客户端的数量:2
当前客户端的IP:127.0.0.1
我是服务器,客户端说:用户名:3373259123852889298;密码:1426435610939644870

1 0
原创粉丝点击