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);
结果如下:

Socket与SocketServer结合多线程实现多客户端与服务器通信的更多相关文章
- Socket 服务端使用多线程实现多客户端通讯实例
socket通信原理 Java多线程实现Socket通讯 1.服务端 import java.io.IOException; import java.net.ServerSocket; import ...
- java学习笔记——Java多客户端与服务器通信
先说一下大概的思路: 应用多线程来实现服务器与多客户端之间的通信 1.服务器端创建ServerSocket,循环调用accept()等待客户端连接: 2.客户端创建一个Socket并请求与服务器端连接 ...
- Java网络编程客户端和服务器通信
在java网络编程中,客户端和服务器的通信例子: 先来服务器监听的代码 package com.server; import java.io.IOException; import java.io.O ...
- 智能电视TV开发---客户端和服务器通信
在做智能电视应用的时候,最头疼的就是焦点问题,特别是对于个人开发者,没有设备这是最最头疼的事情了,在没有设备的情况下,怎么实现智能电视应用呢,接下来我是用TV程序来做演示的,所以接下来的所有操作是在有 ...
- Python自动化运维之15、网络编程之socket、socketserver、select、twisted
一.TCP/IP相关知识 TCP/UDP提供进程地址,两个协议互不干扰的独自的协议 TCP :Transmission Control Protocol 传输控制协议,面向连接的协议,通信 ...
- 利用Python中SocketServer 实现客户端与服务器间非阻塞通信
利用SocketServer模块来实现网络客户端与服务器并发连接非阻塞通信 版权声明 本文转自:http://blog.csdn.net/cnmilan/article/details/9664823 ...
- 【python】网络编程-SocketServer 实现客户端与服务器间非阻塞通信
利用SocketServer模块来实现网络客户端与服务器并发连接非阻塞通信.首先,先了解下SocketServer模块中可供使用的类:BaseServer:包含服务器的核心功能与混合(mix-in)类 ...
- C#Socket_TCP(客户端,服务器端通信)
客户端与服务器通信,通过IP(识别主机)+端口号(识别应用程序). IP地址查询方式:Windows+R键,输入cmd,输入ipconfig. 端口号:可自行设定,但通常为4位. 服务器端: usin ...
- 客户端(android,ios)与服务器通信
android,ios客户端与服务器通信为了便于理解,直接用PHP作为服务器端语言 其实就是一个 http请求响应的过程序,先从 B/S模式说起浏览器发起http请求,服务器响应请求,并把数据返回给浏 ...
随机推荐
- WPF 3D模型 3D场景
1.首先得说明的是这并不是真正的3D,模型被导出为一系列的单个图片,例如一个3D户型图,以某个视角旋转360°,渲染出一系列连续的单个图片文件. 2.在Image.MouseMove事件中添加相应代码 ...
- 正式版/免费版 Xamarin 体验与拥抱
感谢MS, 感谢老纳.终于把 Xamarin 这个磨人的小妖精给收了,在也不用向大神要破解补丁了, 终于可以光明正大的使用了!! 跟据实践, 如果你们想体验一下 .NET 开发 IOS /Androi ...
- canvas 2d 贴图技术实践
最近在公司内部的技术协会论坛里闲逛的时候,无意中发现了一篇手淘前端大牛岑安两年前写的博文,讲述了canvas的2d贴图技术.看到后觉得相当神奇.于是就自己实现了一下.不过岑安前辈的那篇博文也只是大概讲 ...
- [BZOJ1188][HNOI2007]分裂游戏(博弈论)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1188 分析: 设SG[i]表示一个石子在位置i上的SG值 这个很容易暴力求,因为i的后 ...
- [BZOJ1854][Scoi2010]游戏(二分图匹配/并查集)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1854 分析:很裸的一道二分图匹配对吧,但是在hzwer的blog上看见神奇的并查集做法 ...
- 东大OJ-1430-PrimeNumbers
题目描述 I'll give you a number , please tell me how many different prime factors in this number. 输入 The ...
- CentOS6.6搭建LNMP环境
CentOS6.6搭建LNMP环境 1.设置yum源,本地安装依赖包 1 yum -y install gcc gcc-c++ automake autoconf libtool make 2.下载依 ...
- Android 拍照或者从相册获取图片的实现
我们常常会用到上传头像,或者发帖子的时候选择本地图片上传的功能.这个很常见 今天因为app的需求我研究了下.现在分享下. 其实不论是通过拍照还是从相册选取都会用到Intent 这是系统提供给我们用来调 ...
- 【POJ 2406】Power Strings 连续重复子串
看的<后缀数组——处理字符串的有力工具>这篇论文,在那里这道题是用后缀数组实现的,复杂度为$O(nlogn)$,很明显长度为$2×10^6$的数据会TLE,所以必需得用复杂度为$O(n)$ ...
- JAVA对文件类型的校验
通常,在WEB系统中,上传文件时都需要做文件的类型校验,大致有如下几种方法: 1. 通过后缀名,如exe,jpg,bmp,rar,zip等等. 2. 通过读取文件,获取文件的Content-type来 ...