网络编程基础
Posted 燕云十八骑_Z
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络编程基础相关的知识,希望对你有一定的参考价值。
一、C/S架构
1.硬件C/S架构
如PC-打印机
2.软件C/S架构
如PC-网站服务器
参照:
https://baike.baidu.com/item/Client%2FServer/1504488?fr=aladdin&fromid=826311&fromtitle=C%2FS
二、OSI七层模型
OSI七层中,对应着网络通信中的各个通信协议,了解OSI七层的运作过程是socket编程的重重之重,为什么这么说?看下图:
从图中看出,socket工作于软件C/S架构以及OSI七层模型中的应用层和传输层之间
附:
TCP协议详解:
三、socke是什么狗屁?
socket原指孔或插座,最初是作为BSD UINX的进程通信机制,同被称为套接字。当今套接字是Windows和Mac等操作系统所共同遵守的网络编程标准,是OSI七层模型中应用层和传输层之间抽象层,用于描述IP地址和端口,是一个通信链的句柄,可用来实现不同虚拟机或不同计算机之间的通信或者主机内的不同进程间的通信。Internet上的主机一般运行多个服务软件,同时提供几种服务,每种服务都打开一个socket,并绑定到一个端口上,不同的端口对应不同的服务。
在操作系统上, socket屏蔽了TCP/IP网络传输层及以下的网络细节,为操作系统提供网络抽象,开发者编写的网络程序都会直接或间接地用到socket抽象。通过socket抽象可以直接控制传输层的两大协议(TCP、UDP),甚至包括IP、ICMP等网络层协议。
简单的说,socket就是一条IP地址+端口+协议的三元组唯一标识一条通信链路,服务器端的一个通信链路可以对应多个客户端。
四、socket的种类
1.基于文件系统的套接字家族
套接字家族的名字:AF_UNIX
之前提到,socket最初是作为UNIX的进程机制,UNIX一切皆文件,它是基于文件的套接字调用的就是底层的文件系统取数据,两个套接字进程运行在同一机器上,可通过访问同一文件系统间接完成通信。
2.基于网络类型的套接字家族:
网络类型套接字名字:AF_INET
基于IPv4的套接字,另外还有用于IPv6的AF_INET6
五、socket编程
1.套接字工作流程
2.基于TCP的套接字简单实现
# 服务器端 import socket # 实例化一个socket对象,并指定网络层协议、传输层协议 socket_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 绑定IP、端口号 socket_server.bind((\'127.0.0.1\',8080),) # 同一时间内能够接收的请求 socket_server.listen(5) # 等待连接 connect,client_address = socket_server.accept() # 设置接收消息,最大限制为1024 receive_mag = connect.recv(1024) print(\'收到客户端的消息:%s\' % receive_mag.decode(\'UTF-8\')) # 发送数据 connect.send(receive_mag.upper()) # 关闭连接 connect.close() # 客户端 import socket socket_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 连接服务端,指定IP、端口号 socket_client.connect((\'127.0.0.1\',8080)) # 向服务端发消息 socket_client.send(\'Hello,I am client!\'.encode(\'utf-8\')) data = socket_client.recv(1024) print(\'接收到服务器的消息:%s\' % data.decode(\'utf-8\')) socket_client.close()
3.基于TCP的套接字连接循环和通信循环
# 服务器端 import socket phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.bind((\'127.0.0.1\',8080)) phone.listen(5) while True: # 连接循环 connect,client_address = phone.accept() print(\'客户端:\',client_address) while True: # 通信循环 try: msg = connect.recv(1024) print(\'客户端消息:\',msg) connect.send(msg+b\'from server\') except ConnectionResetError: break connect.close() phone.close() # 客户端 import socket phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.connect((\'127.0.0.1\',8080)) # 拨电话,地址为服务端的ip和端口 while True: msg = input(\'>>>).strip() phone.send(msg.encode(\'utf-8\')) # 发消息 data = phone.recv(1024) #收消息 print(data.decode(\'utf-8\')) phone.close()
4.基于UDP的套接字实现
1)UDP原理
参考:https://baike.baidu.com/item/UDP/571511
2)套接字实现
# 服务器端 import socket # SOCK_DGRAM 数据包协议 server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) server.bind((\'127.0.0.1\',8080),) while True: data,addr = server.recvfrom(1024) print(data.decode(\'utf-8\'),addr) server.sendto(data.upper(),addr)
# 客户端 import socket # SOCK_DGRAM 数据包协议 client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) while True: msg = input(\'>>>\').strip() if len(msg) == 0:continue client.sendto(msg.encode(\'utf-8\'),(\'127.0.0.1\',8080)) data,addr = client.recvfrom(1024) print(data.decode(\'utf-8\'),addr)
以上是关于网络编程基础的主要内容,如果未能解决你的问题,请参考以下文章