python用tcp写server传输文件遇到的问题

CSDN问答 2021-10-29 15:46:36
Python TCP server 文件 传输

我被要求写包括client,和server在内的三个文件来在本地实现文件传输(通过cmd),
但是我的另一个文件(我取名为Others.py)和client.py好像有问题:
代码如下

# server.pyimport socketimport sysimport Others# Create socket, AF_INET corresponds to IPv4, and SOCK_STREAM corresponds to TCPtcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# bind to the porttcp_socket.bind(('', int(sys.argv[1])))# Convert active socket to passive sockettcp_socket.listen(5)print("Server is listening:")# The combination of an IPv4 address and a port number is known as the socket number# A pair of sockets, one socket at the client side and other socket at the server side,# define the TCP/UDP connection end points# A socket number can uniquely identify a network resource in the whole internet.# From https://www.omnisecu.com/tcpip/what-are-port-and-socket-numbers.phpwhile True: # Use accept to get the address of the sub-socket and the client client_socket, address = tcp_socket.accept() print(f"connection from {address}has been established") # send message client_socket.send(bytes(f"Welcome to this server!", "utf-8")) Others.recv_file(client_socket, 'my.txt') client_socket.close()
# client.pyimport socketimport sysimport Others#def main():# Create sockettcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ip = sys.argv[1]# The port for my laptopport = int(sys.argv[2])# connect to the servertcp_socket.connect((ip, port))full_msg = ''filename = input("please type in your file name \n")tcp_socket.send(bytes(filename,'utf-8'))while True: print('receiving...') # Receive the content returned by the server msg = tcp_socket.recv(4) if msg: break full_msg += msg.decode("utf-8")print(full_msg)Others.send_file(tcp_socket, "C:/Users/ASUS/Desktop/123.txt")tcp_socket.close()print('connection closed')
# Others.pydef send_file(socket , filename): name = filename socket.send(bytes(f"{name}", 'utf-8')) # read in binary mode file = open(filename, 'rb') socket.send(file)def recv_file(socket, filename): name = filename # write in binary mode file = open(name, 'wb') s = socket.recv(1024) while s: file.write(s) s = socket.recv(1024) file.close()

报错如下

#这是cmd的提示Traceback (most recent call last): File "C:\Users\ASUS\Desktop\myTCPserver\client.py", line 33, in <module> Others.send_file(tcp_socket, "C:/Users/ASUS/Desktop/123.txt") File "C:\Users\ASUS\Desktop\myTCPserver\Others.py", line 64, in send_file socket.send(file)TypeError: a bytes-like object is required, not '_io.BufferedReader'C:\Users\ASUS\Desktop\myTCPserver>
#这是cmd的提示C:\Users\ASUS\Desktop\myTCPserver>python server.py 6789Server is listening:connection from ('127.0.0.1', 55603)has been establishedTraceback (most recent call last): File "C:\Users\ASUS\Desktop\myTCPserver\server.py", line 28, in <module> Others.recv_file(client_socket, 'my.txt') File "C:\Users\ASUS\Desktop\myTCPserver\Others.py", line 74, in recv_file s = socket.recv(1024)ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。C:\Users\ASUS\Desktop\myTCPserver>

不知道怎么改,不改变大概结构。有没有人看看




参考答案1:

你这程序每个细节都有毛病,整个乱七八糟。
1.server在建立侦听之后,接到一个请求时要单独给它开个线程,不要直接在主线程里接收数据,否则你server一次只能服务一个client,其它客户端都会被阻塞
2.既然你client在连接后把要传输的文件名发给服务端,你服务端为什么不接收?
3.既然你知道收文件的时候得慢慢收,一点一点存,为什么发文件的时候整个文件读进内存里然后整个发出去,你不怕内存爆炸?
4.你写文件的时候模式是wb,每次执行写入都会把文件从头到尾覆盖。你应该使用a+
5.你解决了循环读文件循环发送的问题,你第一个报错自然就没了。第一个报错信息说send函数接收的数据类型错误。
6.你第二个报错问题其实跟3差不多,你的包太大,导致交换机自动把它拆成多个包,你只收了第一个包就直接close掉了,close应该是发送端close,接收端不要随便close。你的服务端就应该循环接收写入,而不要期待一下把数据收完。
总之你发送和接收应该是对应的过程,不一致肯定不对呀。




参考答案2:



参考答案3:
 # read in binary mode file = open(filename, 'rb') socket.send(file)# 这里改成file = open(filename, 'rb')data = file.read()socket.send(data)

如果觉得答案对你有帮助,请点击下采纳,谢谢~




参考答案4:



参考答案5:

错误的确不少,已经都给你改过来了,也运行成功了,请采纳

客户端

# server.pyimport socketimport sysimport Others# Create socket, AF_INET corresponds to IPv4, and SOCK_STREAM corresponds to TCPtcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# bind to the porttcp_socket.bind(('', int(sys.argv[1])))# Convert active socket to passive sockettcp_socket.listen(5)print("Server is listening:")# The combination of an IPv4 address and a port number is known as the socket number# A pair of sockets, one socket at the client side and other socket at the server side,# define the TCP/UDP connection end points# A socket number can uniquely identify a network resource in the whole internet.# From https://www.omnisecu.com/tcpip/what-are-port-and-socket-numbers.phpwhile True: # Use accept to get the address of the sub-socket and the client client_socket, address = tcp_socket.accept() print(f"connection from {address}has been established") # send message client_socket.send(bytes(f"Welcome to this server!", "utf-8")) Others.recv_file(client_socket, 'my.txt') client_socket.close()

服务器

# client.pyimport socketimport sysimport Others#def main():# Create sockettcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)ip =sys.argv[1]# The port for my laptopport =int(sys.argv[2])# connect to the servertcp_socket.connect((ip, port))msg = tcp_socket.recv(1024)print(msg.decode('utf-8'))filename = input("please type in your file name \n")tcp_socket.send(bytes(filename,'utf-8'))Others.send_file(tcp_socket,filename)tcp_socket.close()print('connection closed')

Others.py

# Others.pydef send_file(socket , filename): name = filename socket.send(bytes(f"{name}", 'utf-8')) #socket.send(codes) # read in binary mode file = open(filename, 'rb').read() socket.send(file) def recv_file(socket, filename): name = filename # write in binary mode file = open(name, 'wb') s = socket.recv(1024) while s: file.write(s) s = socket.recv(1024) file.close()



参考答案6:
版权声明
本文为[CSDN问答]所创,转载请带上原文链接,感谢
https://ask.csdn.net/questions/7548489

  1. Python題,我剛學,還不會
  2. Je viens d'apprendre, pas encore.
  3. 云计算开发:Python3-find()方法详解
  4. Real time access to stock data, free—— Python crawler Sina stock actual combat
  5. Développement de l'informatique en nuage: détails de la méthode Python 3 - find ()
  6. 如何使用Python进行超参调参和调优
  7. 如何使用Python進行超參調參和調優
  8. Comment utiliser Python pour le réglage hyperparamétrique
  9. Première connaissance du module urllib Python
  10. Python入门:看了这篇文章如果1个小时没法入门Python,那么还是换个语言吧!!
  11. Python(day1):Python 3 教程
  12. Python(day3):Python3 安装与环境搭建
  13. Python (day3): installation et environnement Python 3
  14. Python (day1): tutoriel Python 3
  15. Démarrer avec Python: Si vous ne pouvez pas commencer avec Python en une heure, changez de langue!!
  16. Pandas:DataFrame对象的基础操作
  17. 关于#python#的问题:月球上物体的体重在地球上的16.5%,编写程序输出未来10年在地球上和月球上的体重状况
  18. 反转一个3位整数(Python 实现)
  19. Inverse un entier de 3 bits (implémentation Python)
  20. Questions sur # Python #: les objets lunaires pèsent 16,5% de la masse de la terre et un programme est programmé pour produire la masse de la terre et de la lune au cours des 10 prochaines années
  21. Compared with Excel, it is easy to learn Python report automation practice!
  22. 7 excellent open source libraries for learning Python Programming
  23. Use of Python pandas!!!!! Explain in detail
  24. Python Qt GUI设计:QPrinter打印图片类(基础篇—21)
  25. Use of Python pandas!!!!! Explain in detail
  26. 2n行输入,Python,判断字母个数
  27. Notes de Python (XV): dérivation de liste
  28. Notes sur Python (XVI): générateur et Itérateur
  29. Notes de Python (18): décorateur
  30. 2n entrée de ligne, Python, nombre de lettres de jugement
  31. Notes Python (17): fermetures
  32. Notes sur Python (20): fonctions d'ordre supérieur intégrées
  33. 想问问这个Python编程咋做呀?
  34. 想問問這個Python編程咋做呀?
  35. Vous voulez savoir ce que fait cette programmation python?
  36. 11.5K Star,一个开源的 Python 静态类型检查库
  37. Sweetviz:让你只需三行代码实现Python探索性数据分析
  38. Sweetviz:讓你只需三行代碼實現Python探索性數據分析
  39. Sweetviz: vous permet d'effectuer une analyse exploratoire des données python avec seulement trois lignes de code
  40. 11.5k Star, une bibliothèque de vérification de type statique Python Open Source
  41. 刚学Python,想让大大给我解释一下代码
  42. 剛學Python,想讓大大給我解釋一下代碼
  43. Je viens d'apprendre Python et je veux que tu m'expliques le Code.
  44. Python QT GUI Design: qmainwindow, QWidget and qdialog window classes (Fundamentals - 10)
  45. Python爬虫项目实战:快手网页版滑块captchaSession分析
  46. python计算时间十二小时制
  47. Temps de calcul Python 12 heures
  48. Python crawler Project actual Fighting: faster Web Version Slider CAPTCHA session Analysis
  49. Python要学习多久可以掌握?多久可以精通?
  50. Combien de temps Python va - t - il apprendre à maîtriser? Combien de temps faut - il pour maîtriser?
  51. 从官网上下载的python安装包安装不了
  52. 深度学习项目:如何使用Python和OpenCV进行人脸识别
  53. python编辑语言如内容所示
  54. La langue d'édition Python est affichée dans le contenu
  55. 有谁知道这怎么回事嘛(Python的简单代码)
  56. 有誰知道這怎麼回事嘛(Python的簡單代碼)
  57. Qui sait ce qui se passe?
  58. Python求某个数的因数【因数是指能被这个数整除的数。例如6的因数有:1、2、3、6; 7的因数有:1、7; 8的因数有:1、2、4、8】。
  59. Python calcule les facteurs d'un nombre [les facteurs sont des nombres qui peuvent être divisés par ce nombre. Par exemple, les facteurs de 6 sont: 1, 2, 3, 6; les facteurs de 7 sont: 1, 7; et les facteurs de 8 sont: 1, 2, 4, 8].
  60. 如何创建一个python程序来模拟电影院的座位预订