服务器程序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编程的一个例子(线程池)相关推荐

  1. java 对象 线程安全_JAVA并发编程学习:构造线程安全的对象

    设计线程安全的类 实例限制 当一个对象被另一个对象封装时,所有访问被被封装对象的代码路径就是全部可知的,这相比于让对象可被整个系统访问来说,更容易对代码路径进行分析.将数据封装在对象内部,把对数据的访 ...

  2. c++ socket线程池_java 网络编程,Socket编程

    Java的网络编程主要涉及到的内容是Socket编程,那么什么是Socket呢?简单地说,Socket,套接字,就是两台主机之间逻辑连接的端点.TPC/IP协议是传输层协议,主要解决数据如何在网络中传 ...

  3. java 线程工厂_Java并发编程:Java的四种线程池的使用,以及自定义线程工厂

    引言 通过前面的文章,我们学习了Executor框架中的核心类ThreadPoolExecutor ,对于线程池的核心调度机制有了一定的了解,并且成功使用ThreadPoolExecutor 创建了线 ...

  4. java线程池_Java 并发编程 线程池源码实战

    作者 | 马启航 杏仁后端工程师.「我头发还多,你们呢?」 一.概述 笔者在网上看了好多的关于线程池原理.源码分析相关的文章,但是说实话,没有一篇让我觉得读完之后豁然开朗,完完全全的明白线程池,要么写 ...

  5. java socket 丢字节_Java:socket消息丢失了

    我们正在开发一个Java(1.6)服务器应用程序,它是一个事务服务器,通过TCP套接字监听连接.每个新连接都会创建一个新线程,该线程将保持活动状态,直到连接关闭 每个客户端都会将事务发送到将要处理的服 ...

  6. java socket远空_JAVA Socket超时浅析

    套接字或插座(socket)是一种软件形式的抽象,用于表达两台机器间一个连接的"终端".针对一个特定的连接,每台机器上都有一个"套接字",可以想象它们之间有一条 ...

  7. java socket负载均衡_Java Socket分发服务负载均衡

    1 1. 设备请求分发服务器,分发服务器返回有效的socket服务器ip与port,然后断开连接.2 a) 设备与服务器建立连接.3 b) 服务器接收到连接请求后,立即将分配好的socket服务器ip ...

  8. java统计系统线程数_Java并发(八)计算线程池最佳线程数

    目录 一.理论分析 二.实际应用 为了加快程序处理速度,我们会将问题分解成若干个并发执行的任务.并且创建线程池,将任务委派给线程池中的线程,以便使它们可以并发地执行.在高并发的情况下采用线程池,可以有 ...

  9. c++ 线程池_JAVA并发编程:线程池ThreadPoolExecutor源码分析

    前面的文章已经详细分析了线程池的工作原理及其基本应用,接下来本文将从底层源码分析一下线程池的执行过程.在看源码的时候,首先带着以下两个问题去仔细阅读.一是线程池如何保证核心线程数不会被销毁,空闲线程数 ...

最新文章

  1. 16个让你烧脑让你晕的悖论
  2. 使用Java和JCEKS进行AES-256加密
  3. android变量要不要附空值,android-如何在使用Parcelable时序列化空值
  4. JavaScript服务器端开发技术(对象属性的枚举与查询)
  5. vue 中indexof_大厂Vue最佳实践总结,提高竞争力!
  6. ImportError: Missing optional dependency ‘xlrd‘. Install xlrd >= 1.0.0 for Excel support Use pip or
  7. 用Java控制小电灯-树莓派PI4J
  8. 数据结构 2-0 线性表总结
  9. expect的安装与使用
  10. HBase Shell 命令私藏
  11. 简单的POST sql注入
  12. Carryon 数数字——小米 OJ 编程比赛 02 月常规赛(思维)
  13. 日本語 IME输入法(Microsoft 输入法)切换问题
  14. c语言编码任务描述,C语言委派任务问题代码及解析
  15. 逍遥棋牌怎么样,是不是骗人的?
  16. 亚马逊云服务(AWS)中国宁夏及北京区域正式上线Amazon SageMaker
  17. 大数据入门--windows安装sqlite3
  18. Golang修改图片JPEGjpg的大小和质量
  19. 基于SnapDragonBoard410c内置文佳到System
  20. 细说Linux的就业方向

热门文章

  1. 结合Apache Kafka生态系统,谈谈2018年机器学习5大趋势
  2. Python数据预处理:使用Dask和Numba并行化加速
  3. PyODPS 安装常见问题解决
  4. Google 宣布推出隐私计算核心服务;Amazon Managed Grafana正式可用……
  5. 看穿这些套路,你的kubernetes会更香
  6. K8S的SDN容器网络解决方案【机制篇】
  7. hpsocket java代码_HPSocket介绍与使用
  8. php网站加广告位,HotNews Pro主题文章内容上面添加广告位
  9. Nacos 集群集成SpringBoot2.x 微服务_02
  10. 前端的葵花宝典 - 红宝书《JavaScript高级程序设计(第4版)》学习笔记