保持套接字监听python,避免管道断线错误

萨扬·高希尔

我试图找到解决方案,但在任何帖子上都没有找到。我正在尝试在两个套接字之间创建一个文件共享系统,但是当我的客户端连接到服务器时,在第一次由服务器发送时,我遇到了管道损坏错误。有什么我必须做的事情来保持套接字监听或我可以通过任何其他方式进行这种传输吗?我还运行一个中央服务器,它使这两个客户端在与套接字之一相同的 IP 上成为服务器-客户端对。这会导致这个问题吗(我在它创建临时对后让它进入睡眠状态)这里是服务器代码:

 def create_server(self,ip,path ): #ip is of the server
    connection_list = []
    print(ip)
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind((ip, 12345))
    print("server created")
    connection_list.append(sock)
    sock.listen(1)
    #offset = 0
    file = open(path, "rb")
    print("file opened")
    while True:
        print("waiting for connection...")
        conn, addr = sock.accept()
        print ('New connection from %s:%d' % (addr[0], addr[1]))
        print("accepted connection")
        connection_list.append(conn)           
        sock.send(str("Start").encode()) # THIS CAUSES BROKEN PIPE ERROR
        chunk = file.read(4096)
        print("chunk read")
        if not chunk:
            break  # EOF
        sock.send(chunk)
        print("chunk sent")
    sock.send(str("ENDED").encode())
    print("Transfer complete")
    sock.close()

这是客户端代码:

def create_client(self,ip,file ): #ip of server
    print(ip)
    print("going to download",str(file))
    try:
        client=socket.create_connection((ip, 12345 ))
    except:
        client=socket.create_connection((ip, 12346 ))
    print("client created")
    with open(str(file), 'wb') as f:
      socket_list = [client]
      print("file opened")
      data=client.recv(4096)
      while data.decode()!="Start":
                        data=client.recv(4096)
      while True:
           print("started")
           data=client.recv(4096)
           print("recieved data")
           if data.decode()=="ENDED":
                   break
      f.write(data)
      print("Transfer complete")
    f.close()
    time.sleep(5)
    client.close()
克里斯蒂·法蒂

问题是在您的服务器程序中,您试图在错误的套接字上发送数据。

sock是服务器(或主,如果你愿意的话)套接字。这仅用于侦听传入连接。

[Python]:套接字。accept ()文档指出:

接受连接。套接字必须绑定到一个地址并侦听连接。返回值是一对(conn, address),其中conn可用于在连接上发送和接收数据套接字对象address是绑定到连接另一端的套接字的地址。

  • 从以下位置更改您的行(以及所有其他具有 的行sock.send):

    sock.send(str("Start").encode())
    

    至:

    conn.send("Start".encode())
    
  • 线路:

    conn.send("ENDED".encode())
    print("Transfer complete")
    

    应该在while循环内移动(缩进),也许你可以conn.close()在循环的末尾添加一个

在您的客户端程序中:

  • try/except子句是没用的,因为服务器不监听端口12346
  • 如果文件包含“ENDED”字符串,您将不会收到完整的内容。我建议让你的结束标签更复杂(所以它出现在文件中的机会尽可能少),或者更好:

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在python中同时监听命名管道和套接字

来自分类Dev

C中的套接字“监听”错误

来自分类Dev

套接字错误-python

来自分类Dev

套接字错误-python

来自分类Dev

Nodejs和套接字io错误:监听EADDRINUSE

来自分类Dev

错误的请求套接字python

来自分类Dev

尝试运行Unicorn时出现“监听循环错误:非套接字上的套接字操作”

来自分类Dev

Python:如何彻底关闭套接字以避免“无法分配请求的地址”错误(高频)

来自分类Dev

无法让套接字保持活动状态的Python

来自分类Dev

Python:套接字监听连接时显示消息“ Waiting for player ...”

来自分类Dev

python套接字监听器高负载

来自分类Dev

获取套接字监听的事件

来自分类Dev

创建多个监听套接字

来自分类Dev

python套接字错误:无法在套接字上选择

来自分类Dev

尝试在Python套接字中将数据从服务器发送到客户端时出现管道错误

来自分类Dev

从套接字错误python导入模块

来自分类Dev

Python套接字错误没有35

来自分类Dev

故意创建套接字错误/ Python脚本

来自分类Dev

python套接字错误请求400

来自分类Dev

python urllib收到[Errno套接字错误]

来自分类Dev

Python套接字输出错误的参数

来自分类Dev

Laravel Websockets导致python套接字错误

来自分类Dev

python套接字错误请求400

来自分类Dev

Python SimpleXMLRPCServer:套接字错误,连接被拒绝

来自分类Dev

带套接字的Python文件传输错误

来自分类Dev

如何使Unix套接字监听器

来自分类Dev

SocketIO断开连接,退出套接字监听

来自分类Dev

无法使用UDP套接字监听C ++

来自分类Dev

java套接字监听不接受连接?