【问题标题】:Send data from socket to another socket [duplicate]将数据从套接字发送到另一个套接字[重复]
【发布时间】:2015-01-23 09:48:27
【问题描述】:

下面的代码通过套接字从 iPhone 接收数据,然后我想将接收到的数据发送到另一个通过不同套接字运行的 python 脚本。我的尝试如下。另一台服务器可以正常接收消息,但是一旦我发送 second 消息,我就会收到 errno 9 bad file descriptor。无论如何要更改以下代码,以便它可以连续将接收到的数据直接发送到另一个套接字?

import os
from twisted.internet.protocol import Protocol, Factory
from twisted.internet import reactor
from threading import Thread



class IphoneChat(Protocol):


    def connectionMade(self):
        self.factory.clients.append(self)
        print "A new client has connected"

    def connectionLost(self, reason):
        print "client disconnected"

    def dataReceived(self, data):
        print "Message Received: ", data
        TCP_IP = '127.0.0.1'
        TCP_PORT = 5000
        BUFFER_SIZE = 1024
        self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((TCP_IP, TCP_PORT))
        s.send(data)
        s.close()




    def message(self, message):
        self.transport.write(message + '\n')



factory = Factory()
factory.protocol = IphoneChat
factory.clients = []



reactor.listenTCP(3000, factory)
print "listening to 3000"

reactor.run()

【问题讨论】:

  • 请修复代码或填补缺失的部分......它无法工作或sdataReceived() 方法中的全局变量:这将引发您的错误。

标签: python sockets twisted


【解决方案1】:

您的IphoneChat 代码中有几个错误:缺少的import socketself.s = socket.socket(...) 应该只绑定到局部变量s,而不是绑定到实例变量self.s

尽管如此,我认为异常 (socket.error: [Errno 9] Bad file descriptor) 实际上是在您没有显示任何代码的“其他”Python 脚本中引发的。查看该代码会有所帮助,但是,您可能正在关闭 主服务器套接字 以响应 IphoneChat 脚​​本而不是 per 关闭的连接socket.accept() 返回的连接套接字。下面是一些可以作为接收服务器的粗略代码:

import socket

s = socket.socket()
s.bind(('127.0.0.1', 5000))
s.listen(1)

while True:
    print "Waiting for connection... ",
    conn, addr = s.accept()
    print "Got connection from {}".format(addr)
    while True:
        msg = conn.recv(1024)
        if msg == '':
            print "Remote disconnected"
            break
        print "Got msg: %r" % msg

    # N.B. close connection to remote peer, not the main server socket "s"
    conn.shutdown(socket.SHUT_RDWR)
    conn.close()

我的猜测是您的代码类似于上面的代码,但是您正在关闭主服务器套接字而不是远程连接。

【讨论】:

    猜你喜欢
    • 2020-01-16
    • 2016-04-28
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 2011-10-30
    相关资源
    最近更新 更多