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();

}

}

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527911.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java是值传递还是引用传递_Java 到底是值传递还是引用传递?

点赞、收藏还挺多,求一波关注------------------------------------------------------------没人邀请,自己强行回答一波。关于这个问题,引发过很多广泛的讨论,看来很多程序员对于这个问题的理解都不尽相同,甚至很多人…

java趣事_【趣事】Java程序员最年轻,C++程序员最年老

原标题:【趣事】Java程序员最年轻,C程序员最年老说起我们对编程世界现有的刻板印象,你一定听说过类似于没有人喜欢用Java编码或者使用C 都是老人家,等等这样的话。为了分析这些刻板印象背后的真相,Trestle Technology的…

koa2 mysql 中间件_Koa2 和 Express 中间件对比

koa2 中间件koa2的中间件是通过 async await 实现的,中间件执行顺序是“洋葱圈”模型。中间件之间通过next函数联系,当一个中间件调用 next() 后,会将控制权交给下一个中间件, 直到下一个中间件不再执行 next() 后, 将会沿路折返,将控制权依次交换给前一…

mysql 索引 内存_mysql索引【第三篇】

##innodb引擎的数据是按页为单位的,当需要读一条记录时,并不是将这个记录本身从磁盘中读取出来,而是以页为单位将整个页读取到内存中,每个页默认大小为16kb数据查询过程: 磁盘---->内存---->返回结果数据更新过…

python notebook配置_使用 Jupyter Notebook 配置 Stata\Python\Julia\R

作者:许梦洁 (中山大学)E-mail: xumj9mail2.sysu.edu.cn原文链接:磐石若水 → 使用 Jupyter Notebook 配置 Stata/Python/Julia/RStata 连享会   课程主页 || 直播视频 || 知乎推文扫码查看连享会最新专题、公开课视频和 100 多个码云计量仓库链接。早在…

qt 飞扬青云_Qt编写带频谱的音乐播放器

之前有个项目需要将音频文件的频谱显示出来,想了很多办法,后面发现fmod这个好东西,还是跨平台的,就一个头文件一个库文件就行,简单小巧功能强大,人家做的真牛逼。为了不卡住界面,采用了多线程处…

java什么是工作流程_springmvc工作流程是什么

springmvc工作流程是什么:1、springmvc工作原理图2、springmvc工作流程1、 用户向服务端发送一次请求,这个请求会先到前端控制器DispatcherServlet(也叫中央控制器)。2、DispatcherServlet接收到请求后会调用HandlerMapping处理器映射器。由此得知&#…

java se入门_java SE 入门之运算符(第三篇)

在 java 中主要有以上运算符,分为 赋值运算符 ,算术运算符、关系运算符(比较运算符),逻辑运算符和三目运算符(三元运算符).我们一起来学习下吧!一、赋值运算符赋值运算符主要有五个、分别是 (赋值)、(加上一个在赋值)、-(减去一个在赋值)、*…

java 封闭实例_不能访问类型…的封闭实例

出于教育目的,我尝试制作一个服务器和一个客户端,其中服务器从多个客户端接收数据并回显每条消息。问题是,当我尝试让服务器一次将回显发送到所有客户端时。public class SocketServer {ArrayList ts new ArrayList();ServerSocket serv;sta…

java接口权限管理在哪里_JAVA-访问权限控制

以前对于public、private、protect、default,都只是简单的知道其对应的访问权限范围,现在看了think in java中的描述,讲了这几种访问权限在什么场景下使用,觉得进一步的了解的它存在的意义和合理性。因为在我们的日常开发中&#…

java 重写session_使用Shiro重写Session 自定义SESSION

引入shiro的jar包1.2.3org.apache.shiroshiro-core${shiroVersion}org.apache.shiroshiro-web${shiroVersion}org.apache.shiroshiro-ehcache${shiroVersion}org.apache.shiroshiro-spring${shiroVersion}配置shiro(web.xml)shiroFilterorg.springframework.web.filter.Delegat…

java7最后战线_我的世界最后战线2.0整合包

我的世界1.7.2最后战线The end battle line正式V2修复版是我的世界最后战线2.0整合包。游戏信息地图名字: The End Battle Line「正式版」地图分类: 其他地图类型: 存档地图版本: 后期Anvil格式(1.3)游戏介绍>>前言<<经过了半学期加整整大半个暑假的努力&#xff0…

js添加多marker 高德地图_覆盖物-参考手册-地图 JS API | 高德地图API

覆盖物覆盖物是指叠加在地图底图之上的一些常见要素&#xff0c;包括Marker类点标记。 构造函数 说明AMap.Marker( 构造一个点标记对象&#xff0c;通过MarkerOptions设置点标记对象的属性MarkerOptions 类型 说明map 要显示该marker的地图对象position 点标记在地图上显示的位…

java敏感异常是什么_java中的异常是什么?

Throwable(所有error和exception的父类:超类)Java将错误变成对象交给异常处理机制Error(仅靠程序本身无法恢复的严重错误)一般是环境的问题&#xff0c;JVM的问题&#xff0c;并非程序的问题&#xff1b;最典型的就是虚拟机中运行的程序过多&#xff0c;造成的虚拟机内存溢出&a…

java为什么不推荐使用stack_栈和队列的面试题Java实现,Stack类继承于Vector这两个类都不推荐使用...

在 thinking in java中看到过说Stack类继承于Vector&#xff0c;而这两个类都不推荐使用了&#xff0c;但是在做一到OJ题时&#xff0c;我用LinkedList来模拟栈和直接用Stack&#xff0c;发现在进行入栈出栈操作时Stack的速度竟然还快一点然而需要多线程的时候有Collections.sy…

reducebykeyandwindow java_Spark Streaming笔记整理(三):DS的transformation与output操作

[TOC]DStream的各种transformationTransformation Meaningmap(func) 对DStream中的各个元素进行func函数操作&#xff0c;然后返回一个新的DStream.flatMap(func) 与map方法类似&#xff0c;只不过各个输入项可以被输出为零个或多个输出项filter(func) 过滤出所有函数func返回值…

java mysubmail_关于MyBatis10种超好用的写法(收藏)

用来循环容器的标签forEach,查看例子foreach元素的属性主要有item&#xff0c;index&#xff0c;collection&#xff0c;open&#xff0c;separator&#xff0c;close。item&#xff1a;集合中元素迭代时的别名index&#xff1a;集合中元素迭代时的索引open&#xff1a;常用语w…

php学好要多久,零基础php自学要多久

万事开头难&#xff0c;自学编程也是一样&#xff0c;只要能入门&#xff0c;在学起来就容易多了&#xff0c;那么零基础自学编程多久才可以入门呢&#xff0c;如何才能找到自学编程的门道呢&#xff1f; (推荐学习&#xff1a;PHP视频教程)零基础自学编程也可以&#xff0c;关…

php laravel 优点,Laravel 特点有哪些?

Laravel特点&#xff1a;1、“artisan”命令行工具&#xff0c;可以自动化完成手动的工作&#xff1b;2、“migration”管理数据库和版本控制&#xff1b;3、测试功能也很强大&#xff1b;4、适合应用各种开发模式TDD、DDD和BDD&#xff1b;5、支持Composer包管理工具。Laravel…

php枚举mysql,小技巧:取得MYSQL中ENUM(枚举)列的全部可能值。-PHP教程,PHP应用...

取得mysql中enum(枚举)列的全部可能值这里其实并不需要其它的什么函数来支持&#xff0c;只需要使用mysql提供的一些sql语句就可以了。这里为了简单起见&#xff0c;以mysql的系统表user为例&#xff0c;取出select&#xff3f;priv这一列的所有可能值。方法&#xff1a;show c…