网络通信tcp tcp客户端及服务器的python语法实现
tcp
传输层协议udp/tcp
udp:用户数据报协议(无链接,简单不可靠信息传送,信息可能丢失)
tcp:传输控制协议(Transmission Control Protocol)(面向链接/可靠/基于字节流)
tcp的可靠传输
应答机制
超时传输
错误校验
流量控制和阻塞管理
客户端
步骤:创建(套接字)->链接(服务器)->收发(消息)->关闭
import socket
def main():
# 创建套接字
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 强制允许端口复用
tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 链接
server_ip = input("请输入服务器ip:")
server_port = int(input("请输入服务器port:"))
server_addr = (server_ip,server_port)
tcp_socket.connect(server_addr)
# 发送信息
send_data = input("请输入要发送的数据:")
tcp_socket.send(send_data.encode("utf-8"))
#关闭客户端
tcp_socket.close()
if __name__ == '__main__':
main()
注:
ip为str类型
port为int类型
connect链接一个元组
bind绑定一个元组
服务器
步骤:创建(套接字)->绑定(本地信息)->被动(转换)
->等待(客户链接)->接收(消息)->回送(消息)->关闭
import socket
def main():
# 创建套接字(买手机)
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 强制允许端口复用
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 绑定本地信息(插手机卡)
tcp_server_socket.bind(("",7890))
# 监听状态转为被动(设置正常模式)
tcp_server_socket.listen(128)
while True:
# 等待客户端链接(等电话)
new_server_socket,client_addr = tcp_server_socket.accept()
while True:
# 接收客户端信息
recv_data = new_server_socket.recv(1024)
print("客户端传送过来的请求是:%s" % recv_data.decode("utf-8"))
# 回送信息
if recv_data:
new_server_socket.send("本次服务已完成".encode("utf-8"))
else:
break
# 关闭套接字
new_server_socket.close()
print("已经服务完毕...")
tcp_server_socket.close()
if __name__ == '__main__':
main()
注:
send发送数据
格式:套接字.send(内容.encode(“utf-8”))
sendto udp发送数据
格式:套接字.sendto(内容.encode(“utf-8”),(ip,port))
recv接收数据
格式:套接字.recv(1024).decode(“utf-8”)
recvfrom udp接收数据
格式:str(套接字.recvfrom(1024)[1]),套接字.recvfrom(1024)[0].decode(“utf-8”)
示例:recv_data = udp_socket.recvfrom(1024)
print("%s:%s" % (str(recv_data[1]), recv_data[0].decode(“utf-8”)))
tcp_server_socket监听套接字,仅负责等待客户端链接
listen转为被动
accpt等待链接
accept产生的
client_socket服务客户端的新的套接字
clientAddr客户端地址及端口
运行到accept时默认阻塞,待客户端链接放行
解阻塞的两种情况:
客户端发送数据;
客户端调用close,客户端断开。