我的第一个问题,请温柔:)我正在尝试设置一个多线程的基本Python(2.7)TCP套接字服务器(我尚未进入多线程部分)和客户端。
这是服务器:
# Basic TCP socket server
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = ''
port = 8888
s.bind((host, port))
s.listen(5)
while True:
c, addr = s.accept()
print("Connected to %s" % addr)
c.send("Hello socket")
c.close()
这是客户:
# Basic TCP socket client
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '127.0.0.1'
port = 8888
s.connect((host, port))
print s.recv(1024)
s.close()
当我运行服务器时,它似乎没有错误地执行,但是当我运行客户端进行连接时,我看不到应该打印到运行服务器的终端窗口的消息。这是错误(正如@Rawing指出的那样):
Traceback(最近一次调用最后一次):文件“server.py”,第19行,in print(“已连接到%s”%addr)TypeError:并非在字符串格式化期间转换所有参数
至于使服务器多线程,我需要阅读,但欢迎任何建议。
谢谢。
答案 0 :(得分:0)
您的代码中存在两个问题
您在服务器程序中使用字符串格式化运算符%
不正确。如果将元组传递给%
(并且addr
是一个元组),则元组中的每个项必须匹配一个格式化指令。这就是您的服务器程序失败的原因。
print("Connected to %s" % str(addr))
在这两个程序中,您都提到,但不要调用socket.close
。在适当的位置尝试这些:
s.close()
c.close()
答案 1 :(得分:0)
python 3 中 TCP 服务器的简单实现(如果您愿意使用它而不是 2.7)
服务器:
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
data = self.rfile.readline() # Receive data from client
self.wfile.write(new_data) # Send data to client
if __name__ == "__main__":
with socketserver.UDPServer((HOST, PORT), MyUDPHandler) as server:
server.serve_forever()
客户:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
sock.connect((HOST, PORT)) # Connect
sock.sendall(bytes(data + "\n", "utf-8")) # Send data
received = str(sock.recv(1024), "utf-8") # Receive data synchronically
答案 2 :(得分:-1)
bind
服务器到ip,例如:host='127.0.0.1
,它应该可以工作。
更新:我完全错了。我在你的脚本中修改了一些内容并认为这是问题所在,但事实并非如此 - 正如下面的回复所述,绑定到('',)是完全有效的。
看起来您的套接字代码非常好,但是会超出print语句。我用print("Connected to {}".format(addr))