1、首先了解两个协议TCP和UDP
1、TCP:(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。
之所以可靠:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。当TCP收到发自TCP连接另一端的数据,它将发送一个确认。
2、UDP: (User Datagram Protocol 数据报协议),是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。
2、socket
- socket: 是一种数据链接的端口,简称为:套接字
- 主要有两种套接字类型
面向文件的
面向网络的
面向文件的,为了区分不同平台和不同体系的套接字类型,出现了地址家族:Address Family 简称AF
Unix 系统中的套接字就是第一种家族套接字,称为 AF_UNIX,或者 AF_LOCAL,这是 POSIX1标准中规范的
面向网络的有AF_INET和AF_INET6
面向连接的SCOK_STREAM –>TCP协议
面向无连接的SOCK_DGRAM –>UDP协议
- python中socket
为网络编程提供了友好的支持
面向连接的服务端
##开发流程:伪代码
#引入需要的模块socket
#配置连接信息HOST、PORT
#生成套接字对象
#绑定主机端口号
#监听端口号
#收发消息
##############################################
#引入需要的模块
inport socket
#配置连接信息
HOST = '' #空字符串,默认本地
PORT = 8080 #端口号
ADDRESS = (HOST,PORT)
BUFFER = 1024 #每次传输的数据大小
#创建面向连接的套接字
tcp_socket_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#SOCK_STREAM: 提供面向连接的稳定数据传输,即TCP协议。
#绑定主机
tcp_socket_server.bind(ADDRESS)
#监听端口号
tcp_socket_server.listen()
while True:
#发送消息
tcp_socket_server.send("my name is server".encode('utf-8'))
#"my name is server".encode('utf-8'):将字符编码转化为utf-8字节编码
#接受消息
msg = tcp_socket_server.recv(BUFFER)
#打印接受消息
print("消息:" + msg.decode('utf-8'))
#关闭套接字,释放资源
tcp_socket_server.close()
面向连接的客户端
##伪代码
#引入需要的模块socket
#定义链接消息
#创建套接字对象
#确定链接主机ip和端口
#收发消息
#################################
#引入需要的模块
import socket
#配置连接信息
HOST = '192.168.13.28' #这里是我的ip的地址,需要修改成自己的,
#命令行控制窗口中,ipconfig命令,可以查看
PORT = 8080 #随意填,建议填8千以上的,上到6万多
ADDRESS = (HOST,PORT)
#创建套接字对象
tcp_socket_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#确定链接主机和端口号
tcp_socket_client.connect(ADDRESS)
while True:
#上面服务器先发送的消息,所以我们在客户端先接受消息
#接受消息
msg = tcp_socket_client.recv(BUFFER)
print(msg.decode('utf-8'))
#发送消息
info = input("要发送的消息:")
tcp_socket_client.send(info.encode('utf-8'))
if info == "BYE":
#退出
tcp_socket_client.close()
break
面向无连接的服务端
##伪代码
#引入需要的模块
#配置连接信息
#创建无连接的套接字
#绑定主机ip和端口
#收发消息
##################################
#引入需要的模块
import socket
#配置连接信息
HOST = ''
PORT = 8080
ADDRESS = (HOST,PORT)
BUFFER = 1024
#创建面向无连接的套接字
udp_socket_server = socket.socket(socket.AF_INET,socket.DGRAM)
#SOCK_DGRAM: 使用不连续不可靠的数据包连接。
#绑定主机和端口
udp_socket_server.bind(ADDRESS)
whlie True:
#接受消息
msg,addr = udp_socket_server.recvfrom(BUFFER)
#addr:IP地址和端口号
print(addr,"消息:" + msg.decode('utf-8'))
#发送消息
info = input("发送的消息:")
udp_socket_server.sendto(info.endode('utf-8'))
if info == "BYE":
#关闭套接字
udp_socket_server.close()
break
面向无连接的客户端
import socket
HOST = '192.168.13.28'
PORT = 8080
ADDRESS = (HOST,PORT) #需要发送的地址
BUFFER = 1024
#创建套接字类型
udp_socket_client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
server_info = input("输入消息:")
udp_socket_client.sendto(server_info.encode("utf-8"), ADDRESS)
if server_info == "BYE":
udp_socket_client.close()
break
client_msg,client_addr = udp_socket_client.recvfrom(BUFFER)
print(client_addr,client_msg.decode("utf-8"))
3、socketserver
socketserver 是标准库中一个高级别的模块,用于简化网络客户与服务器的实现。
面向对象的面向连接的网络编程
#引进需要的模块
from socketserver import (TCPServer as TCP, StreamRequestHandler as SRH)
#自定义请求处理类型
class MyRequestHandler(SRH):
# 重写请求处理方法
def handle(self):
# 父类中:请求对象:self.request
print("一个客户端连接上来了", self.client_address)
# 发送消息
self.request.send("我是服务器".encode("utf-8"))
# 接受消息
info = self.request.recv(1024)
print(info.decode('utf-8'))
if __name__ == '__main__':
ADDRESS = ('',12345)
#创建一个TCP服务器
tcp_server = TCP(ADDRESS,MyRequestHandler)
print("等待连接...")
tcp_server.serve_forever()
#tcp_server.serve_forever()服务器永远服务