基本的Python TCP套接字服务器&客户

时间:2018-01-23 16:53:02

标签: python python-2.7 sockets

我的第一个问题,请温柔:)我正在尝试设置一个多线程的基本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:并非在字符串格式化期间转换所有参数

至于使服务器多线程,我需要阅读,但欢迎任何建议。

谢谢。

3 个答案:

答案 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))

修复了它
相关问题