关于python中的socket套接字模块实现tcp循环为多个客户端服务
套接字是通信的基石,是支持TCP/IP协议的路通信的基本操作单元。可以将套接字看作不同主机间的进程进行双间通信的端点,它构成了单个主机内及整个网络间的编程界面。Socket是应用层与TCP/IP协议通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数
据,以符合指定的协议。
1、tcp套接字(SOCK_STREAM):以字节流方式传输数据,实现tcp网络传输方案。(面向连接–tcp协议–可靠的–流式套接字)
2、udp套接字(SOCK_DGRAM):以数据报形式传输数据,实现udp网络传输方案。(无连接–udp协议–不可靠–数据报套接字)
服务端:提供服务的一端
客户端:请求服务的一端
在互联网中处处是C/S架构
# coding = 'utf-8'
# _author_ = 'ych'
# _file_ = 'udp聊天器.py'
# _date_ = '2022/3/27 11:54'
import socket
'''
套接字是全双工的
'''
def send_msg(udp_socket):
# 获取对方ip和port
target_ip = input('enter target ip:')
target_port = int(input('enter target port:'))
# 从键盘获取数据
send_data = input('enter data:')
udp_socket.sendto(send_data.encode("gbk"), (target_ip, target_port))
def recv_msg(udp_socket):
# 接收传回来的数据
recv_data = udp_socket.recvfrom(1024)
# 套接字可以同时收发数据
print("%s:%s" % (str(recv_data[1]), recv_data[0].decode('gbk')))
def main():
# 创建一个udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定信息
udp_socket.bind(("", 7788))
while True:
print("-----------------------udp聊天器---------------------------")
print("发送消息---1")
print("接收消息---2")
print("退出---0")
flag = input('输入功能:')
if flag == "1":
# 发送
send_msg(udp_socket)
elif flag == "2":
# 接收并显示
recv_msg(udp_socket)
elif flag == "0":
break
else:
print("输入错误!")
if __name__ == "__main__":
main()
运行结果如下:
网络调试助手收到数据如下:
选择协议类型为udp,设置ip和port即可连接。
# coding = 'utf-8'
# _author_ = 'ych'
# _file_ = 'tcp循环为多个客户端服务.py'
# _date_ = '2022/4/4 20:11'
import socket
def main():
# 1、买个手机(创建套接字 socket)
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2、插入手机卡(绑定本地信息 bind)
tcp_server_socket.bind(("", 1999))
# 3、将手机设置成响铃模式(让默认的套接字由主动变为被动 listen)
tcp_server_socket.listen(128)
# 循环:多次调用accept,实现为多个客户端服务
while True:
print("等待一个新的客户端连接......")
# 4、等待别人的电话打进来(等待客户端连接 accept)
new_client_socket, client_addr = tcp_server_socket.accept()
print("一个新的客户端连接到来%s" % str(client_addr))
# 循环:为同一个客户端提供多次服务
while True:
# 接收客户端的数据
recv_data = new_client_socket.recv(1024)
print("%s客户端发送的数据为:%s" % (str(client_addr) ,recv_data.decode('gbk')))
# 如果recv解堵塞了,分两种情况 1、客户端发送了数据 2、客户端调用了close
if recv_data: # 如果有数据
# 服务器返回响应给客户端
new_client_socket.send("----------ok----------".encode('gbk'))
else:
break
# 关闭套接字 关闭accept返回的套接字则不再为该客户端服务
new_client_socket.close()
print("%s客户端服务完毕......" % str(client_addr))
# 关闭监听的套接字 不再提供服务
tcp_server_socket.close()
if __name__ == "__main__":
main()
运行结果如下:
网络调试助手设置为tcp客户端,绑定代码中的端口号1999即可连接。同时服务端成功接收到客户端发的数据会返回一个ok作为响应。