【问题标题】:Python sockets connecting but no data transferPython套接字连接但没有数据传输
【发布时间】:2018-01-06 23:33:56
【问题描述】:

刚开始学习python socket编程。我正在尝试使用 python 套接字从 Raspberry Pi 3 发送和接收数据。我在 Raspberry Pi 上运行服务器程序,在运行 Ubuntu 的笔记本电脑上运行客户端程序。两者都在同一个WiFi网络上。程序运行,客户端连接到服务器,但没有数据传输。客户端和服务器都不做任何事情。如果我尝试在同一设备上同时运行这两个程序,它们将正常运行。这是我的代码:-

客户

import socket

HOST = '172.16.31.51'
PORT = 5000
BUFSIZ = 1024

if __name__ == '__main__':
    client_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    host = input("Enter hostname [%s]: " %HOST) or HOST
    port = input("Enter port [%s]: " %PORT) or PORT

    sock_addr = (host, int(port))
    client_sock.connect(sock_addr)

    payload = 'GET TIME'

    try:
        while True:
            client_sock.send(payload.encode('utf-8'))
            data = client_sock.recv(BUFSIZ)
            print(repr(data))
            more = input("Want to send more data to server[y/n]:")
            if more.lower() == 'y':
                payload = input("Enter payload: ")
            else:
                break
    except KeyboardInterrupt:
        print("Exited by user")
    client_sock.close()

服务器

import socket
from time import ctime

PORT = 5000
BUFSIZ = 1024
ADDR = ('', PORT)

if __name__ == '__main__':
    server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    server_socket.bind(ADDR)
    server_socket.listen(5)
    server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR, 1)

    while True:
        print('Server waiting for connection...')
        client_sock, addr = server_socket.accept()
        print('Client connected from: ', addr)

        while True:
            data = client_sock.recv(BUFSIZ)
            if not data or data.decode('utf-8') == 'END':
                break
            print("Received from client: %s" % data.decode('utf-8'))
            print("Sending the server time to client: %s" %ctime())
            try:
                client_sock.send(bytes(ctime(), 'utf-8'))
            except KeyboardInterrupt:
                print("Exited by user")
        client_sock.close()
    server_socket.close()

编辑:

截图 - https://imgur.com/a/NgzsC

当我在客户端按下 Ctrl + C 时,服务器似乎在与客户端断开连接之前发送了一些数据。这是它的截图 - https://imgur.com/a/hoLwN

【问题讨论】:

  • 你两端的输出是什么?到目前为止,您诊断出什么?
  • 这是两个设备上的输出屏幕 - imgur.com/a/NgzsC
  • 当我在客户端(我的笔记本电脑)上单击 Ctrl + C 时,服务器似乎发送了一些数据,然后出现“由对等方重置连接”。我不知道为什么它只在我按 Ctrl + C 时才发送数据。这是它的屏幕截图 - imgur.com/a/hoLwN

标签: python sockets raspberry-pi


【解决方案1】:

您的套接字工作正常,但您犯了一些其他编程错误。你有没有运行过它? 这是修改后的工作代码。 (提示:当您使用nc -l 5000 作为简单的手动服务器时,您可以开始只测试客户端。

客户

import socket

HOST = '127.0.0.1'
PORT = 5000
BUFSIZ = 1024

if __name__ == '__main__':
    client_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    host = str(raw_input("Enter hostname [%s]: " %HOST)) or HOST
    port = str(raw_input("Enter port [%s]: " %PORT)) or PORT

    sock_addr = (host, int(port))
    client_sock.connect(sock_addr)

    payload = 'GET TIME'

    try:
        while True:
            client_sock.send(payload.encode('utf-8'))
            data = client_sock.recv(BUFSIZ)
            print(repr(data))
            more = raw_input("Want to send more data to server[y/n]:")
            if more.lower() == 'y':
                payload = str(raw_input("Enter payload: "))
            else:
                break
    except KeyboardInterrupt:
        print("Exited by user")
    client_sock.close()

服务器

import socket
from time import ctime

PORT = 5004
BUFSIZ = 1024
ADDR = ('', PORT)

if __name__ == '__main__':
    server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    server_socket.bind(ADDR)
    server_socket.listen(5)
    server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR, 1)

    while True:
        print('Server waiting for connection...')
        client_sock, addr = server_socket.accept()
        print('Client connected from: ', addr)

        while True:
            data = client_sock.recv(BUFSIZ)
            if not data or data.decode('utf-8') == 'END':
                break
            print("Received from client: %s" % data.decode('utf-8'))
            print("Sending the server time to client: %s" %ctime())
            try:
                client_sock.send( ctime().encode('utf-8') )
            except KeyboardInterrupt:
                print("Exited by user")
                break;
        client_sock.close()
    server_socket.close()

【讨论】:

  • 我在发布之前确实运行了我的代码。它在本地运行良好,但当我在两个不同的设备上运行它时似乎无法正常工作(这就是为什么我在客户端程序中有不同的主机 IP)。无论如何,我运行了您发布的代码。同样的问题。在本地运行良好。当服务器在不同的设备上时客户端连接,但此后不执行任何操作。
  • 好的,我明白了。当连接到另一台机器时,网络连接的工作方式可能会有所不同。这可能是“TCP 刷新”问题。尝试 setsockopt TCP_NODELAY 或使用 UDP 而不是 TCP。更多信息:stackoverflow.com/questions/855544/…stackoverflow.com/questions/4407835/python-socket-flush
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 2011-06-29
  • 1970-01-01
  • 2017-09-28
  • 2017-08-15
  • 1970-01-01
  • 2011-10-13
相关资源
最近更新 更多