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);

结果如下:

原文地址:https://www.cnblogs.com/sincoolvip/p/5594823.html