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()

最新文章

  1. 读取config配置
  2. 下载Tomcat时Tomcat网站上的core和deployer的区别
  3. Unity Application 前后台切换调用关系
  4. Hibernate报错:org.hibernate.ObjectNotFoundException: No row with the given identifier exists 解决办法
  5. UVA1213Sum of Different Primes(素数打表 + DP)
  6. LeetCode 【190. Reverse Bits】
  7. LDR 和 ADR 彻底详解
  8. DIV嵌套垂直居中
  9. android环境安装之android4.2安装(转)
  10. 韩系高端PK:whoo后VS雪花秀(转载)
  11. 剑指offer系列26--正则表达式匹配
  12. C#基础(二)——C#中的构造函数
  13. C语言实现通用数据结构的高效设计
  14. MySQL 的Coalesce函数
  15. (Bash博弈)51nod1067 Bash游戏 V2
  16. ubuntu14.04上源码安装openssl1.0.2k
  17. ThinkPHP5的数据操作和Thinkphp3.2.3对比小结
  18. 多臂机测试, AB测试
  19. SAP月结操作讲解
  20. artificial neural network in spark MLLib

热门文章

  1. Python list遍历remove()时的一个小BUG
  2. MYSQL的备份与恢复--物理备份xrabackup
  3. Less(1)
  4. AcWing 29. 删除链表中重复的节点
  5. 最小化MarkdownPad 2安装体积(win10)
  6. 洛谷 SP14932 LCA - Lowest Common Ancestor
  7. MySQL常用数据类型 length 专题
  8. 初学者用js做的计算题
  9. pytorch-argparse的用法
  10. Java反射方法总结