• Socket与SocketServer结合多线程实现多客户端与服务器通信


    需求说明:实现多客户端用户登录,实现多客户端登录一般都需要使用线程技术:

    (1)创建服务器端线程类,run()方法中实现对一个请求的响应处理;

    (2)修改服务器端代码,实现循环监听状态;

    (3)服务器端每监听到一个请求,创建一个处理线程;

    关于Socket与SocketServer介绍我这里不多说了,网上很多资料,这里推荐一个

    http://www.cnblogs.com/rond/p/3565113.html

    代码如下:

    1、用户类

    package com.j02.d04;
    
    import java.io.Serializable;
    
    /*
     * 使用对象的思想进行客户端与服务端的通信
     */
    public class User implements Serializable{
        private String name;
        private String pwd;
        
        public User() {
            super();
        }
    
        public User(String name, String pwd) {
            super();
            this.name = name;
            this.pwd = pwd;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPwd() {
            return pwd;
        }
    
        public void setPwd(String pwd) {
            this.pwd = pwd;
        }
        
        
    }

    2、服务器类

    package com.j02.d04;
    
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.ObjectInputStream;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Server {
        public static void main(String[] args) {
        
            ServerSocket server=null;
            Socket socket=null;
    
            User user=new User();
                try {
                    //创建ServerSocket端口
                    server=new ServerSocket(9001);
                    //创建通信连接
                    while(true){
                    socket=server.accept();
                    //创建线程执行响应操作
                    
                    ServerThread st=new ServerThread(socket);
                    st.start();
                    }
                    
                } catch (IOException e) {
                    e.printStackTrace();
                }
            
                
            
        }
        
    }

    3、服务器线程类

    package com.j02.d04;
    
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    import java.net.Socket;
    
    /*
     * 服务端的线程,处理多个客户端请求
     */
    public class ServerThread extends Thread{
        //定义一个客户端socket
        private Socket socket;
        public ServerThread(){
            
        }
        public ServerThread(Socket socket){
            this.socket=socket;
        }
        //执行响应输出操作
        public void run() {
            try {
                //获取客户端的输出流
                InputStream is=socket.getInputStream();
                ObjectInputStream ois=new ObjectInputStream(is);
                User user=(User)ois.readObject();
                System.out.println("我是服务器,接收到客户端的信息是:"+user.getName()+"------"+user.getPwd());
                //输出给客户端的响应
                String reply="登陆成功!";
                OutputStream os=socket.getOutputStream();
                BufferedWriter oos=new BufferedWriter(new OutputStreamWriter(os));
                oos.write(reply);
                oos.flush();
                //关闭流
                oos.close();
                os.close();
                ois.close();
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
        
    }

    4、客户端1

    package com.j02.d04;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.ObjectOutputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    import java.net.UnknownHostException;
    /*
     * 客户端
     */
    public class Client {
        public static void main(String[] args) {
            Socket socket=null;
            OutputStream os=null;
            ObjectOutputStream oos=null;
            User login=new User("admin","123456");
            try {
                //创建Socket指定访问地址和端口
                socket=new Socket("localhost",9001);
                //获取输出流对象
                os=socket.getOutputStream();
                oos=new ObjectOutputStream(os);
                //输出的是对象的值
                oos.writeObject(login);
                //读服务器返回的响应
                InputStream is=socket.getInputStream();
                BufferedReader br=new BufferedReader(new InputStreamReader(is));
                String reply;
                while((reply=br.readLine())!=null){
                    System.out.println("我是客户端,服务器返回的响应是:"+reply);
                }
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    5、客户端2

    package com.j02.d04;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.ObjectOutputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    import java.net.UnknownHostException;
    /*
     * 客户端
     */
    public class Client2 {
        public static void main(String[] args) {
            Socket socket=null;
            OutputStream os=null;
            ObjectOutputStream oos=null;
            User login=new User("kate","4rfv%TGB");
            try {
                //创建Socket指定访问地址和端口
                socket=new Socket("localhost",9001);
                //获取输出流对象
                os=socket.getOutputStream();
                oos=new ObjectOutputStream(os);
                //输出的是对象的值
                oos.writeObject(login);
                //读服务器返回的响应
                InputStream is=socket.getInputStream();
                BufferedReader br=new BufferedReader(new InputStreamReader(is));
                String reply;
                while((reply=br.readLine())!=null){
                    System.out.println("我是客户端,服务器返回的响应是:"+reply);
                }
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    运行:先运行服务器类-客户端1-客户端2

    然后在小电脑那里选择服务器类执行:

    结果:

    其它知识点补充:

    获取客户机的IP地址

    在线程那个类中添加代码:

    //获取客户端的IP地址
                InetAddress adress=socket.getInetAddress();//socket这个方法是获取一个返回套接字连接的地址。它返回的是一个此套接字连接到的远程 IP 地址
                String ip=adress.getHostAddress();//InetAddress 套接字的类可以通过getHostName()方法获取获取此 IP 地址的主机名。
                System.out.println("请求的客户机ip地址是:"+ip);

    结果如下:

  • 相关阅读:
    KVM安装以及远程连接
    开博客祭
    CQOI 2021
    琐记——学长们
    大事祭
    关于洛谷与博客园的博客的一些声明
    CSP-S 2020 & NOIP 2020 日记与游记
    调和级数
    快速乘
    二叉堆
  • 原文地址:https://www.cnblogs.com/sincoolvip/p/5594823.html
Copyright © 2020-2023  润新知