需求说明:实现多客户端用户登录,实现多客户端登录一般都需要使用线程技术:
(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请求,服务器响应请求,并把数据返回给浏 ...
随机推荐
-
Checklist For Choosing The Right Database Engine
http://sqlite.org/whentouse.html Appropriate Uses For SQLite SQLite is not directly comparable to cl ...
-
现代程序设计 homework-07
现代程序设计 homework-07 这次作业是要阅读C++11的新特性,按照老师blog提供的链接稍微学习了一下,一下就是一些学习总结(或者说就是介绍)之类的:由于英文能力有限,并且很多中文资料也都 ...
-
Python之路:Python 函数
一.函数式编程:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装 二. 函数的定义和使用 def 函数名(参数): ... 函数体 ... 函数的定义主要有 ...
-
WCF技术剖析之三:如何进行基于非HTTP的IIS服务寄宿
原文:[原创]WCF技术剖析之三:如何进行基于非HTTP的IIS服务寄宿 在上面一篇文章中,我们对不同版本的IIS,以及ASP.NET得的实现机制进行了详细而深入的分析.在介绍IIS7.0的时候,我们 ...
-
POJ 3254 Corn Fields(状态压缩)
一道状态压缩的题,错了好多次....应该先把满足的情况预处理出来 #include<iostream> #include<cstdio> #include<cstring ...
-
HTML5技术分享 ES2017继发与并发
大家都知道,async函数的返回值是 Promise 对象,这比 Generator 函数的返回值是 Iterator 对象方便多了.你可以用then方法指定下一步的操作. 进一步说,async函数完 ...
-
DevOps实践之Jenkins安装部署
Prerequisites Minimum hardware requirements: 256 MB of RAM 1 GB of drive space (although 10 GB is a ...
-
关于Struts2自动装配和访问Servlet API
自动装配 1.根据属性的getter和setter获取值 index.jsp <s:form action="hello" method="POST"& ...
-
ReportViewer的使用总结
1.换行符:chr(13)&chr(10) 2.时间字符串格式化: =IIF(Trim(Fields!business_time.Value).Length=6, Left(Trim(F ...
-
笔记-scrapy-selector
笔记-scrapy-selector scrapy版本:1.5.0 1.总述 scrapy内置selector建立在lxml上. 2.使用 可以使用xpath和css方法来进行解析,两者都返回列表: ...