【问题标题】:Issue With a Simple Server - Client Program简单服务器的问题 - 客户端程序
【发布时间】:2018-01-30 12:32:33
【问题描述】:

我运行以下脚本:

import socket, threading, time,Queue
if __name__ == '__main__':
    pass

print("Starting...")

def server(): 
    s = socket.socket()
    host = socket.gethostname()
    port = 1247
    s.bind((host,port))
    s.listen(5)

    while True:
        c, addr = s.accept()
        print("Connection accepted from " + repr(addr[1]))
        c.send("Server approved connection\n")
        print (addr[1]) + ": " + c.recv(1026)
        c.close()

def client ():
    time.sleep(5)
    print("Client Started")
    s = socket.socket()
    host = socket.gethostname()
    port = 1247
    s.connect((host, port))
    print (s.recv(1024))
    inpt = raw_input('type anything and click enter... ')
    s.send(inpt)
    print ("the message has been sent")

q = Queue.Queue() 
t = threading.Thread(client(), args = (q))
t.daemon = True
t.start()  

server() 

我收到此错误:

Starting...
Client Started
return getattr(self._sock,name)(*args)
socket.error: [Errno 111] Connection refused

请注意,我的设备(Ubuntu 操作系统)中的端口 1247 已打开。

Connection Refused 表示没有可连接的内容。但是服务器出了什么问题,我找不到它的问题。经过一周的尝试后,非常感谢任何帮助!

【问题讨论】:

    标签: python sockets networking server client


    【解决方案1】:

    当您创建线程时,您会意外启动客户端。 threading.Thread 的第一个参数是client(),它执行的客户端包括初始的sleep。哪个阻塞了主线程。您应该将其更改为

    t = threading.Thread(target=client, args = (q,))
    

    目标参数需要一个可调用对象,即您的客户端。一旦你启动了tread,它将在不同的线程上执行客户端。请注意,client 后面缺少()

    【讨论】:

    • TypeError: * 后面的 client() 参数必须是可迭代的,而不是实例
    • 另外,我尝试单独运行服务器并尝试从 CLI 访问 telnet 但连接被拒绝:telnet: Unable to connect to remote host: Connection refused
    • 请问client()target = client有什么区别?
    • 区别在于这里的关键:client()会立即执行函数,target=client将函数作为可调用对象传递给线程,以便线程稍后调用。
    • 另外,必须添加一个逗号,这样(q, ) 就是一个元组。我还建议添加print("Listening on %s" % host)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多