我是靠谱客的博主 机灵野狼,最近开发中收集的这篇文章主要介绍java监听tcp端口被占用_监听TCP端口号:从简单Socket到NIO到Netty,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、思路

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

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

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

二、简单代码实现

public static void main(String[] args) throwsIOException {int port = 8234;//1. 创建ServerSocket对象,去监听端口号

try (ServerSocket serverSocket = newServerSocket(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(newProcessDataThread(client)).start();

}

client.close();

System.out.println("服务器关闭");

}

}

public class ProcessDataThread implementsRunnable {privateSocket client;publicProcessDataThread(Socket socket) {this.client =socket;

}

@Overridepublic voidrun() {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. 单线程

14c693dd09ba4e6875cfbbda314ab430.png

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

67a35f4aad5e2b42c06e4517f0d88a15.png

3. 线程池优化

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

ab4745c78c65314a1ea2ba348a85672b.png

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

a. Channel用于连接和传输

b. Buffer 用于存储

c. 用于管理请求

4eab2a927d970a587f716de4a2215628.png

05450f1e3e43dc62cf2b84294a746b28.png

四、Netty优化

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

2. Netty代码

io.netty

netty-all

4.1.6.Final

public classNettyServer {public static voidmain(String[] args) {

ServerBootstrap serverBootstrap= newServerBootstrap();

NioEventLoopGroup boos= newNioEventLoopGroup();

NioEventLoopGroup worker= newNioEventLoopGroup();

serverBootstrap

.group(boos, worker)

.channel(NioServerSocketChannel.class)

.childHandler(new ChannelInitializer() {protected voidinitChannel(NioSocketChannel ch) {

ch.pipeline().addLast(newStringDecoder());

ch.pipeline().addLast(new SimpleChannelInboundHandler() {

@Overrideprotected voidchannelRead0(ChannelHandlerContext ctx, String msg) {

System.out.println(msg);

}

});

}

})

.bind(8000);

}

}

public classNettyClient {public static void main(String[] args) throwsInterruptedException {

Bootstrap bootstrap= newBootstrap();

NioEventLoopGroup group= newNioEventLoopGroup();

bootstrap.group(group)

.channel(NioSocketChannel.class)

.handler(new ChannelInitializer() {

@Overrideprotected voidinitChannel(Channel ch) {

ch.pipeline().addLast(newStringEncoder());

}

});

Channel channel= bootstrap.connect("127.0.0.1", 8000).channel();while (true) {

channel.writeAndFlush(new Date() + ": hello world!");

Thread.sleep(2000);

}

}

}

参考:

最后

以上就是机灵野狼为你收集整理的java监听tcp端口被占用_监听TCP端口号:从简单Socket到NIO到Netty的全部内容,希望文章能够帮你解决java监听tcp端口被占用_监听TCP端口号:从简单Socket到NIO到Netty所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(78)

评论列表共有 0 条评论

立即
投稿
返回
顶部