java socket 线程池_java socket编程的一个例子(线程池)
服务器程序EchoServer.java;
import java.io.*;
import java.net.*;
import java.util.concurrent.*;
public class EchoServer {
private int port=10000;
private ServerSocket serverSocket;
private ExecutorService executor;//线程池
private final int pool_size=4;
private int portForShutdown=10001;
private ServerSocket serverSocketForShutdown=null;
private boolean isShutdown=false;
private Thread shutdownThread=new Thread() //负责关闭服务器的线程
{
public void start()
{
this.setDaemon(true); //设为守护线程
super.start();
}
public void run()
{
while(!isShutdown)
{
Socket socketForShutdown=null;
try{
socketForShutdown=serverSocketForShutdown.accept();
BufferedReader br=new BufferedReader(new InputStreamReader(socketForShutdown.getInputStream()));
String command=br.readLine();
if(command.equals("shutdown"))
{
long beginTime=System.currentTimeMillis();
socketForShutdown.getOutputStream().write("服务器正在关闭\r\n".getBytes());
isShutdown=true;
executor.shutdown();
while(!executor.isTerminated())
{
executor.awaitTermination(30, TimeUnit.SECONDS);
}
serverSocket.close();
long endTime=System.currentTimeMillis();
socketForShutdown.getOutputStream().write(("服务器已经关闭,耗时"+(beginTime-endTime)+"毫秒\r\n").getBytes());
socketForShutdown.close();
}else
{
socketForShutdown.getOutputStream().write("错误的命令\r\n".getBytes());
//socketForShutdown.close();
}
}catch(IOException e){
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
public EchoServer() throws IOException{
serverSocket=new ServerSocket(port);
serverSocket.setSoTimeout(60000);
serverSocketForShutdown=new ServerSocket(portForShutdown);
shutdownThread.start();
System.out.println("server started...");
}
public void service(){
while(!isShutdown){
Socket socket=null;
try {
socket=serverSocket.accept();
executor=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*pool_size);
executor.execute(new Handler(socket));
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String args[]){
try {
new EchoServer().service();
} catch (IOException e) {
e.printStackTrace();
}
}
}
***********************************************************************************
客户端程序EchoClient.java:
import java.io.*;
import java.net.*;
import java.util.*;
public class EchoClient {
private String host="localhost";
private int port=10000;
Socket socket=null;
public EchoClient() throws IOException{
socket=new Socket(host,port);
}
public static void main(String args[]){
try {
new EchoClient().talk();
} catch (IOException e) {
e.printStackTrace();
}
}
private PrintWriter getWriter(Socket socket)throws IOException{
OutputStream socketOut=socket.getOutputStream();
return new PrintWriter(socketOut,true);
}
private BufferedReader getReader(Socket socket)throws IOException{
InputStream socketIn=socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
}
public void talk(){
try{
BufferedReader br=this.getReader(socket);
PrintWriter pw=this.getWriter(socket);
BufferedReader localReader=new BufferedReader(new InputStreamReader(System.in));
String msg=null;
while((msg=localReader.readLine())!=null){
pw.println(msg);
System.out.println(br.readLine());
if(msg.equalsIgnoreCase("bye"))
break;
}
}catch(IOException e){
e.printStackTrace();
}finally{
if(socket!=null)
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
*****************************************************************************************************************
Handler.java
import java.net.*;
import java.io.*;
public class Handler implements Runnable {
private Socket socket=null;
public Handler(Socket socket)
{
this.socket=socket;
}
public void run() {
try{
System.out.println("New connection accepted "+socket.getInetAddress()+":"+socket.getPort());
BufferedReader br=getReader(socket);
PrintWriter pw=this.getWriter(socket);
String msg=null;
while((msg=br.readLine())!=null)
{
System.out.println("server received: "+msg);
pw.println(echo(msg));
if(msg.equalsIgnoreCase("bye"))
break;
}
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(socket!=null)socket.close();
System.out.println("connection close..");
}
catch(IOException e){
e.printStackTrace();
}
}
}
public String echo(String msg){
return "echo:--->"+msg;
}
private PrintWriter getWriter(Socket socket)throws IOException{
OutputStream socketOut=socket.getOutputStream();
return new PrintWriter(socketOut,true);
}
private BufferedReader getReader(Socket socket)throws IOException{
InputStream socketIn=socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
}
}
******************************************************************************************************************
import java.net.*;
import java.io.*;
public class AdminClient {
public static void main(String args[])
{
Socket socket=null;
int port=10001;
try {
socket =new Socket("localhost",port);
OutputStream out=socket.getOutputStream();
out.write("shutdown\r\n".getBytes());
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String msg=br.readLine();
System.out.println(msg);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(socket!=null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
java socket 线程池_java socket编程的一个例子(线程池)相关推荐
- java 对象 线程安全_JAVA并发编程学习:构造线程安全的对象
设计线程安全的类 实例限制 当一个对象被另一个对象封装时,所有访问被被封装对象的代码路径就是全部可知的,这相比于让对象可被整个系统访问来说,更容易对代码路径进行分析.将数据封装在对象内部,把对数据的访 ...
- c++ socket线程池_java 网络编程,Socket编程
Java的网络编程主要涉及到的内容是Socket编程,那么什么是Socket呢?简单地说,Socket,套接字,就是两台主机之间逻辑连接的端点.TPC/IP协议是传输层协议,主要解决数据如何在网络中传 ...
- java 线程工厂_Java并发编程:Java的四种线程池的使用,以及自定义线程工厂
引言 通过前面的文章,我们学习了Executor框架中的核心类ThreadPoolExecutor ,对于线程池的核心调度机制有了一定的了解,并且成功使用ThreadPoolExecutor 创建了线 ...
- java线程池_Java 并发编程 线程池源码实战
作者 | 马启航 杏仁后端工程师.「我头发还多,你们呢?」 一.概述 笔者在网上看了好多的关于线程池原理.源码分析相关的文章,但是说实话,没有一篇让我觉得读完之后豁然开朗,完完全全的明白线程池,要么写 ...
- java socket 丢字节_Java:socket消息丢失了
我们正在开发一个Java(1.6)服务器应用程序,它是一个事务服务器,通过TCP套接字监听连接.每个新连接都会创建一个新线程,该线程将保持活动状态,直到连接关闭 每个客户端都会将事务发送到将要处理的服 ...
- java socket远空_JAVA Socket超时浅析
套接字或插座(socket)是一种软件形式的抽象,用于表达两台机器间一个连接的"终端".针对一个特定的连接,每台机器上都有一个"套接字",可以想象它们之间有一条 ...
- java socket负载均衡_Java Socket分发服务负载均衡
1 1. 设备请求分发服务器,分发服务器返回有效的socket服务器ip与port,然后断开连接.2 a) 设备与服务器建立连接.3 b) 服务器接收到连接请求后,立即将分配好的socket服务器ip ...
- java统计系统线程数_Java并发(八)计算线程池最佳线程数
目录 一.理论分析 二.实际应用 为了加快程序处理速度,我们会将问题分解成若干个并发执行的任务.并且创建线程池,将任务委派给线程池中的线程,以便使它们可以并发地执行.在高并发的情况下采用线程池,可以有 ...
- c++ 线程池_JAVA并发编程:线程池ThreadPoolExecutor源码分析
前面的文章已经详细分析了线程池的工作原理及其基本应用,接下来本文将从底层源码分析一下线程池的执行过程.在看源码的时候,首先带着以下两个问题去仔细阅读.一是线程池如何保证核心线程数不会被销毁,空闲线程数 ...
最新文章
- 16个让你烧脑让你晕的悖论
- 使用Java和JCEKS进行AES-256加密
- android变量要不要附空值,android-如何在使用Parcelable时序列化空值
- JavaScript服务器端开发技术(对象属性的枚举与查询)
- vue 中indexof_大厂Vue最佳实践总结,提高竞争力!
- ImportError: Missing optional dependency ‘xlrd‘. Install xlrd >= 1.0.0 for Excel support Use pip or
- 用Java控制小电灯-树莓派PI4J
- 数据结构 2-0 线性表总结
- expect的安装与使用
- HBase Shell 命令私藏
- 简单的POST sql注入
- Carryon 数数字——小米 OJ 编程比赛 02 月常规赛(思维)
- 日本語 IME输入法(Microsoft 输入法)切换问题
- c语言编码任务描述,C语言委派任务问题代码及解析
- 逍遥棋牌怎么样,是不是骗人的?
- 亚马逊云服务(AWS)中国宁夏及北京区域正式上线Amazon SageMaker
- 大数据入门--windows安装sqlite3
- Golang修改图片JPEGjpg的大小和质量
- 基于SnapDragonBoard410c内置文佳到System
- 细说Linux的就业方向
热门文章
- 结合Apache Kafka生态系统,谈谈2018年机器学习5大趋势
- Python数据预处理:使用Dask和Numba并行化加速
- PyODPS 安装常见问题解决
- Google 宣布推出隐私计算核心服务;Amazon Managed Grafana正式可用……
- 看穿这些套路,你的kubernetes会更香
- K8S的SDN容器网络解决方案【机制篇】
- hpsocket java代码_HPSocket介绍与使用
- php网站加广告位,HotNews Pro主题文章内容上面添加广告位
- Nacos 集群集成SpringBoot2.x 微服务_02
- 前端的葵花宝典 - 红宝书《JavaScript高级程序设计(第4版)》学习笔记