JAVA语言 Socket模拟简单的通讯(代码实例)
小标 2018-09-11 来源 : 阅读 935 评论 0

摘要:本文主要向大家介绍了JAVA语言 Socket模拟简单的通讯(代码实例),通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了JAVA语言 Socket模拟简单的通讯(代码实例),通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

依旧使用bio流。
使用线程池技术,管理服务器线程。
实现服务器关机处理,解决大部分异常处理。
package xin.tomdonkey.net.bio; import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit; public class Server{ /**  * 循环标记,是否执行接受新连接的标记  * 仅标记是否接受新连接,不标记其他状态  */ private int port; private boolean life; private ServerSocket serverSocket ; private ExecutorService threadPool = Executors.newCachedThreadPool();  public void startup() {  while (life)  {try{ Socket socket = serverSocket.accept(); threadPool.submit(new ServerClient(socket)); System.out.println("一个新任务进入线程池"); System.out.println("当前线程池为:" + threadPool);}catch (IOException e){ System.err.println("serverSocket被关闭了,主循环解除阻塞");}  } }  public void shutDown() {  life = false;  System.err.println("主循环退出");  try  {serverSocket.close();  }  catch (IOException e)  {e.printStackTrace();  }  shutdownAndAwaitTermination(threadPool);  System.err.println("系统正常退出"); }  /**  * 此方法一定无法终止此程序下正在运行的线程,  * 此方法只能让能响应interrupt的线程终止  * 而此程序下使用的是bio,并不会抛出interrupt  * 故而只会等待线程10s执行时间,为执行完成,直接终止程序。  * @param pool  */ private void shutdownAndAwaitTermination(ExecutorService pool) {  pool.shutdown();  try  {if (!pool.awaitTermination(5, TimeUnit.SECONDS)){ pool.shutdownNow(); if (!pool.awaitTermination(5, TimeUnit.SECONDS)) {  System.err.println("线程池中存在无法被关闭的线程...");  System.err.println("系统强制关闭...");  System.exit(-1); }}  }  catch (InterruptedException ie)  {pool.shutdownNow();Thread.currentThread().interrupt();  } }  /**  * 采用默认端口6655创建服务器  *  * @throws IOException  */ public Server() throws IOException {  this(6655); }  /**  * 指定端口port创建服务器  *  * @param port 服务器监听的端口  * @throws IOException  */ public Server(int port) throws IOException {  this.port = port;  this.life = true;  this.serverSocket = new ServerSocket(port); }  public static void main(String[] args) throws IOException {  Server server = new Server();  new Thread(()->{try{ Thread.sleep(20000);}catch (InterruptedException e){ e.printStackTrace();}server.shutDown();  }).start();  server.startup(); }}
package xin.tomdonkey.net.bio; import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;import java.util.Random; public class ServerClient implements Runnable{ private boolean flag; private InputStream inputStream ; private OutputStream outputStream ;  public ServerClient(Socket socket) {  flag = true;  try  {this.inputStream = socket.getInputStream();this.outputStream = socket.getOutputStream();  }  catch (IOException e)  {flag = false;System.err.println("服务器获取输入输出流时,socket出现异常,run方法将执行空语句,直接退出线程");  } }   @Override public void run() {  while (flag)  {try{ //线程启动,即阻塞,直到客户端发出数据 //可以做一个优化,收不到数据即销毁当前线程以及链接和流 int  r= inputStream.read(); System.out.println("服务器收到:" + r);  //收到后即回复给客户端一个随机值 byte b = (byte)new Random().nextInt(100); outputStream.write(b); System.out.println("服务器写出:" + b);  System.out.println("完成一次回复\n");}catch (IOException e){ //客户端掉线了,或者IO出现问题抛出此异常,让此线程运行终止 System.out.println("由于客户端发生异常,关闭此服务线程"); flag = false;}  } }}
package xin.tomdonkey.net.bio; import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;import java.util.Random; public class Client{ Socket socket ; boolean flag = false; InputStream inputStream ; OutputStream outputStream ;  public Client(String address,int port) throws IOException {  this.socket = new Socket(address,port);  this.inputStream = socket.getInputStream();  this.outputStream = socket.getOutputStream(); }  public void startup() throws IOException, InterruptedException {  flag = true;  while (flag)  {//由客户端发起,向服务器写出数据,一个随机byte值byte b = (byte)new Random().nextInt(100);outputStream.write(b);System.out.println("写出:" + b); //写出完成之后,线程阻塞,直到收到服务器发来的值为止int r = inputStream.read();System.out.println("收到:" + r);System.out.println("完成一次请求\n"); //收到之后线程休眠2s,再向服务器写出数据Thread.sleep(2000);  } }  public static void main(String[] args) throws IOException, InterruptedException {  Client client = new Client("127.0.0.1",6655);  client.startup(); }}    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程