Python套接字连接但没有数据传输

时间:2018-01-06 07:24:08

标签: python sockets raspberry-pi

刚开始学习python socket编程。我正在尝试使用python套接字从Raspberry Pi 3发送和接收数据。我在运行Ubuntu的笔记本电脑上运行Raspberry Pi上的服务器程序和客户端程序。两者都在同一个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

1 个答案:

答案 0 :(得分:0)

你的套接字工作正常,但你犯了一些其他的编程错误。你有没有跑过它? 这是修改后的工作代码。 (提示:当您使用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()