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

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

结果如下:

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

  1. Socket 服务端使用多线程实现多客户端通讯实例

    socket通信原理 Java多线程实现Socket通讯 1.服务端 import java.io.IOException; import java.net.ServerSocket; import ...

  2. java学习笔记——Java多客户端与服务器通信

    先说一下大概的思路: 应用多线程来实现服务器与多客户端之间的通信 1.服务器端创建ServerSocket,循环调用accept()等待客户端连接: 2.客户端创建一个Socket并请求与服务器端连接 ...

  3. Java网络编程客户端和服务器通信

    在java网络编程中,客户端和服务器的通信例子: 先来服务器监听的代码 package com.server; import java.io.IOException; import java.io.O ...

  4. 智能电视TV开发---客户端和服务器通信

    在做智能电视应用的时候,最头疼的就是焦点问题,特别是对于个人开发者,没有设备这是最最头疼的事情了,在没有设备的情况下,怎么实现智能电视应用呢,接下来我是用TV程序来做演示的,所以接下来的所有操作是在有 ...

  5. Python自动化运维之15、网络编程之socket、socketserver、select、twisted

    一.TCP/IP相关知识 TCP/UDP提供进程地址,两个协议互不干扰的独自的协议       TCP :Transmission Control Protocol 传输控制协议,面向连接的协议,通信 ...

  6. 利用Python中SocketServer 实现客户端与服务器间非阻塞通信

    利用SocketServer模块来实现网络客户端与服务器并发连接非阻塞通信 版权声明 本文转自:http://blog.csdn.net/cnmilan/article/details/9664823 ...

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

    利用SocketServer模块来实现网络客户端与服务器并发连接非阻塞通信.首先,先了解下SocketServer模块中可供使用的类:BaseServer:包含服务器的核心功能与混合(mix-in)类 ...

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

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

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

    android,ios客户端与服务器通信为了便于理解,直接用PHP作为服务器端语言 其实就是一个 http请求响应的过程序,先从 B/S模式说起浏览器发起http请求,服务器响应请求,并把数据返回给浏 ...

随机推荐

  1. Webwork 学习之路【06】Action 调用

    一路走来,终于要开始 webwork 核心业务类的总结,webwork 通过对客户端传递的 web 参数重新包装,进行执行业务 Action 类,并反馈执行结果,本篇源码分析对应下图 WebWork ...

  2. SQL基础之数据库快照

    1.认识快照 如名字一样,数据库快照就可以理解为数据库某一时刻的照片,它记录了此时数据库的数据信息.如果要认识快照的本质,那就要了解快照的工作原理.当我们执行t-sql创建快照后,此时就会创建一个或多 ...

  3. HTTPS科普扫盲帖

    为什么需要https HTTP是明文传输的,也就意味着,介于发送端.接收端中间的任意节点都可以知道你们传输的内容是什么.这些节点可能是路由器.代理等. 举个最常见的例子,用户登陆.用户输入账号,密码, ...

  4. 怎样修改 Openstack Horizon(Dashboard)的显示界面 (一)

    Openstack 有很多项目,比如 nova 是虚拟机管理,neutron 是虚拟网络管理, glance 是存储管理,而 horizon 是负责 Openstack 的统一界面.horizon 的 ...

  5. NetworkSocket结构图

    分层思想 NetworkSocket使用分层的思想,分基础层和上层: 1.基础层提供基础通讯,重要的对象有SessionBase.TcpServerBase和TcpClientBase: 2.上层实现 ...

  6. js的单引号,双引号,转移符

    这里我们看到想在style后边在插入一个样式的变量,data.cssSytle.a是做边和邮编都是"",并且没有转移符

  7. centos7.2安装phpmyadmin

    首先服务器要有web 环境 yum install phpmyadmin 修改/etc/http.conf/conf.d/phpMyadmin.conf 将  #Require ip 127.0.0. ...

  8. Yii2 使用小部件 Breadcrumbs

    yii有两种Breadcrumbs写法,one: echo Breadcrumbs::widget([ 'itemTemplate' => "<li><i>{l ...

  9. 【摘抄】将xml注释文档生成网页

    config.SetDocumentationProvider(new XmlDocumentationProvider(HttpContext.Current.Server.MapPath(&quo ...

  10. 【Alpha版本】冲刺阶段——Day 4

    我说的都队 031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬 ...