【问题标题】:sockets wont send data over LAN套接字不会通过 LAN 发送数据
【发布时间】:2021-04-18 12:20:38
【问题描述】:

我正在尝试编写一个脚本,当按下 WASD 按钮时,它会使用套接字通过 LAN 网络将其发送到服务器 这是客户:

import socket
from pynput.keyboard import Listener

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

import keyboard 




def On_pressA():
    print("dda")
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
       s.connect((HOST, PORT))
       s.sendall(b'LEFT')
       data = s.recv(1024)
       print('Received', repr(data))

def On_pressW():
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
      s.connect((HOST, PORT))
      s.sendall(b'FORWARD')
      data = s.recv(1024)
      print('Received', repr(data))

def On_pressS():
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
       s.connect((HOST, PORT))
       s.sendall(b'BACKWARDS')
       data = s.recv(1024)
       print('Received', repr(data))

def On_pressD():
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((HOST, PORT))
        s.sendall(b'RIGHT')
        data = s.recv(1024)
        print('Received', repr(data))


with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    keyboard.add_hotkey('a', On_pressA) 
    keyboard.add_hotkey('d', On_pressD())
    keyboard.add_hotkey('s', On_pressS())
    keyboard.add_hotkey('w', On_pressW())
    
    s.sendall(b'LEFT')
    data = s.recv(1025)

当我按预期的方式按 A 时它打印的按键工作,但它不会将该数据发送到服务器 这是服务器:

    import socket

HOST = '127.0.0.1'
PORT = 65432
loop = 0
while loop < 5:
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind((HOST, PORT))
        s.listen()
        conn, addr = s.accept()
        with conn:
            print('Done', addr)
            while True:
                data = conn.recv(1024)
                print(data)
                if not data:
                    print("Nothing sent")
                conn.sendall

我可能做错了,因为我是 python 新手。我正在尝试用它来制作 wifi 遥控遥控车。

【问题讨论】:

  • 感谢您提供代码和对问题的详细解释。您似乎忘记将服务器中的data 发送回您的回显客户端。如果将服务器代码最后一行的 conn.sendall 更改为 conn.sendall(data) 会发生什么
  • 现在垃圾邮件'b'
  • 那是因为你的 while 循环永无止境:while loop &lt; 5:。您将需要增加您的 loop 计数器或删除循环。
  • 客户端在启动时崩溃并开始发送垃圾邮件 b'' 然后“没有发送任何内容”

标签: python sockets networking server keyboard


【解决方案1】:

问题来了:

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    keyboard.add_hotkey('a', On_pressA) 
    keyboard.add_hotkey('d', On_pressD())
    keyboard.add_hotkey('s', On_pressS())
    keyboard.add_hotkey('w', On_pressW())

应该是keyboard.add_hotkey('a', On_pressA()),而不是keyboard.add_hotkey('a', On_pressA)(注意语句末尾的())

最终的代码应该有点像:

import socket
from pynput.keyboard import Listener

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

import keyboard 




def On_pressA():
    print("dda")
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
       s.connect((HOST, PORT))
       s.sendall(b'LEFT')
       data = s.recv(1024)
       print('Received', repr(data))

def On_pressW():
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
      s.connect((HOST, PORT))
      s.sendall(b'FORWARD')
      data = s.recv(1024)
      print('Received', repr(data))

def On_pressS():
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
       s.connect((HOST, PORT))
       s.sendall(b'BACKWARDS')
       data = s.recv(1024)
       print('Received', repr(data))

def On_pressD():
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((HOST, PORT))
        s.sendall(b'RIGHT')
        data = s.recv(1024)
        print('Received', repr(data))


with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    keyboard.add_hotkey('a', On_pressA()) 
    keyboard.add_hotkey('d', On_pressD())
    keyboard.add_hotkey('s', On_pressS())
    keyboard.add_hotkey('w', On_pressW())
    
    s.sendall(b'LEFT')
    data = s.recv(1025)

【讨论】:

  • 修复了崩溃但当我按下键盘按钮时它没有注册
  • 可能是因为我在命令提示符下打开客户端
  • “它没有注册”到底是什么意思?
  • 它似乎也卡在 print("dda") 上,并在启动时立即显示
  • 我的意思是当我按下键盘按钮时它不打印 dda 并且只在我启动客户端时打印 dda 这意味着它卡在 on_pressA 上
猜你喜欢
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 2018-05-23
相关资源
最近更新 更多