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

结果如下:

时间: 2024-08-24 03:32:38

Socket与SocketServer结合多线程实现多客户端与服务器通信的相关文章

客户端与服务器通信

打开一个浏览器,在地址栏输入一个网址,按下ENTER键,到看到整个页面,中间都经历了哪些事情? HTTP请求阶段:向服务器发送请求 1.浏览器首先向DNS域名解析服务器发送请求 2.DNS反解析:根据浏览器请求地址中的域名,到DNS服务器中找到对应的服务器外网IP地址 3.通过找到的外网IP,向对应的服务器发送请求(首先访问的是服务器的WEB站点管理工具:准确来说是我们先基于工具在服务器上创建很多服务,当有客户端访问的时候,服务器会匹配出具体是请求哪个服务) 4.通过URL地址中携带的端口号,找

【python】网络编程-SocketServer 实现客户端与服务器间非阻塞通信

利用SocketServer模块来实现网络客户端与服务器并发连接非阻塞通信.首先,先了解下SocketServer模块中可供使用的类:BaseServer:包含服务器的核心功能与混合(mix-in)类挂钩:这个类只用于派生,所以不会生成这个类的实例:可以考虑使用TCPServer和UDPServer.TCPServer/UDPServer:基本的网络同步TCP/UDP服务器.UnixStreamServer/ UnixDatagramServer:基本的基于文件同步TCP/UDP服务器.Fork

C#Socket_TCP(客户端,服务器端通信)

客户端与服务器通信,通过IP(识别主机)+端口号(识别应用程序). IP地址查询方式:Windows+R键,输入cmd,输入ipconfig. 端口号:可自行设定,但通常为4位. 服务器端: using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading.Tasks;

客户端(android,ios)与服务器通信

android,ios客户端与服务器通信为了便于理解,直接用PHP作为服务器端语言 其实就是一个 http请求响应的过程序,先从 B/S模式说起浏览器发起http请求,服务器响应请求,并把数据返回给浏览器,经过浏览器的渲染,即为我们所看到的效果 客户端(android,ios)android通过 httpClient或urlconnection等网络请求去实现http请求,(相当于浏览器,发送 url请求),即访问服务器,服务器响应请求,并把结果返回给客户端,经过客户端渲染,即为我们看到的效果.

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

转载请注明:http://blog.csdn.net/uniquewonderq 问题:一个服务端可以跟多个客户端通讯 基本步骤: 1.服务器端创建ServerSocket方法,循环调用accept()方法等待客户端连接 2.客户端创建socket和服务的请求连接 3.服务端接受客户端的请求,建立专线连接 4.建立连接的两个socket在一个单独的线程上对话 5.服务器端继续等待新的连接 创建一个服务器相关的线程类: package com.test; import java.io.Buffer

java多线程实现多客户端socket通信

一.服务端 package com.czhappy.hello.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) { //创建ServerSocket示例,指定端口,侦听 try { Ser

python socket和socketserver

Python提供了两个基本的socket模块.一个是socket,它提供了标准的BSD Socket API:另一个是socketServer,它提供了服务器中心类,可以简化网络服务器的开发. 下面先简要介绍socket模块包含的类及其使用. 1.开始了解socket模块前,先熟悉下Python的网络编程模块主要支持的两种Intent协议:TCP和UDP.TCP协议是一种面向连接的可靠协议,用于建立机器之间的双向通信流.UDP协议是一种较低级别的.以数据包为基础的协议(无连接传输模式).与TCP

socket 和 SocketServer 模块

一 .Socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket socket(TCP,IP)通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求 socket和file的区别: file模块是针对某个指定文件进行[打开][读写][关闭] socket模块是针对 服务器端 和 客户端Socket 进行[打开][读写][关闭] 建立连接必须有一个服务端和一

应用java多线程实现服务器端与多客户端之间的通信

应用多线程来实现服务器与多线程之间的通信的基本步骤 1.服务器端创建ServerSocket,循环调用accept()等待客户端链接 2.客户端创建一个Socket并请求和服务器端链接 3.服务器端接受客户端请求,创建socekt与该客户端建立专线链接 4.建立链接的socket在一个单独的线程上对话 5.服务器继续等待新的链接 服务器端Server.java package test.concurrent.socket; import java.io.*; import java.net.In