java多线程实现服务器端与多客户端之间的通信
来源:互联网 发布:数据库怎么加锁 编辑:程序博客网 时间:2024/05/18 02:57
用java语言构建一个网络服务器,实现客户端和服务器之间通信,实现客户端拥有独立线程,互不干扰。
应用多线程来实现服务器与多线程之间的通信的基本步骤
- 服务器端创建ServerSocket,循环调用accept()等待客户端链接
- 客户端创建一个Socket并请求和服务器端链接
- 服务器端接受客户端请求,创建socekt与该客户端建立专线链接
- 建立链接的socket在一个单独的线程上对话
- 服务器继续等待新的链接
服务器端Server.java
package
test.concurrent.socket;
import
java.io.*;
import
java.net.InetAddress;
import
java.net.ServerSocket;
import
java.net.Socket;
/**
* Created by dong on 15-6-22.
* 基于TCP协议的Socket通信,实现用户登录
* 服务器端
*/
public
class
Server {
public
static
void
main(String[] args) {
try
{
//1、创建一个服务器端Socket,即ServerSocket, 指定绑定的端口,并监听此端口
ServerSocket serverSocket =
new
ServerSocket(
8888
);
Socket socket =
null
;
//记录客户端的数量
int
count =
0
;
System.out.println(
"***服务器即将启动,等待客户端的链接***"
);
//循环监听等待客户端的链接
while
(
true
){
//调用accept()方法开始监听,等待客户端的链接
socket = serverSocket.accept();
//创建一个新的线程
ServerThread serverThread =
new
ServerThread(socket);
//启动线程
serverThread.start();
count++;
//统计客户端的数量
System.out.println(
"客户端的数量: "
+ count);
InetAddress address = socket.getInetAddress();
System.out.println(
"当前客户端的IP : "
+ address.getHostAddress());
}
}
catch
(IOException e) {
e.printStackTrace();
}
}
}
服务器端线程处理类ServerThread.java
package
test.concurrent.socket;
import
java.io.*;
import
java.net.Socket;
/**
* Created by dong on 15-6-22.
* 服务器端线程处理类
*/
public
class
ServerThread
extends
Thread {
//和本线程相关的Socket
Socket socket =
null
;
public
ServerThread(Socket socket){
this
.socket = socket;
}
//线程执行的操作,响应客户端的请求
public
void
run(){
InputStream is =
null
;
InputStreamReader isr =
null
;
BufferedReader br =
null
;
OutputStream os =
null
;
PrintWriter pw =
null
;
try
{
//获取一个输入流,并读取客户端的信息
is = socket.getInputStream();
isr =
new
InputStreamReader(is);
//将字节流转化为字符流
br =
new
BufferedReader(isr);
//添加缓冲
String info =
null
;
//循环读取数据
while
((info = br.readLine()) !=
null
){
System.out.println(
"我是服务器,客户端说: "
+info);
}
socket.shutdownInput();
//关闭输入流
//获取输出流,响应客户端的请求
os = socket.getOutputStream();
pw =
new
PrintWriter(os);
//包装为打印流
pw.write(
"欢迎你"
);
pw.flush();
//将缓存输出
}
catch
(IOException e) {
e.printStackTrace();
}
finally
{
try
{
//关闭资源
if
(pw !=
null
)
pw.close();
if
(os !=
null
)
os.close();
if
(is !=
null
)
is.close();
if
(isr !=
null
)
isr.close();
if
(br !=
null
)
br.close();
if
(socket !=
null
)
socket.close();
}
catch
(IOException e) {
e.printStackTrace();
}
}
}
}
客户端Client.java
package
test.concurrent.socket;
import
java.io.*;
import
java.net.Socket;
/**
* Created by dong on 15-6-22.
* 客户端
*/
public
class
Client {
public
static
void
main(String[] args) {
try
{
//1、创建客户端Socket,指定服务器端口号和地址
Socket socket =
new
Socket(
"localhost"
,
8888
);
//2、获取输出流,向服务器发送信息
OutputStream os = socket.getOutputStream();
//字节输出流
PrintWriter pw =
new
PrintWriter(os);
//将输出流包装为打印流
pw.write(
"用户名:tom; 密码:456"
);
pw.flush();
socket.shutdownOutput();
//关闭输出流
InputStream is = socket.getInputStream();
InputStreamReader isr =
new
InputStreamReader(is);
BufferedReader br =
new
BufferedReader(isr);
String info =
null
;
//循环读取
while
((info = br.readLine()) !=
null
){
System.out.println(
"我是客户端:服务器说:"
+ info);
}
br.close();
is.close();
isr.close();
pw.close();
os.close();
socket.close();
}
catch
(IOException e) {
e.printStackTrace();
}
}
}
阅读全文
0 0
- java多线程实现服务器端与多客户端之间的通信
- 应用java多线程实现服务器端与多客户端之间的通信
- 应用java多线程实现服务器端与多客户端之间的通信
- C#基于TCP&UDP实现服务器与多个客户端之间的通信(客户端之间直接通信,不靠服务器端转发消息)
- 用socketchannel实现多客户端与服务器端的通信
- java与c语言之间的socket通信—java客户端c服务器端
- java与c语言之间的socket通信—c客户端java服务器端
- 基于TCP的客户端与服务器端之间的通信
- 客户端与服务器端的通信
- 客户端与服务器端的通信
- iOS客户端与服务器端Node.js实现通信的方法
- C++ 简单的 Tcp 实现[socket] 服务器端与客户端通信
- java-基本的Socket编程-实现服务器端和客户端通信
- 利用多线程和TCP技术,实现客户端与服务端之间的通信
- Android 实现蓝牙客户端与服务器端通信
- 利用rmi实现客户端与服务器端通信
- JAVA Socket 多线程实现多客户端的通信
- Java客户端与C++服务器端通信
- C编程(三)流程控制之选择
- 面向对象程序设计
- C++ 运算符 重载
- DAY31继承派生、组合、接口和抽象类
- EA&UML日拱一卒-活动图::CallOperationAction
- java多线程实现服务器端与多客户端之间的通信
- Hash冲突解决——拉链法
- 提高网页加载速度的方法
- Jenkins入门系列之——02第二章 Jenkins安装与配置
- python3 [爬虫入门实战] 爬虫之爬取盘多多文档(百万数据)
- 2017上
- 基于HTML5的五子棋游戏
- RxJava汇总--完善中。。。
- 【MyEclipse】设置JSP默认编辑器