7 udp套接字示例
7.1 udp简单示例
udp服务端
import socket
ip_port = ('127.0.0.1', 9000)
# 创建一个服务器的套接字
udp_server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 绑定服务器套接字
udp_server.bind(ip_port)
# 接受客户端的信息
msg, addr = udp_server.recvfrom(1024)
print(msg, addr)
# 发送信息
udp_server.sendto("hello".encode(), addr)
udp客户端
import socket
ip_port = ('127.0.0.1', 9000)
# 创建一个客户端套接字
udp_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 输入发送的数据
msg = input('>>: ').strip()
# 发送信息给服务器
udp_client.sendto(msg.encode('utf-8'), ip_port)
# 接受服务器的信息
back_msg, addr = udp_client.recvfrom(1024)
print(back_msg.decode('utf-8'), addr)
7.2 udp聊天器示例
import socket
ip_port = ('127.0.0.1', 8081)
# 创建一个服务器套接字
udp_server_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定IP地址和端口号
udp_server_sock.bind(ip_port)
# 循环收发消息
while True:
# 接收
qq_msg, addr = udp_server_sock.recvfrom(1024)
print('来自[%s:%s]的一条消息:%s' % (addr[0], addr[1], qq_msg.decode('utf-8')))
# 发送
back_msg = input('回复消息: ').strip()
udp_server_sock.sendto(back_msg.encode('utf-8'), addr)
udp客户端
import socket
udp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
qq_name_dic = {
'乔治': ('127.0.0.1', 8081),
'james': ('127.0.0.1', 8082),
'苯环': ('127.0.0.1', 8083),
'岳岳': ('127.0.0.1', 8084),
}
while True:
qq_name = input('请选择聊天对象: ').strip()
while True:
msg = input('请输入消息,回车发送: ').strip()
if msg == 'quit':
break
if not msg or not qq_name or qq_name not in qq_name_dic:
continue
udp_client_socket.sendto(msg.encode('utf-8'), qq_name_dic[qq_name])
back_msg, addr = udp_client_socket.recvfrom(1024)
print('来自[%s:%s]的一条消息:%s' % (addr[0], addr[1], back_msg.decode('utf-8')))
8 tcp套接字示例
tcp是基于连接的,必须先启动服务器,然后在启动客户端去连接服务器
8.1 tcp套接字工作原理
8.2 tcp简单示例
tcp服务端
import socket
ip_port = ('127.0.0.1', 9000) # 电话卡
# 创建服务器套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 把地址绑定给套接字
s.bind(ip_port)
# 监听链接
s.listen(5)
# 接受客户端连接
conn, addr = s.accept()
# print(conn)
# print(addr)
print('接到来自%s的电话' % addr[0])
# 对话
msg = conn.recv(1024)
print(msg.decode(), type(msg))
conn.send("hi".encode())
conn.close() # 关闭客户端套接字
s.close() # 关闭服务器套接字
tcp客户端
import socket
ip_port = ('127.0.0.1', 9000)
# 创建客户端套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 尝试连接服务器
s.connect_ex(ip_port)
#对话
s.send('hello world'.encode('utf-8'))
feedback = s.recv(1024)
print(feedback.decode('utf-8'))
# 关闭客户端套接字
s.close()
8.3 tcp改进示例
tcp服务端改进版
import socket
ip_port = ('127.0.0.1', 8081)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(ip_port)
s.listen(5)
while True:
conn, addr = s.accept()
# print(conn)
# print(addr)
print('接到来自%s的电话' % addr[0])
while True:
msg = conn.recv(1024)
print(msg.decode(), type(msg))
str = input(">>>")
conn.send(str.encode())
conn.close()
tcp客户端改进版
import socket
ip_port = ('127.0.0.1', 8081)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect_ex(ip_port)
while True:
msg = input('>>: ').strip()
if len(msg) == 0:
continue
s.send(msg.encode('utf-8'))
feedback = s.recv(1024)
print(feedback.decode('utf-8'))
s.close()
9 tcp的三次握手四次挥手(面试常考)
流程图
术语
SYN:同步位,SYN=1,表示进行一个连接请求。
ACK:确认位,ACK=1,确认有效,ACK=0,确认无效。
ack:确认号,对方发送序号+1。
seq:序号。
FIN:断开连接并且会停止发送数据。