【问题标题】:Loop not occurring using python socket使用python套接字未发生循环
【发布时间】:2021-11-20 09:06:49
【问题描述】:

我在树莓派上使用服务器代码,在笔记本电脑上使用客户端代码。我也关闭了计算机上的防火墙。连接到服务器后,我设法通过键入“数据”一词从客户端运行循环一次,当我键入另一个命令时,它刚刚退出循环。如果我键入 Quit,它会说它有一个 OS error98 地址已在使用中。我可以知道如何保持循环吗?下面是我的client.py和server.py代码。

Server.py 代码:

import socket
import numpy as np
import encodings

HOST = '192.168.1.65'  
PORT = 65432        # Port to listen on (non-privileged ports are > 1023)
def random_data():          # ANY DATA YOU WANT TO SEND WRITE YOUR SENSOR CODE HERE

    x1 = np.random.randint(0, 55, None)         # Dummy temperature
    y1 = np.random.randint(0, 45, None)         # Dummy humidigy
    my_sensor = "{},{}".format(x1,y1)
    return my_sensor                            # return data seperated by comma
def my_server():

    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        print("Server Started waiting for client to connect ")
        s.bind((HOST, PORT))
        s.listen(5)
        conn, addr = s.accept()

        with conn:
            print('Connected by', addr)
            while True:

                data = conn.recv(1024).decode('utf-8')

                if str(data) == "Data":

                    print("Ok Sending data ")

                    my_data = random_data()

                    x_encoded_data = my_data.encode('utf-8')

                    conn.sendall(x_encoded_data)

                elif  str(data) == "Quit":
                    print("shutting down server ")
                    break

                else:
                    pass


if __name__ == '__main__':
    while 1:
        my_server()

Client.py 代码:

import socket
import threading
import time


HOST = '192.168.1.65'  # The server's hostname or IP address
PORT = 65432       # The port used by the server


def process_data_from_server(x):
    x1, y1 = x.split(",")
    return x1,y1

def my_client():
    threading.Timer(11, my_client).start()

    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((HOST, PORT))

        my = input("Enter command ")

        my_inp = my.encode('utf-8')

        s.sendall(my_inp)

        data = s.recv(1024).decode('utf-8')

        x_temperature,y_humidity = process_data_from_server(data)

        print("Temperature {}".format(x_temperature))
        print("Humidity {}".format(y_humidity))

        s.close()
        time.sleep(5)


if __name__ == "__main__":
    while 1:
        my_client()

【问题讨论】:

  • 如果不是“DATA”,请尝试打印您得到的内容,无论如何。可能有助于调试。
  • 我尝试了其他输入,它显示错误 s.bind((HOST, PORT)) OSError: [Errno 98] Address already in use

标签: python loops python-sockets


【解决方案1】:
    address already used

你需要使用socket.setsockopt 来设置socket.SO_REUSEADDR 我认为client 和server.py 都有

 def my_server():
    
        # with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        print("Server Started waiting for client to connect ")
        s.bind((HOST, PORT))
        s.listen(5)
        conn, addr = s.accept()
    
        with conn:
            print('Connected by', addr)
            while True:
    
                data = conn.recv(1024).decode('utf-8')
                if str(data) == "Data":
                    ...
                    

【讨论】:

    猜你喜欢
    • 2012-06-27
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    相关资源
    最近更新 更多