【问题标题】:TCP connection with Python sockets - send() function issue与 Python 套接字的 TCP 连接 - send() 函数问题
【发布时间】:2021-03-19 02:14:05
【问题描述】:

我正在尝试使用套接字在客户端建立 TCP 连接。第一部分似乎工作正常:

import socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
HOST = '127.0.0.1'  # The server's hostname or IP address
PORT = 1234        # The port used by the server
s.connect((HOST, PORT))

现在对于send(),服务器端需要:

一旦连接了客户端,它需要发送以下字符串以发送标记<TRIGGER>XXXX</TRIGGER>在我们的例子中,XXX 被定义为var.trigger

当我像s.send(bytes (var.trigger)) 这样编写它时,它运行时没有错误,但是,我猜是因为它没有被定义为服务器无法识别的字符串。

提前谢谢你 p.s.我不会用 Python 编写代码,所以它可能是我在这里缺少的一些非常基本的东西。

【问题讨论】:

  • 尝试s.send(bytes(f"<TRIGGER>{var.trigger}</TRIGGER>")),如果您正在运行python 2,请使用连接。还可以考虑发布一个stackoverflow.com/help/minimal-reproducible-example,其中包含var.trigger的定义。
  • 等等,这怎么返回没有错误? var.trigger 已经是 bytes 对象了吗?无论如何,您需要解码 var.trigger(如果它是 bytes)并在我的示例中对 f 字符串进行编码以使其工作。
  • @MichaelRuth 非常感谢。我会尝试让它以这种方式工作。我实际上不知道 TCP 服务器是在接收字节还是字符串,以及 var。触发器是值(例如 1、2、3)。我会破解的。谢谢

标签: python sockets tcp


【解决方案1】:

我对 python 套接字也很陌生,但我试过了,它奏效了。我的猜测是,您需要等待数据发送(在您的服务器端),如下所示:

    while True: # Infinite loop
        data = conn.recv(1024)  # 1024 = number of bytes to be recieves
        if not data:  # If data is false, or an empty string/list, etc.
            break
        print("Recieved:", data.decode('utf-8')) # Printing recieved data

完整代码如下:

import socket

# ========== SERVER ==========

def server():
    s = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM) # Setting up socket
    HOST = '127.0.0.1' # Localhost
    PORT = 65432

    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept() # Accepting connection
    print("========== SERVER ==========")
    print("Connected by:", addr)
    while True: # Infinite loop
        data = conn.recv(1024)  # 1024 = number of bytes to be recieves
        if not data:  # If data is false, or an empty string/list, etc.
            break
        print("Recieved:", data.decode('utf-8')) # Printing recieved data


# ========== CLIENT ==========

def client():
    s = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
    HOST = '127.0.0.1'  # Localhost
    PORT = 65432

    s.connect((HOST, PORT)) # Connecting to server
    print("========== CLIENT ==========")
    var = 'XXXX' # Replace with actual variable
    s.sendall(f"<TRIGGER>{var}<TRIGGER>".encode('utf-8')) # Sending trigger message
    print(f"Sent: <TRIGGER>{var}<TRIGGER>")

【讨论】:

  • 请原谅我糟糕的拼写,我有 Grammarly 是有原因的 ;)
  • 非常感谢-我使用了您的s.sendall(f"&lt;TRIGGER&gt;{var}&lt;TRIGGER&gt;".encode('utf-8')),它没有显示任何错误:) 所以我会尝试在服务器端检查它。再次感谢
  • 由于我也是套接字编程的初学者,我很想知道它是否有效@JovanaBjekic。有吗?
  • 嗨,它没有显示任何错误 - 但是,我没有访问服务器端的权限,所以我正在等待他们告诉我 TCP 服务器是否正在接收字节或字符串。我会在收到此信息后立即返回结果:)
猜你喜欢
  • 1970-01-01
  • 2011-06-17
  • 2010-12-01
  • 2021-09-10
  • 1970-01-01
  • 2021-01-19
  • 2011-08-31
  • 2023-03-21
相关资源
最近更新 更多