UDP/TCP 基础网络编程 (python)
网络编程基本模块
socket 套接字:Socket可以看成在两个程序进行通讯连接中的一个端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket中,使这段信息能传送到其他程序中。应用层就可以与传输层之间通过套接字接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。
无论是使用udp还是tcp传输协议,都需要使用套接字socket建立连接,不同的是tcp是面向连接的可靠传输,需要有确认连接之后才能够进行通信。
udp
使用udp网络协议,不需要确认连接,主要包括三阶段:
1、创建套接字
2、传输数据
3、关闭套接字
值得注意的是,在作为客户端时,套接字不需要绑定端口,但是在作为服务器时,一定需要绑定端口,这就类似要告诉别人你有一个固定的电话号码,别人能够接通。
udp服务端
# 创建套接字
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 绑定端口
loacl_addr = ('',64361) #必须绑定自己的ip和端口
udp_socket.bind(loacl_addr)
# 接收数据
recv_data = udp_socket.recvfrom(1024) #返回的是一个元组(数据,ip地址)
print('接收内容为:',recv_data[0].decode("gbk")) # windows 传入的数据是GBK编码,一般是utf-8
# 关闭连接
udp_socket.close()
#可以自行通过while嵌套循环,实现循环收发
udp客户端
# 创建套接字
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 发送数据
dest_ip = input("请输入对方IP")
dest_port = int(input("请输入端口")) #可以try,捕获异常
sent_data = input("请输入要发送的数据")
udp_socket.sendto(sent_data.encode("utf-8"),(dest_ip,dest_port))
#关闭连接
udp_socket.close()
tcp
与udp网络协议不同,tcp协议需要建立可靠的连接,其主要包括四个阶段:
1、创建套接字
2、建立连接
3、发送数据
4、关闭套接字
tcp网络协议中,作为服务器时,必须使用bind,进行绑定,同时还需要设置listen以及accept建立与客户端的联系
tcp服务端
# socket创建套接字
tcp_sever = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#bind绑定ip port
tcp_sever.bind(("",12345))
#listen 使套接字可以变为被动链接,监听,相当于总的分配口
tcp_sever.listen(128)
while True:
client_socket, client_addr = tcp_sever.accept() #accept返回的是一个元组,(socket,ip)socket是指当前与其连接成功的一个套接字,当上一个连接关闭,新的客户端接入,其又是新的一个socket
while True:
recv_data = client_socket.recv(1024) # 接收
'''
# 这里使用recv_data ==None判断不可以;这种方法是错误的,当客户端关闭连接是,会报错说连接已经建立了
if not recv_data: # 数字不为0、元组列表不为空、true 成立 None/false不成立
print("该客户服务完毕")
break
else:
print("客户端发送过来的数据:",recv_data.decode("gbk"))
client_socket.send("hahahhah----ok----\n".encode("utf-8")) # 回复'''
if recv_data:
print("客户端发送过来的数据:", recv_data.decode("gbk"))
client_socket.send("hahahhah----ok----\n".encode("utf-8")) # 回复
else:
print("该客户服务完毕")
break
client_socket.close()
print("服务完毕")
#关闭连接
tcp_sever.close()
tcp客户端
# 创建套接字
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#连接服务器
# tcp_socket.connect(("192.168.1.2",7890)) #本地测试时,为避免重复输入,可以 直接写死
ip = input("请输入连接服务器IP")
port = int(input("请输入连接端口:"))
sever_addr = (ip,port)
tcp_socket.connect(sever_addr)
#发送数据
send_data = input("请输入需要发送的数据")
tcp_socket.send(send_data.encode('utf-8'))
#关闭连接
tcp_socket.close()
在进行测试的时候,应当根据本机实际情况进行适当修改,但无论使用哪个协议,作为客户端或者服务端,工作的大致流程不会变,具体应用时,双方交互的数据可能发生变化。