Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中如何从同一套接字发送和接收?_Python_Sockets - Fatal编程技术网

在Python中如何从同一套接字发送和接收?

在Python中如何从同一套接字发送和接收?,python,sockets,Python,Sockets,我正在尝试用Python编写一个客户端程序,可以从同一个套接字发送和接收数据,但它总是给我相同的错误,地址已经在使用中。这是我要写的函数 def Login(): username=raw_input() password=raw_input() message=raw_input() array=[username,password,message] TCP_IP = '127.0.0.1' TCP_PORT = 5563 BUFFER

我正在尝试用Python编写一个客户端程序,可以从同一个套接字发送和接收数据,但它总是给我相同的错误,地址已经在使用中。这是我要写的函数

def Login():
    username=raw_input()
    password=raw_input()
    message=raw_input()
    array=[username,password,message]

    TCP_IP = '127.0.0.1'
    TCP_PORT = 5563
    BUFFER_SIZE = 1024  # Normally 1024, but we want fast response
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((TCP_IP, TCP_PORT))
    array_string=pickle.dumps(array)
    sock.send(array_string)
    sock.close()

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind((TCP_IP, TCP_PORT))
    sock.listen(1)

    conn, info = sock.accept()
    while 1:
        data = serverSocket.recv(1024)
        if not data:break
    conn.send(data)  
    conn.close()

这里有很多真正的新手错误

  • 您永远无法将TCP套接字连接到自身。必须有两个不同的插座

  • 如果您确实希望获取先前在侦听套接字上发送的数据,则必须创建、绑定并配置此侦听套接字,以便在客户端连接之前进行侦听(或者,至少在几秒钟内与此连接尝试并行,因此连接尝试将尝试-但这很可能在本地主机上不起作用)

  • 如果connect和accept都处于阻塞状态,则不能在同一线程中等待它们。最简单的方法是将客户端和服务器端分离为两个不同的程序,并手动并行运行它们。然后,在成功调试之后,您将能够在同一进程的不同线程中执行此操作,或者使用事件驱动引擎


  • 虽然您可能无法将套接字连接到自身以发送和接收数据,但您可以从下面的示例中学习,该示例受您尝试执行类似操作的代码的启发

    import _thread
    import pickle
    import socket
    import time
    
    
    def main():
        """Run a server in a thread and start a client to talk to it."""
        _thread.start_new_thread(run_server, ('', 5563))
        run_client('localhost', 5563)
    
    
    def run_server(host, port):
        """Handle all incoming connections by spawning worker threads."""
        server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        server.bind((host, port))
        server.listen(5)
        while True:
            _thread.start_new_thread(handle_connection, server.accept())
    
    
    def handle_connection(client, address):
        """Answer an incoming question from the connected client."""
        print('Incoming connection from', address)
        client.settimeout(0.1)
        data = recvall(client)
        client.shutdown(socket.SHUT_RD)
        question = pickle.loads(data)
        answer = '''len(username) = {}
    len(password) = {}
    len(message) = {}'''.format(*map(len, question))
        client.sendall(answer.encode())
        client.shutdown(socket.SHUT_WR)
        client.close()
        print('Finished with', address)
    
    
    def recvall(connection):
        """Receive all data from a socket and return as a bytes object."""
        buffer = bytearray()
        while True:
            try:
                data = connection.recv(1 << 12)
            except socket.timeout:
                pass
            else:
                if data:
                    buffer.extend(data)
                else:
                    return bytes(buffer)
    
    
    def run_client(host, port):
        """Collect information from question and display returned answer."""
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        time.sleep(0.1) # wait for server to start listening for clients
        client.connect((host, port))
        time.sleep(0.1) # wait for handler thread to display connection
        username = input('Username: ')
        password = input('Password: ')
        message = input('Message: ')
        question = pickle.dumps((username, password, message))
        client.sendall(question)
        client.shutdown(socket.SHUT_WR)
        answer = recvall(client)
        client.shutdown(socket.SHUT_RD)
        client.close()
        print(answer.decode())
        time.sleep(0.1) # wait for handler to cleanly terminate execution
    
    if __name__ == '__main__':
        main()
    
    import\u线程
    进口泡菜
    导入套接字
    导入时间
    def main():
    “”“在线程中运行服务器并启动客户端与之对话。”“”
    _启动新线程(运行服务器,('',5563))
    运行客户端('localhost',5563)
    def run_服务器(主机、端口):
    “”“通过生成工作线程来处理所有传入连接。”“”
    服务器=socket.socket(socket.AF\u INET,socket.SOCK\u流)
    server.bind((主机、端口))
    服务器。听(5)
    尽管如此:
    _thread.start\u new\u线程(handle\u连接,server.accept())
    def句柄_连接(客户端,地址):
    “”“回答来自连接的客户端的传入问题。”“”
    打印('来自'的传入连接',地址)
    client.settimeout(0.1)
    数据=recvall(客户端)
    客户端关闭(套接字关闭)
    问题=pickle.load(数据)
    答案='''len(用户名)={}
    len(密码)={}
    len(消息)={}''。格式(*映射(len,问题))
    client.sendall(answer.encode())
    客户端关闭(套接字关闭)
    client.close()
    打印('已完成',地址)
    def recvall(连接):
    “”“从套接字接收所有数据并作为字节对象返回。”“”
    缓冲区=字节数组()
    尽管如此:
    尝试:
    
    data=connection.recv(1感谢您的帮助。是的,我是新手。您使用的不是同一个套接字。您使用的是两个连续的套接字。