首页 / PYTHON / python——tcp网络通信
python——tcp网络通信
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python——tcp网络通信,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5832字,纯文字阅读大概需要9分钟。
内容图文
![python——tcp网络通信](/upload/InfoBanner/zyjiaocheng/617/4cd9c1fd441f41fdb2e3f38b52adaad9.jpg)
TCP通信需要经过创建连接,数据传递、终止连接三个步骤,保障了数据的稳定性。注:TCP严格区分服务器和客户端。
可靠传输:
(1)TCP采用发送应答机制
TCP发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传输成功
(2)超时重传
发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。
TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。
(3)错误校验
TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。
(4)流量控制和阻塞管理
流量控制用来避免主机发送得过快而使接收方来不及完全收下。
TCP通信流程:
一、TCP客户端
TCP的客户端要比服务器端简单很多,如果说服务器端是需要自己买手机,查手机卡,设置铃声,等待别人打电话流程的话,那么客户端就只要找一个电话亭,拿起电话拨打即可,流程要少很多。
import socket
def myClient():
#创建tcp的套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#目的信息
server_ip = input("请输入服务器的ip:")
server_port = int(input("请输入服务器的端口"))
#链接服务器
tcp_socket.connect((server_ip, server_port))
#发送 & 接收数据
send_data = input("请输入需要发送的数据:")
tcp_socket.send(send_data.encode('utf-8'))
#关闭套接字
tcp_socket.close()
return None
if __name__ == '__main__':
myClient()
1、使用网络调试助手充当服务器
二、tcp服务器(先收再发)
1、tcp服务器创建流程
- 1、socket创建一个套接字
- 2、bind绑定ip和port
- 3、listen使套接字变为可以被动连接
- 4、accept等待客户端的链接
- 5、recv / send接收发送数据
- 注:listen参数:可以连接的客户端数(有限,默认是128)
2、循环为多个客户端服务
import socket
def myServer():
#创建socket
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#绑定本地信息
tcp_server_socket.bind(("", 7890))
#让默认的套接字由主动变为被动
tcp_server_socket.listen(128) #监听状态
#循环为多个客户端服务
while True:
print("等待一个新的客户端的到来........")
#client_socket 用来为这个客户端服务,此时就等价于发起链接请求的客户端的socket
#tcp_server_socket就可以省下来专门等待其他新客户端的链接
client_socket, clientAddr = tcp_server_socket.accept()
print("一个新的客户端已经到来:%s" % str(clientAddr))
#为同一个客户端服务多次
while True:
#接收客户端发送过来的数据
recv_data = client_socket.recv(1024)
print("客户端发来的数据是:%s" % recv_data.decode('utf-8'))
#如果recv解堵塞,那么有两种方式
#1、客户端发送过来数据
#2、客户端调用close导致了这里recv解堵塞
if recv_data:
#回送一部分数据给客户端
client_socket.send("hahahah".encode('utf-8'))
else:
break
client_socket.close()
print("已经为该客户端服务完毕.......")
print("=" * 50)
#关闭为这个客户端服务的套接字,只要关闭了,就意味着不能再为这个客户端服务了
tcp_server_socket.close()
return None
if __name__ == '__main__':
myServer()
3、服务器解堵塞方法:
如果recv解堵塞,那么有两种方式
- 1、客户端发送过来数据
- 2、客户端调用close导致了这里recv解堵塞
三、tcp注意点
- tcp服务器一般情况下都需要绑定,否则客户端找不到这个服务器
- tcp客户端一般不绑定,因为是主动链接服务器,所以只要确定好服务器的ip、port等信息就好,本地客户端可以随机
- tcp服务器中通过listen可以将socket创建出来的主动套接字变为被动的,这是做tcp服务器时必须要做的
- 当客户端需要链接服务器时,就需要使用connect进行链接,udp是不需要链接的而是直接发送,但是tcp必须先链接,只有链接成功才能通信
- 当一个tcp客户端连接服务器时,服务器端会有1个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务
- listen后的套接字是被动套接字,用来接收新的客户端的链接请求的,而accept返回的新套接字是标记这个新客户端的
- 关闭listen后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之前已经链接成功的客户端正常通信。
- 关闭accept返回的套接字意味着这个客户端已经服务完毕
- 当客户端的套接字调用close后,服务器端会recv解堵塞,并且返回的长度为0,因此服务器可以通过返回数据的长度来区别客户端是否已经下线
注:tcp严格区分服务器和客户端,但是udp不区分。一般收数据的需要端口绑定。
四、文件下载器
思路:客户端先向服务器发送文件名,服务器收到客户端发来的文件名后,寻找对应文件,并读出文件内容发送给客户端,客户端收到服务器发来的文件内容,将其存在对应的文件中去。
1、服务器
import socket
def send_file_2_client(client_socket, client_addr):
#1、接收客户端,需要下载的文件名
file_name = client_socket.recv(1024).decode('utf-8')
print("客户端(%s)需要下载的文件是:%s" % (str(client_addr), file_name))
file_content = None
#2、打开这个文件,读取数据
try:
f = open(file_name, "rb")
file_content = f.read()
f.close()
except Exception as ret:
print("没有要下载的文件(%s)" % file_name)
#3、发送文件中的数据给客户端
if file_content:
client_socket.send(file_content)
def main():
# 1、创建socket
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2、绑定本地信息
tcp_server_socket.bind(("", 7890))
# 3、让默认的套接字由主动变为被动
tcp_server_socket.listen(128) # 监听状态
#循环为多个客户使用
while True:
#4、等待客户端的链接
client_socket, client_addr = tcp_server_socket.accept()
#5、调用发送文件函数,完成为客户端服务
send_file_2_client(client_socket, client_addr)
#6、关闭套接字
client_socket.close()
tcp_server_socket.close()
return None
if __name__ == '__main__':
main()
2、客户端
import socket
def fileSave(filename, recv_data):
"""获取文件的内容"""
if recv_data:
with open("[new]" + filename, 'wb') as f:
f.write(recv_data)
print("%s保存成功,请注意查看...." % filename)
def fileDownliad():
#1、创建socket
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#2、获取服务器的ip和port
server_ip = input("请输入服务器的ip:")
server_port = int(input("请输入服务器的port:"))
#3、链接服务器
tcp_client_socket.connect((server_ip, server_port))
#4、获取下载的文件名字
download_filename = input("请输入要下载的文件名:")
#5、将文件名字发送到服务器
tcp_client_socket.send(download_filename.encode("utf-8"))
#6、接受文件中的数据 1M
recv_data = tcp_client_socket.recv(1024*1024)
#7、保存接收到的数据到一个文件中
fileSave(download_filename, recv_data)
#8、关闭socket
tcp_client_socket.close()
return None
if __name__ == '__main__':
fileDownliad()
内容总结
以上是互联网集市为您收集整理的python——tcp网络通信全部内容,希望文章能够帮你解决python——tcp网络通信所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。