目录
- 一、IO实现TCP聊天程序
-
- 1. IO简介
- 2. IO实现网络程序
- 3. 运行测试
- 二、NIO实现TCP聊天程序
-
- 1. NIO简介
- 2. NIO实现网络程序
- 3. 运行测试
- 三、Netty实现TCP聊天程序
-
- 1. Netty简介
- 2. Netty实现网络程序
- 3. 运行测试
- 四、总结
- 五、参考
一、IO实现TCP聊天程序
1. IO简介
- 服务端阻塞点
server.accept();获取套接字的时候
inputStream.read(bytes);输入流读取数据的时候
- 传统socket是短连接,可以做短连接服务器,他无法做长连接,属于一问一答的模式,比如老的tomcat底层用的就是socket,用完就会关掉线程,因此不会出现线程一直被占用的情况,支持处理多个客户端连接。
(1)单线程情况下只能有一个客户端(一个线程维护一个连接,也就是一个socket客户连接)线程一直被占用。
(2)用线程池可以有多个客户端连接,但是非常消耗性能(用此案城池,就是老tomcat原理,只不过是用完后就释放)
2. IO实现网络程序
- 新建两个java项目(一个Server端,一个client端)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/9fc10eca759d9c13a09d0941ac31a863.png)
- Server端代码编写
package com.company;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.io.InputStream;
import java.net.Socket;
public class Main {
public static void main(String[] args) throws IOException {
//创建客户端的Socket对象(SevereSocket)
//ServerSocket (int port)创建绑定到指定端口的服务器套接字
ServerSocket ss = new ServerSocket(50000);
//Socket accept()侦听要连接到此套接字并接受他
Socket s = ss.accept();
//获取输入流,读数据,并把数据显示在控制台
InputStream is = s.getInputStream();
byte[] bys = new byte[1024];
int len = is.read(bys);
String data = new String(bys, 0, len);
System.out.println("数据是:" + data);
//释放资源
s.close();
ss.close();
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a578aec042ad5a1086a5a8b46e2e45e6.png)
package com.company;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class Main {
public static void main(String[] args) throws IOException {
//创建客户端的Socket对象
//Socket (InetAddress adress,int port)创建流套接字并将其连接到指定IP地址的指定端口号
// Socket s=new Socket(InetAddress.getByName("192.168.224.1"), 10000);
//Socket (String host,int port)创建流套接字并将其连接到指定主机的指定端口号
Socket s=new Socket("127.0.0.1", 50000);
//获取输出流,写数据
//OutputStream getOutputStream();返回此套接字的输出流
OutputStream os=s.getOutputStream();
os.write("hello,tcp".getBytes());
//释放资源
s.close();
}
}