【问题标题】:Client - Server socket programming with python客户端 - 使用 python 进行服务器套接字编程
【发布时间】:2019-01-03 17:53:07
【问题描述】:

以下是我的三个脚本。我需要将消息从 sricpt 1(Sensor.py) 发送到脚本 2.(Client.py)。然后脚本 2 应该将消息发送到脚本 3(Server.py)。 在脚本 2 之前它工作正常,但在脚本 3 中没有收到消息,并且 recvfrom() 一直在等待。没有错误,但脚本 3 没有显示该消息。我使用UDP。请帮忙。

脚本 1(Sensor.py)

from socket import *
from time import ctime

CLIENT_IP = '192.168.1.109'
PORT = 23567
BUFSIZE = 1024
ADDR = (CLIENT_IP, PORT)

udpCliSock = socket(AF_INET, SOCK_DGRAM)

while True:
    sendData = input("> ")
    if sendData is None:
        break
    udpCliSock.sendto(sendData.encode(), ADDR)

udpCliSock.close()

脚本 2(Client.py)

from socket import *
from time import ctime

HOST = '192.168.1.103'
CLIENT_IP='192.168.1.109'
PORT = 5005
SENSOR_PORT_NO=23567
BUFSIZE = 1024
ADDR = (HOST, PORT)
CLIENT_ADDR=(CLIENT_IP,SENSOR_PORT_NO)

udpCliSock = socket(AF_INET, SOCK_DGRAM)
client = socket(AF_INET, SOCK_DGRAM)
client.bind(CLIENT_ADDR)
while True:

    print("...waiting for response...")
    #recv_data, ADDR = udpCliSock.recvfrom(BUFSIZE)
    recv_data, ADDR = client.recvfrom(1024)
    if recv_data is not None:
        recv_data = recv_data.decode()
        print("[%s]: receiving data from server %s:%s  :%s" % (ctime(),ADDR[0], ADDR[1], recv_data))

    sendData = recv_data
    udpCliSock.sendto(sendData.encode(), ADDR)

udpCliSock.close()

脚本 3(Server.py)

from socket import *
from time import ctime

HOST = '192.168.1.103'
PORT = 5005
BUFSIZE = 1024
ADDR = (HOST, PORT)

udpSerSock = socket(AF_INET, SOCK_DGRAM)
udpSerSock.bind(ADDR)
while True:
    print("...waiting for message...")
    data, ADDR = udpSerSock.recvfrom(BUFSIZE)
    print(data.decode)
    if data is None:
        break
    print("[%s]: From Address %s:%s receive data: %s" % (ctime(),ADDR[0],ADDR[1], data.decode()))

udpSerSock.close()

【问题讨论】:

    标签: python sockets network-programming client-server communication


    【解决方案1】:

    问题在于,在 Client.py 中,当您从传感器接收到数据报时,您正在覆盖服务器的地址。这里:

    recv_data, ADDR = client.recvfrom(1024)
    

    ADDR 以服务器的套接字地址开始,但此函数用传感器的套接字地址覆盖该变量。因此,当您尝试发送时,您会将其发送回传感器(当然传感器从未收到过)。

    更好的方法是在开始时将connect 那个套接字连接到服务器。然后你可以只使用send 而不是sendto,因为地址不会改变。之后应该工作:

    ...
    udpCliSock = socket(AF_INET, SOCK_DGRAM)
    udpCliSock.connect(ADDR)                # <<<<<<===============
    client = socket(AF_INET, SOCK_DGRAM)
    client.bind(CLIENT_ADDR)
    while True:
        print("...waiting for response...")
        recv_data, addr = client.recvfrom(1024)
        if recv_data is not None:
            recv_data = recv_data.decode()
            print("[%s]: receiving data from server %s:%s  :%s" % (ctime(),addr[0], addr[1], recv_data))
        sendData = recv_data
        udpCliSock.send(sendData.encode())  # <<<<<<===============
    udpCliSock.close()
    

    【讨论】:

      猜你喜欢
      • 2014-04-11
      • 2013-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多