2.Python网络编程_TCP(简略版)
2024-09-06 10:07:31
TCP监听套接字:
当新的客户端请求连接时,服务器端监听套接字收到消息,会分配一个新的套接字对应于客户端(新socket包括四部分:源IP、源端口号、目的IP、目的端口号)用于接收客户端的消息,仔细观察可以看出对于不同的客户端每个新产生的套接字的源IP和源端口号都是一样的,目的IP和目的端口号则不同,说明四元组只要其中一个不相同,这个socket就是不一样的.
#tcp客户端
import socket def cilent():
#1.创建TCP套接字
# socket.AF_INET:IPV4 socket.SOCK_STREAM:TCP
socket_tcp_cilent=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #客户端一般不绑定(bind)ip和port
#2.连接服务器
server_ip='192.168.1.103'
server_port=5566
server_addr=(server_ip,server_port)
socket_tcp_cilent.connect(server_addr) while True:
#3.发送数据/接收数据
send_data=input("请输入要发送的数据: ")
if send_data=='exit':
print("客户端关闭!")
break
socket_tcp_cilent.send(send_data.encode('utf-8'))
recv_data,recv_ip_port=socket_tcp_cilent.recvfrom(1024)
print("服务器端回送的消息%s"%(recv_data.decode('gbk'))) #4.关闭TCP连接
socket_tcp_cilent.close() if __name__=='__main__':
cilent();
#TCP服务器端
import socket def server():
num=1
#1.创建套接字
socket_tcp_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #2.绑定本地信息 bind(ip,port)
server_ip=''
server_port=5566
server_addr=(server_ip,server_port)
socket_tcp_server.bind(server_addr) #3.让默认的套接字由主动变为被动 listen
#监听套接字:负责等待新的各个客户端进行连接
socket_tcp_server.listen(128) #4.等待客户端的连接 accept
# 程序执行的到这里默认阻塞,当客户端连接服务端时,解阻塞
# accept 返回一个二元元组,第一个是新的套接字,第二个是客户端
# accept 负责产生新的套接字为客户端服务
while True:
print('等待一个新的客户端的到来...')
new_cilent_socket,cilent_addr=socket_tcp_server.accept()
#accept返回的新socket包括四部分:源IP、源端口号、目的IP、目的端口号,这个四元组确定一个套接字
#仔细观察可以发现对应于每个客户端的新分配的socket的源IP和源端口号是一样的,目的IP和目的端口号是不一样的
#四元组一个不一样,就是一个不同的socket
#具体见 https://blog.csdn.net/woxiaohahaa/article/details/78038442
print('新分配的套接字: ',new_cilent_socket)
print('一个新的客户端已经到来%s'%str(cilent_addr))
while True: #循坏多次,为同一个客户端服务多次
#使用新分配的套接字,接收客户端发送过来的请求
#如果recv阻塞,两种方式解阻塞:
#1.客户端发送过来数据
#2.客户端调用close导致
try:
recv_data=new_cilent_socket.recv(1024) #接收到普通数据
except:
break
print('客户端发送过来的请求是:%s'%recv_data.decode('utf-8'))
#如果客户机不需要服务了,当客户端socket.close()执行时,服务器套接字的消息会为空(recv解阻塞)
#回送部分数据给客户端
new_cilent_socket.send('-------ok-------'.encode('utf-8'))
#关闭套接字
new_cilent_socket.close()
print('%d号客户机已经服务完毕!'%num)
num+=1
#关闭套接字
socket_tcp_server.close() if __name__=='__main__':
server()
最新文章
- 读取config配置
- 下载Tomcat时Tomcat网站上的core和deployer的区别
- Unity Application 前后台切换调用关系
- Hibernate报错:org.hibernate.ObjectNotFoundException: No row with the given identifier exists 解决办法
- UVA1213Sum of Different Primes(素数打表 + DP)
- LeetCode 【190. Reverse Bits】
- LDR 和 ADR 彻底详解
- DIV嵌套垂直居中
- android环境安装之android4.2安装(转)
- 韩系高端PK:whoo后VS雪花秀(转载)
- 剑指offer系列26--正则表达式匹配
- C#基础(二)——C#中的构造函数
- C语言实现通用数据结构的高效设计
- MySQL 的Coalesce函数
- (Bash博弈)51nod1067 Bash游戏 V2
- ubuntu14.04上源码安装openssl1.0.2k
- ThinkPHP5的数据操作和Thinkphp3.2.3对比小结
- 多臂机测试, AB测试
- SAP月结操作讲解
- artificial neural network in spark MLLib