zoukankan      html  css  js  c++  java
  • 应用java多线程实现server端与多client之间的通信

    应用多线程来实现server与多线程之间的通信的基本步骤

    1、server端创建ServerSocket,循环调用accept()等待client链接

    2、client创建一个Socket并请求和server端链接

    3、server端接受client请求,创建socekt与该client建立专线链接

    4、建立链接的socket在一个单独的线程上对话

    5、server继续等待新的链接

    server端Server.java
    package test.concurrent.socket;
    
    import java.io.*;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * Created by dong on 15-6-22.
     * 基于TCP协议的Socket通信。实现用户登录
     * 服务器端
     */
    public class Server {
    
        public static void main(String[] args) {
    
            try {
                //1、创建一个服务器端Socket,即ServerSocket, 指定绑定的端口,并监听此端口
                ServerSocket serverSocket = new ServerSocket(8888);
                Socket socket = null;
                //记录client的数量
                int count = 0;
                System.out.println("***服务器即将启动,等待client的链接***");
                //循环监听等待client的链接
                while (true){
                    //调用accept()方法開始监听,等待client的链接
                    socket = serverSocket.accept();
                    //创建一个新的线程
                    ServerThread serverThread = new ServerThread(socket);
                    //启动线程
                    serverThread.start();
    
                    count++; //统计client的数量
                    System.out.println("client的数量: " + count);
                    InetAddress address = socket.getInetAddress();
                    System.out.println("当前client的IP : " + address.getHostAddress());
                }
    
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    服务器端线程处理类ServerThread.java
    package test.concurrent.socket;
    
    import java.io.*;
    import java.net.Socket;
    
    /**
     * Created by dong on 15-6-22.
     * server端线程处理类
     */
    public class ServerThread extends Thread {
    
        //和本线程相关的Socket
        Socket socket = null;
        public ServerThread(Socket socket){
            this.socket = socket;
        }
    
        //线程运行的操作,响应client的请求
        public void run(){
    
            InputStream is = null;
            InputStreamReader isr = null;
            BufferedReader br = null;
    
            OutputStream os = null;
            PrintWriter pw = null;
            try {
    
                //获取一个输入流,并读取client的信息
                is = socket.getInputStream();
                isr = new InputStreamReader(is); //将字节流转化为字符流
                br = new BufferedReader(isr); //加入缓冲
                String info = null;
                //循环读取数据
                while ((info = br.readLine()) != null){
                    System.out.println("我是server。client说: " +info);
                }
    
                socket.shutdownInput(); //关闭输入流
    
                //获取输出流。响应client的请求
                os = socket.getOutputStream();
                pw = new PrintWriter(os); //包装为打印流
                pw.write("欢迎你");
                pw.flush();  //将缓存输出
    
    
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
    
    
                    try {
                        //关闭资源
                        if (pw != null)
                            pw.close();
                        if (os != null)
                            os.close();
                        if (is != null)
                            is.close();
                        if (isr != null)
                            isr.close();
                        if (br != null)
                            br.close();
                        if (socket != null)
                            socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
    
                    }
    
            }
    
    
    
        }
    }
    
    clientClient.java
    package test.concurrent.socket;
    
    import java.io.*;
    import java.net.Socket;
    
    /**
     * Created by dong on 15-6-22.
     * client
     */
    public class Client {
    
        public static void main(String[] args) {
    
            try {
                //1、创建clientSocket,指定server端口号和地址
                Socket socket = new Socket("localhost",8888);
                //2、获取输出流,向server发送信息
                OutputStream os = socket.getOutputStream(); //字节输出流
                PrintWriter pw  = new PrintWriter(os); //将输出流包装为打印流
                pw.write("username:tom; password:456");
                pw.flush();
                socket.shutdownOutput(); //关闭输出流
    
                InputStream is = socket.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
    
                String info = null;
                //循环读取
                while ((info = br.readLine()) != null){
                    System.out.println("我是client:server说:" + info);
                }
    
                br.close();
                is.close();
                isr.close();
    
    
                pw.close();
                os.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    




  • 相关阅读:
    让DIV实现抖动效果!
    Linux下如果python2和python3同时存在使用pip3
    Eclipse 查找一个接口的具体实现
    linux下编译安装软件到指定目录
    NG机器学习-octave基本操作
    NG机器学习
    全注解方式构建SpringMVC项目
    Java多线程学习开发笔记
    RabbitMQ 学习开发笔记
    Redis 学习开发笔记
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5208751.html
Copyright © 2011-2022 走看看