簡體   English   中英

客戶端-使用python進行服務器套接字編程

[英]Client - Server socket programming with python

以下是我的三個腳本。 我需要將消息從腳本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()

問題在於,在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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM