多线程服务端与客户端通信(IO是阻塞的)_02
下面是多线程的;每次服务端接受请求,会创建一个线程专门处理这个请求;
虽然是多线程的,但还是阻塞,相当于单线程处理模式
public class TimeServer { public static void main(String[] args) { int port = 8088;//端口号
ServerSocket server = null;
try {
server = new ServerSocket(port); System.out.println("The time server is start in port:"+port);
Socket socket = null;
while(true){
//监听客户端,客户端向服务端发送请求,接收
socket = server.accept();
//当监听到客户端请求,服务端会启动一个线程,处理客户端相关业务;服务器端实现多线程
new Thread(new TimeServerHandler(socket)).start();
} } catch (IOException e) {
e.printStackTrace();
}finally{
if(server != null){
System.out.println("the server close");
try {
server.close();
} catch (IOException e) {
e.printStackTrace();
}
server = null;
}
}
}
}
---
服务器处理类;new TimeServerHandler(socket)将socket传入进去,然后生成输入、输出流出处理
public class TimeServerHandler implements Runnable{
private Socket socket; public TimeServerHandler(Socket socket){
this.socket = socket;
} @Override
public void run() {
BufferedReader in = null;
PrintWriter out = null; try {
in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
out = new PrintWriter(this.socket.getOutputStream());
String currentTime = null;
String body = null;
while(true){
//读取客户端信息
body = in.readLine();
if(body == null)
break;
System.out.println("the time server receive order:"+body);
currentTime = "QUERY TIME ORDER".equalsIgnoreCase(body) ?
new java.util.Date(System.currentTimeMillis()).toString() : "BAD ORDER";
out.println(currentTime);
} } catch (Exception e) {
if(in != null){
try {
in.close();
} catch (IOException e1) {
e1.printStackTrace();
}
} if(out != null){
out.close();
} if(socket != null){
try {
socket.close();
} catch (IOException e1) {
e1.printStackTrace();
}
this.socket = null;
} }
} }
------
客户端
public class TimeClient { public static void main(String[] args) { int port = 8088;//端口
BufferedReader in = null;
PrintWriter out = null;
Socket socket = null;
try {
//根据ip地址和端口连接服务器;
socket = new Socket("127.0.0.1", 8088);
//使用IO流读取或写入信息
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream());
out.println("QUERY TIME ORDER");
System.out.println("send order 2 server succeed");
String resp = in.readLine();
System.out.println("NOW IS:"+resp);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(out != null){
out.close();
}
if(in != null){
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(socket != null){
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
socket = null;
}
}
}
}
多线程服务端与客户端通信(IO是阻塞的)_02的更多相关文章
- Netty 学习(二):服务端与客户端通信
Netty 学习(二):服务端与客户端通信 作者: Grey 原文地址: 博客园:Netty 学习(二):服务端与客户端通信 CSDN:Netty 学习(二):服务端与客户端通信 说明 Netty 中 ...
- C#Winform窗体实现服务端和客户端通信例子(TCP/IP)
Winform窗体实现服务端和客户端通信的例子,是参考这个地址 http://www.cnblogs.com/longwu/archive/2011/08/25/2153636.html 进行了一些异 ...
- (C#:Socket)简单的服务端与客户端通信。
要求:1.可以完成一对一的通信:2.实现服务端对客户端一对多的选择发送:3.可以实现服务端的群发功能:4.可以实现客户端文件的发送: 要点:服务器端:第一步:用指定的端口号和服务器的ip建立一个End ...
- C# Socket服务端与客户端通信(包含大文件的断点传输)
步骤: 一.服务端的建立 1.服务端的项目建立以及页面布局 2.各功能按键的事件代码 1)传输类型说明以及全局变量 2)Socket通信服务端具体步骤: (1)建立一个Socket (2)接收 ...
- java网络编程-单线程服务端与客户端通信
该服务器一次只能处理一个客户端请求;p/** * 利用Socket进行简单服务端与客户端连接 * 这是服务端 */public class EchoServer { private ServerSoc ...
- java的服务端与客户端通信(2)
一.Socket连接与HTTP连接 1.1Socket套接字 套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元.它是网络通信过程中端点的抽象表示,包含进行网络通信 ...
- java的服务端与客户端通信(1)
一.理解socket 1.1什么是socket? socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络 ...
- NIO服务端和客户端通信demo
代码转自 https://www.jianshu.com/p/a9d030fec081 服务端: package nio; import java.io.IOException; import jav ...
- python 学习笔记_2 模拟socket编程 服务端、客户端通信(参考核心编程2代码实现)
服务器端代码实现: #!/usr/bin/env python#coding=gbk'''接收客户端字符串,在字段串前面打上当前时间,然后返回server端采用 python2 linux下调试运行客 ...
随机推荐
- MATLAB EMD 初始
帮小伙伴研究这个 随便写写 安装参考https://blog.csdn.net/qrlhl/article/details/52213135 函数学习: disp函数 : 1.disp函数:显示文本 ...
- Spring-Cloud-Netflix
Spring Cloud Netflix组件以及部署 (1)Eureka,服务注册和发现,它提供了一个服务注册中心.服务发现的客户端,还有一个方便的查看所有注册的服务的界面. 所有的服务使用Eurek ...
- 8. Security-oriented operating systems (面向安全的操作系统 5个)
这款出色的可启动live CD的Linux发行版来自于Whax和Auditor的合并. 它拥有各种各样的安全和取证工具,并提供丰富的开发环境. 强调用户模块化,所以用户可以轻松地定制以包括个人脚本,附 ...
- 利用python实现两个文件夹的同步
其实无论windows还是Linux,简单地去实现两个两个文件夹的同步只需系统自带的复制命令加参数就可以了. WINDOWS : xcopy 源文件夹\* 目标文件夹 /s /e /y Linux : ...
- 使用python编辑和读取word文档
python调用word接口主要用到的模板为python-docx,基本操作官方文档有说明. python-docx官方文档地址 使用python新建一个word文档,操作就像文档里介绍的那样: fr ...
- javascript window对象常用方法
方法名称 prompt():显示可提示用户输入的对话框 alert():显示带有一个提示信息和 一个确定按钮的警示框 confirm():显示一个 带有提示信息.确定和取消按钮的对话框 open(): ...
- [C++]_ELVE_Windows下QT5.12连接MySql8.0解决方案
#0x01 准备 1)要保证QT和MySQL都是一样的位数,我的就是都安装的64位. 2)安装Qt5.12,这里主要提一点,在安装时候,有个选择插件那块,尽量都选上,里面有个database选项,记得 ...
- vue-cil 服务端预渲染 prerender-spa-plugin
众所周知单页面应用不利于SEO,为了解决这个问题网上所给出的2个解决方案1.SSH服务器端渲染2.预渲染由于页面较少,且预渲染相对于SSH比较简单,于是选择预渲染页面,预渲染可以极大的提高网页访问速度 ...
- c# 获取 com 引用真实组件地址
1.根据guid获取 var clsid = new Guid("63EA2B90-C5A8-46F4-8A6E-2F2436C80003").ToString("B&q ...
- Qt creator使用笔记
设置头文件的搜索路径编辑项目文件 xxx.pro INCLUDEPATH = /src/doip \ /src/doip/utils \ /src/doip/pduR \ /src/doip/uds1 ...