监听TCP端口号:从简单Socket到NIO到Netty
一、思路
监听端口:在服务器端创建一个ServerSocket对象,去监听某个端口
创建连接:通过serverSocket.accept() 创建一个Socket对象,等待客户端连接,当有客户端连接到这个端口,Socket对象就创建成功
接收消息: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
- 单线程
- 多线程优化,对应上面的代码
- 线程池优化
对于每一个请求,单独开一个线程进行相应的逻辑处理,如果客户端的数据传递是断断续续的,相应的线程需要I/O等待(有阻塞),并进行上线文切换(耗资源)
使用NIO的Selector机制,提升程序并发效率
a. Channel用于连接和传输
b. Buffer 用于存储
c. 用于管理请求
四、Netty优化
Netty是对NIO的进一步封装
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相关推荐
- mysql 不监听tcp端口号_mariadb未监听TCP 3306问题解决
之前通过服务器本地访问mariadb数据库的时候都没有什么问题,今天开始尝试远程登录mariadb数据库,发现登录失败:而且发现TCP三次握手,客户端发送的syn报文,服务器端都没有回应. 登录服务器 ...
- 开启1521端口监听_修改Oracle监听默认端口号1521的方法
前言 大家都知道在oracle中,默认的监听端口号为1521,一旦有人扫描出这个端口号就会知道此服务器为oracle数据库服务器,存在极其大的安全隐患,下面在这里,教大家如何修改oracle默认端口号 ...
- oracle监听程序端口号是,修改Oracle监听默认端口号1521的方法
前言 大家都知道在oracle中,默认的监听端口号为1521,一旦有人扫描出这个端口号就会知道此服务器为oracle数据库服务器,存在极其大的安全隐患,下面在这里,教大家如何修改oracle默认端口号 ...
- 改oracle监听程序端口号,windows下如何修改oracle的默认监听端口号port
首先我们要知道,在oracle中,什么文件里面有关于端口号的信息,路径如下: X:\oracle_home\product\11.2.0\dbhome_2\NETWORK\ADMIN 到这个路径下我们 ...
- CloudFoundry和AWS上应用监听的端口号
- java监听某端口和ip_Java 通过Socket监听指定服务器(IP)的指定端口,及向指定服务器的指定端口发送信息...
客户端:向指定端口发送信息 package com.jszc.lottery.modules.longpay.util; import java.io.BufferedReader; import j ...
- 渡一教育_Java每日一练:建立Statement的作用是什么、前端Console.log( Boolean(‘‘))输出的是什么、如果希望1监听TCP端口为9000,服务端应该怎样创建socket
系列文章目录 文章目录 系列文章目录 题目1java部分建立Statement的作用是什么(答案在最后公布) 题目1 - 答案 ==解析== ==答案== 题目2 前端 js部分 ==答案== 题目3 ...
- Linux系统下实现基于TCP/IP协议的简单Socket通信
Linux系统下实现基于TCP/IP协议的简单Socket通信 网络套接字Socket Socket概念 主机字节序和网络字节序 Sockaddr地址结构 Socket实现客户端.服务端通信 服务端程 ...
- DSAPI多功能组件编程应用-HTTP监听服务端与客户端
本文中,演示了使用DSAPI.网络相关.HTTP监听,快速建立服务端和客户端. HTTP监听服务端的作用,是监听指定计算机端口,以实现与IIS相同的解析服务,提供客户端的网页请求,当然,这不仅仅是应用 ...
- js监听移动端返回键,从内页返回首页
js监听移动端返回键,从内页返回首页 直接上代码. $(document).ready(function () {window.history.pushState("", &quo ...
最新文章
- 大数据 防范脱贫人口返贫_男性比女性多出3047万,从人口大数据看,房价会涨还是跌?...
- java基础系列:集合总结(7)
- Eclipse实现hibernate反向工程:从数据库逆向生成实体类和hbm文件
- 解决方法|ESP8266环境搭建出现 usrbinenv bashr :没有那个文件或目录
- 【活动(广州)】office365的开发者训练营
- ssl提高组周六模拟赛【2018.9.8】
- C学习杂记(七)extern声明可省略变量类型
- ajax实现一个前台的进度条,前台ajax实现上传文件并且有进度条
- Linux 常用命令整理
- Golang 连接池的几种实现案例
- python列表转dict
- Linux服务器SSH免密登录
- 线程同步--关键代码段(二)
- 微光app电脑版_有哪些适合学生使用的 App?②
- 非线性系统线性化过程
- 理解Memory Barrier(内存屏障)
- matconvnet(CPU版本)基本使用
- Plant Simulation中的“开机自启”-autoexec
- matlab各次谐波含量,与谐波相关的基本概念
- AppCompatActivity透明化处理
热门文章
- 基于 Openocd 和 FT2232H 的 ARMv8(Coretex-A53)调试
- 计算机中基本磁盘分为几个区,电脑硬盘分几个区最好?电脑硬盘分区教程
- 查询和01号的同学学习的课程完全相同的其他同学的信息的优化
- 特征多项式法(characteristic polynomial )求特征值(结合lanczos和householder)(python,数值积分)
- 软件测试工程师的职业技能分析
- Dart语言中的Isolate
- http://www.jb51.net/os/Ubuntu/35201.html
- python剔除st股_通达信剔除st的指标,通达信条件预警中如何剔除st股票
- win10+睡眠+计算机命令,Win10关闭系统休眠——使用powercfg –h off命令轻松节省硬盘容量...
- 2020.9.8:Spring cloud :install时报错