手动搭建I/O网络通信框架1:Socket和ServerSocket入门实战,实现单聊
转载自https://www.cnblogs.com/lbhym/p/12673470.html
前言
这个基础项目会作为BIO、NIO、AIO的一个前提,后面会有数篇博客会基于这个小项目利用BIO、NIO、AIO进行改造升级。
简单的说一下io,了解的直接跳过看代码吧:IO常见的使用场景就是网络通信或读取文件等方面。IO流分为字节流和字符流。字节即Byte,包含八位二进制数,一个二进制数就是1bit,中文名称叫位。字符即一个字母或者一个汉字。一个字母由一个字节组成,而汉字根据编码不同由2个或者3个组成。Java.io包如下:详细的API可自行查阅资料


Socket定义:套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。
可以理解为两台机器或进程间进行网络通信的端点,这个端点包含IP地址和端口号。
Socket和ServerSocket区别就如其名字一样,简单地说ServerSocket作用在服务端,用以监听客户端的请求。Socket作用在客户端和服务端,用以发送接收消息。但是就像上面说的,它们都要包含一个IP地址和端口号。
Socket和ServerSocket实战:
首先创建一个最普通的Java项目。然后创建两个类,Server和Client。其代码和注释如下,仔细看下注释和代码,还是比较简单的
服务器只能为一个客户端服务,一旦监听到客户端的请求,就会一直被这个客户端占用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| public class Client { public static void main(String[] args) { final String DEFAULT_SERVER_HOST = "127.0.0.1"; final int DEFAULT_SERVER_PORT = 8888; try (Socket socket = new Socket(DEFAULT_SERVER_HOST, DEFAULT_SERVER_PORT)) { BufferedReader reader = new BufferedReader( new InputStreamReader(socket.getInputStream()) ); BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(socket.getOutputStream()) ); BufferedReader userReader = new BufferedReader( new InputStreamReader(System.in) ); String msg = null; while (true) { String input = userReader.readLine(); writer.write(input + "\n"); writer.flush(); msg = reader.readLine(); System.out.println(msg); if(input.equals("quit")){ break; } } } catch (IOException e) { e.printStackTrace(); } } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| public class Server { public static void main(String[] args) { final int DEFAULT_PORT = 8888; try (ServerSocket serverSocket = new ServerSocket(DEFAULT_PORT)) { System.out.println("ServerSocket Start,The Port is:" + DEFAULT_PORT); while (true) { Socket socket = serverSocket.accept(); System.out.println("Client[" + socket.getPort() + "]Online"); BufferedReader reader = new BufferedReader( new InputStreamReader(socket.getInputStream()) ); BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(socket.getOutputStream()) );
String msg = null; while ((msg = reader.readLine()) != null) { System.out.println("Client[" + socket.getPort() + "]:" + msg); writer.write("Server:" + msg + "\n"); writer.flush(); if (msg.equals("quit")) { System.out.println("Client[" + socket.getPort() + "]:Offline"); break; } } } } catch (IOException e) { e.printStackTrace(); } } }
|
然后打开两个命令终端,通过javac编译后,一个运行Server代表服务器,一个运行Client代表客户端。


下一篇 手动搭建I/O网络通信框架2:BIO编程模型实现群聊 。