2026/5/21 1:47:50
网站建设
项目流程
网站 二级域名需要备案吗,北京网页设计制作网站,类似58的推广平台有哪些平台,wordpress语言切换 seo什么是网络编程
什么是网络编程#xff0c;相比于编写程序在本机上运行#xff0c;网络编程是指编写两台不同的计算机的程序#xff0c;基于网络协议#xff0c;通过网络进行数据通信。
常见的网络程序软件架构有#xff1a;BS#xff08;Broser浏览器/Server服务器相比于编写程序在本机上运行网络编程是指编写两台不同的计算机的程序基于网络协议通过网络进行数据通信。常见的网络程序软件架构有BSBroser浏览器/Server服务器架构、CSClient客户端/Server服务器架构BS架构优势是用户不用下载客户端使用浏览器即可快速获取服务运营者可随时更新程序。劣势是所有程序和资源需要通过网络传输产品精美和细腻程度不及CS架构的产品。CS架构优略势与BS架构相反。优势是用户提前下载好程序的所有资源产品的精美和细腻程序可以做到非常高而且可以更好的利用本地计算机算力比如3A游戏都是CS架构。劣势是需要用户下载客户端程序程序更新时比较麻烦需要客户端更新软件。网络编程三要素要实现网络编程必须实现网络通信需要确定通信对象IP、对象中的具体程序端口、通信规则协议。第一步首先要在网络中找到对方的计算机设备。计算机网络中IP是网络设备的唯一地址。第二步在对方的计算机设备中找到要通信的软件因为计算机中可能运行很多程序。比如微信服务端要发送数据到用户手机需要找到用户手机中的微信客户端而用户手机中可能有微信、QQ、淘宝等很多应用程序。计算机网络中端口号是区分程序进程的编号。第三步需要确定通信方式即网络协议。计算机网络协议有TCP、UDP、HTTP等协议。所以网络编程的三要素就是IP、端口号、网络协议IPIP是网络通信中设备的地址具有唯一性。IP有IPV4和IPV6两种。IPV4IPV4是指IP互联网通信协议第四版IPV4用4个字节共32位用4组每组1个字节来表示比如11000000 10101000 00000001 00000001。IPV4采用点分十进制即使用符号点.来分组采用十进制表示。因此上述IPV4地址表示为192.168.1.1IPV4共32位因此可以区分的地址有2的32次方共计4,294,967,296而全球有数十亿人每个人又有数台可上网的设备。因此IPV4的地址是不够用的实际上IPV4早在2019年就已经用完了。IPV4已经用完了而IPV6并没有大规模普及那IPV4是如何解决当前设备IP地址不够的问题答案是使用局域网。IPV4规定192.168.0.0~192.168.255.255这些为局域网IP还有其他私有IP段不展开一个区域内比如一个网吧的所有设备使用一个公网IP而所有区域内的网络设备使用局域网IP。局域网内的所有设备上网都使用公网IP对外传输和接收数据然后通过NAT网络地址转换技术将局域网各设备的数据包再分发给各自设备。公网IP局域网IP的技术造成了我们目前使用设备的IPV4地址都是192.168.X.X的原因。局域网IP地址一般是路由器通过DHCP技术随机分配给网络设备的一段时间后局域网IP地址会改版。除此之外我们的设备在不同的上网环境路由器分配的局域网地址一般都是不同的比如在教师里连WIFI笔记本电脑被分配的局域网地址可能是192.168.10.245而回到寝室连有线网笔记本电脑被分配的局域网地址变成了192.168.1.3。因此本机程序之间进行通信不能使用局域网IP地址而是使用一个被称为本机IP或者回环地址的特殊IP127.0.0.1。网络设备在识别到回环地址作为目标地址不会将数据传输到路由器或者网关而是直接传给本机。IPV6为解决IP枯竭问题IPV6横空出世。IPV6采用16个字节128位共8组每组两个字节来表示比如11111101 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001。IPV6采用冒分十六进制即使用符号冒号:来分组采用十六进制来表示。因此上述IPV6地址表示为fd00:0000:0000:0000:0000:0000:0000:0001。由于IPV6地址很长因此固定可以省略每一最前面的一连串0因此上述IPV6地址可简写为fd00:0:0:0:0:0:0:1。并且规定可以进一步将中间的0省略即压缩表示为fd00::1IPV6共128位因此可以区分的地址为2的128次方个可以为地球上每一粒沙子都分配一个唯一的IP地址。因此IPV6一定是足够人们使用。目前IPV6正在逐步推广全面取代IPV4仍需时间目前很多环境是双栈IPV4IPV6运行。端口端口是计算机中应用程序向外发送数据/接收数据的“口”每个应用程序都有一个端口号。端口号是用两个字节来表示的也就是一共有0~65535一共65536个端口号。应用程序启动时操作系统会为应用程序分配一个端口号应用程序就用这个端口号向网络收发数据。协议网络协议是指网络通信、数据传输的标准或规范。计算机网络中有OSI七层模型和TCP/IP模型其中TCP/IP模型将网络划分为应用层、传输层、网络层和物理链路层TCP/IP模型是行业默认的标准。TCP/IP模型中不同层有不同的网络协议比如HTTP、FTP等就是应用层的协议而TCP、UDP是传输层的协议IP是网络层的协议。UDP 程序通信UDP协议特点是无连接发送后不管所以速度快。创建UDP发送数据的程序步骤创建一个发送数据的通信端点需包括网络编程三要素IP、端口和协议。发送时的IP是本机IP无法自定义更准确的是在创建DatagramSocket时可以用带IP对象的构造函数绑定到指定的本地IP地址和端口但是一般不用IP对象作为构造函数参数默认为本机IP。端口号可指定发送端口号但是由于端口号不能与别的程序占用的端口号因此一般使用系统给的端口号。协议则体现到类上UDP使用DatagramSocket。封装数据包。就像封装发送出去的快递包需要包含收货地址和收货人。UDP数据包需要包含发送的数据本身字节数组、目标地址IP目标端口号。其中IP需要使用IP类InetAddress创建对象。UDP数据包为DatagramPacket类需要用字节数组数据本身、IP对象和端口号封装。发送数据。DatagramSocket对象调用方法发送数据包。释放资源。DatagramSocket对象存在时占用了系统资源因为系统开辟了端口号让程序独占使用因此需要调用close方法释放资源。// 发送端publicclassSendMessage{publicstaticvoidmain(String[]args)throwsIOException{// 1. 创建一个发送UDP的通信对象DatagramSocketsocketnewDatagramSocket();// 2. 封装数据包// 目的地址和端口Stringip127.0.0.1;// 发送到本机用回环地址InetAddressdestinationIPInetAddress.getByName(ip);// 目的地址intdestinationPort10086;// 待发送的数据Stringdatahello, world;// 待发送的数据hello, worldbyte[]dataBytesdata.getBytes();// 转换为字节数组DatagramPacketpacketnewDatagramPacket(dataBytes,dataBytes.length,destinationIP,destinationPort);// 数据包对象// 3. 发送数据包socket.send(packet);// 4. 释放资源socket.close();}}UDP接收数据的程序步骤同发送数据相似需要创建一个接收数据的通信端点也是包括网络编程三要素IP、端口和协议。接收时的IP是本机号。端口号需要注意要使用与发送数据中的发送数据包的目标端口号不对应则接收不到数据。协议也是体现到类上UDP为DatagramSocket。接收数据。发送数据的是DatagramPacket对象接收数据也需要用一个DatagramPacket对象进行接收可以想象为收快递时需要用一个快递盒子去接收。与发送时需要数据包DatagramPacket对象需要包含数据本身字节数组、目标地址IP目标端口号等内容时不同接收数据的数据包只需要定义数据包的大小即可字节数组和接收数据的长度。解析数据。接收的是DatagramPacket对象调用相应的方法可以获取数据包的数据本身、来源地址IP、来源端口号。关闭资源。与发送数据相同需要调用close方法释放资源。// 接收端publicclassReceiveMessage{publicstaticvoidmain(String[]args)throwsIOException{// 1. 创建一个接收UDP的通信对象DatagramSocketsocketnewDatagramSocket(10086);// 指定接收端口为10086// 2. 接收数据byte[]buffernewbyte[1024];// 创建一个1024字节的字节数组作为数据缓冲区用于临时存储从网络接收到的数据DatagramPacketpacketnewDatagramPacket(buffer,buffer.length);// 创建一个数据包对象最大接收数据长度为数组长度socket.receive(packet);// 3. 解析数据byte[]datapacket.getData();// 获取数据包中的数据StringreceivedDatanewString(data,0,packet.getLength());// 将数据转换为字符串InetAddresssourceAddresspacket.getAddress();// 获取发送方的IP地址StringsourceAddressStrsourceAddress.getHostAddress();// 解析为IP地址字符串intsourcePortpacket.getPort();// 获取发送方的端口号// 打印出接收到的数据和发送方的IP地址及端口号System.out.println(收到来自IP为sourceAddressStr端口号为sourcePort的数据receivedData);// 4. 释放资源socket.close();}}收到来自IP为127.0.0.1端口号为65290的数据hello, world 进程已结束退出代码为0TCP 程序通信TCP协议是建立连接的协议也就是在发送数据之前需要先建立连接连接建立失败则会异常不可发送数据。TCP协议与UDP协议不同TCP发送数据无需封装成数据包还是通过数据流发送数据因此发送和接收数据如同IO流。TCP协议需要通过三次握手建立连接第一次握手客户端往服务端发送信息请求建立连接第二次握手服务端发送信息表明统一建立连接。此时服务端已就绪等待客户端确认就绪第三次握手客户端往服务端发送消息表明自己已就绪准备发送数据。服务端收到消息确认客户端就绪等待收取消息。创建TCP发送消息的程序步骤为创建一个客户端的通信端点与UDP的DatagramSocket不需要接收端IP和端口号作为参数不同因为接收端IP和端口号被封装到了数据包DatagramPacket内客户端Socket对象在创建时就需要接收端IP和端口号因为在发送数据之前就要与服务端建立连接创建对象时就建立连接。客户端Socket对象创建与DatagramSocket相似点在于可以不指定本机的IP和端口号使用系统给的端口号和本机IP。从Socket中获取发送数据的输出流原始字节流出留通过输出流发送数据。Socket输出流是IO流因此也可以使用字节流、字符流、转换流、缓冲流等原始流和处理流。释放资源。创建Socket占用系统资源因为系统分配了端口号需要调用close()方法释放资源。此外IO流也需要关闭。需要注意释放资源有一定顺序客户端发送完数据立马进行关闭存在两种可能1. 数据还在缓冲区未被完全发送2. 服务端未完全接收数据。因此使用flush()让缓冲区的数据立即发送。// 客户端publicclassClient{publicstaticvoidmain(String[]args)throwsIOException{// 1. 创建一个Socket对象SocketsocketnewSocket(127.0.0.1,52522);// 指定接收端的IP和端口// 2. 通过Socket对象获取输出流OutputStreamossocket.getOutputStream();BufferedOutputStreambosnewBufferedOutputStream(os);// 使用缓冲流仅做演示非必须OutputStreamWriteroswnewOutputStreamWriter(bos);// 使用OutputStreamWriter将字节流转换为字符流osw.write(Hello, Server!);// 写入数据osw.flush();// 刷新缓冲区确保数据发送// 3. 释放资源按正确顺序osw.close();// 释放字符流资源bos.close();// 释放缓冲流资源socket.close();// 释放Socket资源自动关闭底层的字节输入流和字节输出流}}创建TCP接收消息的程序步骤为创建一个接收数据的通信端点。与UDP不同TCP的服务端采用与客户端不同的类ServerSocket。端口号与UDP协议相似要使用客户端Socket目标端口号相同的端口号不对应则接收不到数据。等待与客户端建立连接。调用accept()方法一直监听端口等待客户端进行三次握手建立连接。建立连接之前线程是阻塞的状态。链接建立后返回一个客户端Socket对象。TCP建立连接后通过IO流传输数据。发送端是Output接收端是Input。因此从Socket对象中获得IO基本的字节输入流。解析数据。字节输入流可以通过字符流、转换流、缓冲流等处理流处理解析数据。释放资源。释放IO流和Socket资源。// 服务器端publicclassServer{publicstaticvoidmain(String[]args)throwsIOException{// 1. 创建一个ServerSocket对象ServerSocketserverSocketnewServerSocket(52522);// 2. 等待与客户端建立连接SocketsocketserverSocket.accept();// 链接建立后返回一个Socket对象// 3. 获得字节输入流对象InputStreamissocket.getInputStream();// 4. 将字节输入流转换为字符输入流读取数据并打印成字符串InputStreamReaderisrnewInputStreamReader(is);intlen0;char[]chsnewchar[1024];if((lenisr.read(chs))!-1){System.out.println(newString(chs,0,len));}// 一般情况下服务器端会循环接收多个客户端的请求// 无需手动关闭Socket// 5. 释放资源isr.close();// 关闭字符输入流// is.close(); // 无需手动关闭字节输入流socket.close();// 关闭Socket会自动关闭底层的字节输入流和字节输出流}}TCP协议建立连接需要三次握手关闭连接需要四次挥手。第一次挥手客户端发起信息请求关闭连接。第二次挥手服务端收到信息但是收到客户端发送关闭连接请求时服务端还没有完全收全所有之前发送的数据。但是服务端需要让客户端知道它收到了关闭连接的请求。因此服务端会给客户端发送确认收到关闭请求的信息。第三次挥手当服务端接收完所有数据后会再次给客户端发送一条信息表明自己已经安全收到所有传输的数据。发送确认关闭连接的信息给客户端表明服务器已就绪准备关闭。第四次挥手当客户端收到服务端发送的关闭确认请求后发送一个自己已确认关闭连接的请求发送后客户端关闭连接。而服务器收到信息后也关闭连接。