一、思路

  1. 监听端口:在服务器端创建一个ServerSocket对象,去监听某个端口

  2. 创建连接:通过serverSocket.accept() 创建一个Socket对象,等待客户端连接,当有客户端连接到这个端口,Socket对象就创建成功

  3. 接收消息:client.getInputStream() 阻塞式接收客户端往这个端口发送的消息

二、简单代码实现

public static void main(String[] args) throws IOException {int port = 8234;// 1. 创建ServerSocket对象,去监听端口号try (ServerSocket serverSocket = new ServerSocket(port)) {System.out.println("启动程序监听8234端口...");Socket client = null;Boolean flag = true;while (flag) {// 2. 创建Socket对象去等待客户端连接client = serverSocket.accept();System.out.println("客户端" + client.getInetAddress().getHostAddress() + "连接到服务器...");// 3. 当客户端连接上之后,创建一个线程去处理这个客户端发送的数据,然后等待下一个客户端的连接new Thread(new ProcessDataThread(client)).start();}client.close();System.out.println("服务器关闭");}}
public class ProcessDataThread implements Runnable {private Socket client;public ProcessDataThread(Socket socket) {this.client = socket;}@Overridepublic void run() {try {// 1. 获取客户端发送过来的消息,此时是通过二进制流获取,也可以用InputStreamReader通过字符串接收try (InputStream in = client.getInputStream()) {byte[] buffer = new byte[1024];while ((in.read(buffer)) != -1) {try {// 2. 处理数据,如果处理发生异常,不影响下次接收数据} catch (Exception ex) {System.out.println("处理数据发生异常:" + ex);}}}} catch (Exception ex) {System.out.println("客户端连接发生异常:" + ex);}}
}

三、NIO优化,但强烈不建议使用Java原生的NIO

  1. 单线程

  1. 多线程优化,对应上面的代码

  1. 线程池优化

对于每一个请求,单独开一个线程进行相应的逻辑处理,如果客户端的数据传递是断断续续的,相应的线程需要I/O等待(有阻塞),并进行上线文切换(耗资源)

  1. 使用NIO的Selector机制,提升程序并发效率

    a. Channel用于连接和传输

    b. Buffer 用于存储

    c. 用于管理请求

四、Netty优化

  1. Netty是对NIO的进一步封装

  2. Netty代码

<dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.6.Final</version>
</dependency>
public class NettyServer {public static void main(String[] args) {ServerBootstrap serverBootstrap = new ServerBootstrap();NioEventLoopGroup boos = new NioEventLoopGroup();NioEventLoopGroup worker = new NioEventLoopGroup();serverBootstrap.group(boos, worker).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<NioSocketChannel>() {protected void initChannel(NioSocketChannel ch) {ch.pipeline().addLast(new StringDecoder());ch.pipeline().addLast(new SimpleChannelInboundHandler<String>() {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, String msg) {System.out.println(msg);}});}}).bind(8000);}
}
public class NettyClient {public static void main(String[] args) throws InterruptedException {Bootstrap bootstrap = new Bootstrap();NioEventLoopGroup group = new NioEventLoopGroup();bootstrap.group(group).channel(NioSocketChannel.class).handler(new ChannelInitializer<Channel>() {@Overrideprotected void initChannel(Channel ch) {ch.pipeline().addLast(new StringEncoder());}});Channel channel = bootstrap.connect("127.0.0.1", 8000).channel();while (true) {channel.writeAndFlush(new Date() + ": hello world!");Thread.sleep(2000);}}
}

参考:
http://www.cr7mufc520.cn/archives/tuling333

http://www.vx642620018.top/articles/2021/07/24/1627118603935.html

监听TCP端口号:从简单Socket到NIO到Netty相关推荐

  1. mysql 不监听tcp端口号_mariadb未监听TCP 3306问题解决

    之前通过服务器本地访问mariadb数据库的时候都没有什么问题,今天开始尝试远程登录mariadb数据库,发现登录失败:而且发现TCP三次握手,客户端发送的syn报文,服务器端都没有回应. 登录服务器 ...

  2. 开启1521端口监听_修改Oracle监听默认端口号1521的方法

    前言 大家都知道在oracle中,默认的监听端口号为1521,一旦有人扫描出这个端口号就会知道此服务器为oracle数据库服务器,存在极其大的安全隐患,下面在这里,教大家如何修改oracle默认端口号 ...

  3. oracle监听程序端口号是,修改Oracle监听默认端口号1521的方法

    前言 大家都知道在oracle中,默认的监听端口号为1521,一旦有人扫描出这个端口号就会知道此服务器为oracle数据库服务器,存在极其大的安全隐患,下面在这里,教大家如何修改oracle默认端口号 ...

  4. 改oracle监听程序端口号,windows下如何修改oracle的默认监听端口号port

    首先我们要知道,在oracle中,什么文件里面有关于端口号的信息,路径如下: X:\oracle_home\product\11.2.0\dbhome_2\NETWORK\ADMIN 到这个路径下我们 ...

  5. CloudFoundry和AWS上应用监听的端口号

  6. java监听某端口和ip_Java 通过Socket监听指定服务器(IP)的指定端口,及向指定服务器的指定端口发送信息...

    客户端:向指定端口发送信息 package com.jszc.lottery.modules.longpay.util; import java.io.BufferedReader; import j ...

  7. 渡一教育_Java每日一练:建立Statement的作用是什么、前端Console.log( Boolean(‘‘))输出的是什么、如果希望1监听TCP端口为9000,服务端应该怎样创建socket

    系列文章目录 文章目录 系列文章目录 题目1java部分建立Statement的作用是什么(答案在最后公布) 题目1 - 答案 ==解析== ==答案== 题目2 前端 js部分 ==答案== 题目3 ...

  8. Linux系统下实现基于TCP/IP协议的简单Socket通信

    Linux系统下实现基于TCP/IP协议的简单Socket通信 网络套接字Socket Socket概念 主机字节序和网络字节序 Sockaddr地址结构 Socket实现客户端.服务端通信 服务端程 ...

  9. DSAPI多功能组件编程应用-HTTP监听服务端与客户端

    本文中,演示了使用DSAPI.网络相关.HTTP监听,快速建立服务端和客户端. HTTP监听服务端的作用,是监听指定计算机端口,以实现与IIS相同的解析服务,提供客户端的网页请求,当然,这不仅仅是应用 ...

  10. js监听移动端返回键,从内页返回首页

    js监听移动端返回键,从内页返回首页 直接上代码. $(document).ready(function () {window.history.pushState("", &quo ...

最新文章

  1. 大数据 防范脱贫人口返贫_男性比女性多出3047万,从人口大数据看,房价会涨还是跌?...
  2. java基础系列:集合总结(7)
  3. Eclipse实现hibernate反向工程:从数据库逆向生成实体类和hbm文件
  4. 解决方法|ESP8266环境搭建出现 usrbinenv bashr :没有那个文件或目录
  5. 【活动(广州)】office365的开发者训练营
  6. ssl提高组周六模拟赛【2018.9.8】
  7. C学习杂记(七)extern声明可省略变量类型
  8. ajax实现一个前台的进度条,前台ajax实现上传文件并且有进度条
  9. Linux 常用命令整理
  10. Golang 连接池的几种实现案例
  11. python列表转dict
  12. Linux服务器SSH免密登录
  13. 线程同步--关键代码段(二)
  14. 微光app电脑版_有哪些适合学生使用的 App?②
  15. 非线性系统线性化过程
  16. 理解Memory Barrier(内存屏障)
  17. matconvnet(CPU版本)基本使用
  18. Plant Simulation中的“开机自启”-autoexec
  19. matlab各次谐波含量,与谐波相关的基本概念
  20. AppCompatActivity透明化处理

热门文章

  1. 基于 Openocd 和 FT2232H 的 ARMv8(Coretex-A53)调试
  2. 计算机中基本磁盘分为几个区,电脑硬盘分几个区最好?电脑硬盘分区教程
  3. 查询和01号的同学学习的课程完全相同的其他同学的信息的优化
  4. 特征多项式法(characteristic polynomial )求特征值(结合lanczos和householder)(python,数值积分)
  5. 软件测试工程师的职业技能分析
  6. Dart语言中的Isolate
  7. http://www.jb51.net/os/Ubuntu/35201.html
  8. python剔除st股_通达信剔除st的指标,通达信条件预警中如何剔除st股票
  9. win10+睡眠+计算机命令,Win10关闭系统休眠——使用powercfg –h off命令轻松节省硬盘容量...
  10. 2020.9.8:Spring cloud :install时报错