计算机网络编程
计算机网络编程
- 网络通讯的要素
- IP和端口号
- 网络通讯协议
- 网络编程的目的
- 直接或间接的通过网络协议与其他计算机实现数据交互,进行通讯
- 主要问题
- 如何准确的定位网络上一台或多台主机,定位主机上特定的应用
- 找到主机后如何可靠高效的进行数据传输
TCP/IP协议簇
- 传输层协议中有两个非常重要的协议
- 传输层控制协议TCP
- 用户数据报协议UDP
TCP/IP协议:传输控制协议(TCP)和网络互联协议(IP)
- IP协议是网络层的主要协议,支持网间互联的数据协议
- TCP/IP协议模型从更实用的角度出发,形成高效的四层体系结构(应用层,传输层,IP层,物理数据链路层)
TCP和UDP协议(打电话/发短信)
- TCP协议
- 使用前,要先建立TCP连接,形成数据传输通道
- 传输前,需要进行“三次握手”方式,进行点对点通讯,可靠
- TCP协议进行通讯的两个应用进程:客户端,服务端
- 在连接中可以进行大量的数据传输
- 传输完毕,需要释放已建立的连接,效率低
- UDP协议
- 将数据,源,目的封装成数据包,不需要建立连接
- 每个数据包的大小限制在64k内
- 发送不需要知道接收方是否准备接收,接收后也不需要确认是否接收成功,不可靠
- 可以广播发送
- 数据发送完毕时,不需要释放资源,开销小,速度快
demo
package com.pw.studydemo.inter; import org.junit.Test; import java.io.*; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; /** * @author pw * @version 1.0 * @date 2022/7/15 11:26 */ public class TCPNo1 { // 客户端 @Test public void client(){ OutputStream outputStream = null; Socket socket = null; /** * 网络通讯的要素 * 1. ip * 2. 端口 * * socket = ip + 端口 */ try { // 创建socket // InetAddress.getByName("localhost")对方的ip socket = new Socket(InetAddress.getByName("localhost"),10101); // 发送 outputStream = socket.getOutputStream(); outputStream.write("你好,我是客户端".getBytes()); outputStream.flush(); } catch (IOException e) { e.printStackTrace(); }finally { if(outputStream != null){ try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if(socket != null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } // 服务端 @Test public void server(){ ServerSocket serverSocket = null; Socket accept = null; InputStream inputStream = null; ByteArrayOutputStream byteArrayOutputStream = null; try { // 创建服务端的socket serverSocket = new ServerSocket(10101); // 表示可以接收来自客户端的socket accept = serverSocket.accept(); inputStream = accept.getInputStream(); // 可能会有乱码(中文时) // byte[] bytes = new byte[1024]; // int len ; // while ((len = inputStream.read(bytes)) != -1){ // System.out.println(new String(bytes,0,len)); // } byteArrayOutputStream = new ByteArrayOutputStream(); byte[] bytes = new byte[2]; int len; while ((len = inputStream.read(bytes)) != -1){ // 上面read到byte中后,直接写到byteArrayInputStream中,内部其实是个数组,会自动扩容 byteArrayOutputStream.write(bytes,0,len); } System.out.println(byteArrayOutputStream.toString()); System.out.println("客户端的ip"+accept.getInetAddress().getHostAddress()); } catch (IOException e) { e.printStackTrace(); }finally { if(byteArrayOutputStream != null){ try { byteArrayOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if(inputStream != null){ try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if(accept != null){ try { accept.close(); } catch (IOException e) { e.printStackTrace(); } } if(serverSocket != null){ try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } } public void close(Closeable closeable){ if(closeable != null){ try { closeable.close(); } catch (IOException e) { e.printStackTrace(); } } } }