2.Python网络编程_TCP(简略版)

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()
2.Python网络编程_TCP(简略版)的更多相关文章
- 1.Python网络编程_UDP(简略版)
# -*- coding: utf-8 -*- #2019-11-24 import socket def recv(): udp_socket=socket.socket(socket.AF_INE ...
- python 网络编程第四版
使用SocketServer 模块来完成服务端编程 1.服务端代码如下: #!/usr/bin/python #!coding:utf-8 import SocketServer as sockets ...
- python 网络编程第三版
为服务端增加多线程解决方案 1.服务端代码如下: ***这个版本并没有真正的起到多线程的作用,主要原因在于t.join():以后的版本会改进这个问题*** #!/usr/bin/python #!co ...
- Python网络编程基础 PDF 完整超清版|网盘链接内附提取码下载|
点此获取下载地址提取码:y9u5 Python网络编程最好新手入门书籍!175个详细案例,事实胜于雄辩,Sockets.DNS.Web Service.FTP.Email.SMTP.POP.IMAP. ...
- Python网络编程基础pdf
Python网络编程基础(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1VGwGtMSZbE0bSZe-MBl6qA 提取码:mert 复制这段内容后打开百度网盘手 ...
- python网络聊天器多线程版
在之前的一篇文章(python网络编程-udp)中实现了一个简单的udp聊天器,只能在单线程下进行收发数据,在学习完多线程之后,实现一个能同时收发数据的udp聊天器. 说明: 编写一个有2个线程的程序 ...
- Python网络编程(一)
最近在啃<python核心编程(第三版)>,感觉这本书并不是特别的友好,虽然有基于python3提出的改进代码:但是整书的基准感觉还是在python2.7.所以python3的代码中还是有 ...
- 28、Python网络编程
一.基于TCP协议的socket套接字编程 1.套接字工作流程 先从服务器端说起.服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客 ...
- 图解Python网络编程
返回目录 本篇索引 (1)基本原理 (2)socket模块 (3)select模块 (4)asyncore模块 (5)asynchat模块 (6)socketserver模块 (1)基本原理 本篇指的 ...
随机推荐
- 三、ITK的dcm图像读写
一.主要功能 1.读取单张dcm图像 2.写入单张dcm图像 3.图像调整之后以.jpg格式写入 4.调整之后重新以.dcm格式写入 二.代码 #include "itkImageFileR ...
- 0day2安全——笔记1
第一章 PE和内存之间的映射 节偏移 文件偏移地址(File Offset Address):数据在PE文件中的地址 装载地址(Image Base):PE装入内存的基地址 虚拟内存地址(Virtua ...
- 浅谈C++ STL list 容器
浅谈C++ STL list 容器 本篇随笔简单讲解一下\(C++STL\)中\(list\)容器的使用方法和使用技巧. list容器的概念 学习过\(C++STL\)的很多同学都知道,\(STL\) ...
- kindEditor 修改上传图片的路径
压缩过的js类似
- 从零开始的微信小程序入门教程(一)
之前说要和同事一起开发个微信小程序项目,现在也在界面设计,功能定位等需求上开始实施了.所以在还未正式写项目前,打算在空闲时间学习下小程序.本意是在学习过程中结合实践整理出一个较为入门且不是很厚的教程, ...
- 从游击队到正规军(二):马蜂窝旅游网的IM客户端架构演进和实践总结
一.引言 移动互联网技术改变了旅游的世界,这个领域过去沉重的信息分销成本被大大降低.用户与服务供应商之间.用户与用户之间的沟通路径逐渐打通,沟通的场景也在不断扩展.这促使所有的移动应用开发者都要从用户 ...
- new 关键字 和 newInstance() 方法的 区别
区别1: new是一个关键字,可以说是一个指令: newInstance()是一个方法,Class对象的一个方法. 区别2: new主要作用是在内存中生成一个实例,而这个类可以没有提前加载到内从中: ...
- 0x00007FFC8C5325E7 (ucrtbased.dll)处(位于 DataStructure.exe 中)引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突。
此处为非“%s” 类型数据以“%s”类型打印错误. 需要仔细检查代码中数据类型错误.
- .Net ADO拼接带参数的SQL语句
首先是在DAL数据访问层中的代码://数据更新的方法public static int shuxing_update(s_passnature model) { string sql = " ...
- Elastic:用Docker部署Elastic栈
安装 因为我们需要使用docker来进行安装,我们必须安装: docker:根据不同的操作系统,请按照要求安装docker.可以到网站https://docs.docker.com/去安装 docke ...