IO流基础网络IO
Posted 烟锁迷城
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IO流基础网络IO相关的知识,希望对你有一定的参考价值。
1、网络IO基础
网络IO,即两个网络计算机之间的通讯,举一个简单的小例子,在server启动后,会进入到阻塞状态,client启动后,会通过socket将数据传输到server中,server会打印出数据。
public static void main(String[] args) {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(8080);
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
int len = 0;
byte[] bytes = new byte[1024];
while ((len = inputStream.read(bytes)) != -1) {
System.out.println(new String(bytes, 0, len,"utf-8"));
}
inputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost", 8080);
OutputStream outputStream = socket.getOutputStream();
outputStream.write("Hello World".getBytes("utf-8"));
outputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
2、Socket与ServerSocket
ServerStock使用于服务端,对外提供一个监听,处于阻塞状态,等待客户端的连接,一旦获得连接,就会创造一个Socket实例。
Socket使用于客户端,连接到指定的ServerSocket。
ServerSocket开启监听,等待client响应,获取到消息后,发送返回值,注意发送的数据需要\\n作为发送消息的结束,不然就会让某一端持续接收,不知道消息已经结束(因为使用了readLine方法)
public static void main(String[] args) {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(8080);
Socket socket = serverSocket.accept();
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
System.out.println(bufferedReader.readLine());
BufferedWriter bufferedWriter = new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream()));
bufferedWriter.write("收到消息\\n");
bufferedWriter.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
Client将消息发送给ServerSocket,同时获取ServerSocket的返回值。
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost", 8080);
BufferedWriter bufferedWriter = new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream()));
bufferedWriter.write("你好!\\n");
bufferedWriter.flush();
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
System.out.println(bufferedReader.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
Socket通讯原理如下:
3、网络通信协议
发送请求流程:
- 传输层:表示当前的协议头,使用TCP协议传输
- 网络层:增加IP头,IP地址是一个网卡在网络中的通讯地址,相当于门牌号
- 数据链路层:增加MAC头,表示这个数据包要发送到的网卡地址,MAC地址是全局唯一的
- 物理层:转化为比特流进行传输
接收请求流程:
- 物理层:当数据通过网卡的时候,查看数据是否需要
- 数据链路层:拿到数据,从数据中取得MAC头,检查MAC地址和当前网卡的MAC是否匹配,如果匹配说明当前消息是匹配的
- 网络层:拿到IP头,判断IP地址是否匹配,如果不是就继续转发,如果是就转交给上一层
- 传输层:TCP头中会携带端口,将报文交给指定端口的进程
4、网络通信原理
网络通信和本地的磁盘通信是一样的,只需要将磁盘替换为网络数据即可。
在ServerSocket中,accept方法对于请求的接收是阻塞的,InputStream和OutputStream在没有处理完成之前也是阻塞的,只要ServerSocket有正在处理的请求,其他Socket请求就无法被这个ServerSocket接收。
对于程序来说,串行的操作肯定是不被接受的,所以可以用线程池对上文的代码进行优化。
5、RPC架构
RPC(Remote Procedure Call)远程过程调用,是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。一般用来实现部署在不同机器上的系统之间的方法调用,使得程序能够像访问本地系统资源一样,通过网络传输去访问远端系统资源。
手写RPC框架下载
以上是关于IO流基础网络IO的主要内容,如果未能解决你的问题,请参考以下文章