首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用echo客户端/服务器测试的NameError :客户端无法向服务器发送自定义消息

使用echo客户端/服务器测试的NameError :客户端无法向服务器发送自定义消息
EN

Stack Overflow用户
提问于 2017-05-19 15:41:36
回答 1查看 55关注 0票数 0

我正在学习python3,这是我的第一语言,所以如果这是一个愚蠢的问题,很抱歉,但我不知道为什么它不能工作……我正在测试一个简单的echo客户机/服务器应用程序。根据我的书,我首先创建了一个名为tincanchat的文件:

代码语言:javascript
运行
复制
import socket

HOST = ''
PORT = 4040

def create_listen_socket(host, port):
    """ Setup the sockets our server will receive connection
    requests on """
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind((host, port))
    sock.listen(100)
    return sock

def recv_msg(sock):
    """ Wait for data to arrive on the socket, then parse into
    messages using b'\0' as message delimiter """
    data = bytearray()
    msg = ''
    # Repeatedly read 4096 bytes off the socket, storing the bytes
    # in data until we see a delimiter
    while not msg:
        recvd = sock.recv(4096)
        if not recvd:
            # Socket has been closed prematurely
            raise ConnectionError()
        data = data + recvd
        if b'\0' in recvd:
            # we know from our protocol rules that we only send
            # one message per connection, so b'\0' will always be
            # the last character
            msg = data.rstrip(b'\0')
    msg = msg.decode('utf-8')
    return msg

def prep_msg(msg):
    """ Prepare a string to be sent as a message """
    msg += '\0'
    return msg.encode('utf-8')

def send_msg(sock, msg):
    """ Send a string over a socket, preparing it first """
    data = prep_msg(msg)
    sock.sendall(data)

然后,我编写了服务器:

代码语言:javascript
运行
复制
import tincanchat

HOST = tincanchat.HOST
PORT = tincanchat.PORT

def handle_client(sock, addr):
    """ Receive data from the client via sock and echo it back """
    try:
        msg = tincanchat.recv_msg(sock) # Blocks until received
                                    # complete message
        print('{}: {}'.format(addr, msg))
        tincanchat.send_msg(sock, msg) # Blocks until sent
    except (ConnectionError, BrokenPipeError):
        print('Socket error')
    finally:
        print('Closed connection to {}'.format(addr))
        sock.close()

if __name__ == '__main__':
    listen_sock = tincanchat.create_listen_socket(HOST, PORT)
    addr = listen_sock.getsockname()
    print('Listening on {}'.format(addr))

    while True:
        client_sock, addr = listen_sock.accept()
        print('Connection from {}'.format(addr))
        handle_client(client_sock, addr)

和客户端:

代码语言:javascript
运行
复制
import sys, socket
import tincanchat

HOST = sys.argv[-1] if len(sys.argv) > 1 else '127.0.0.1'
PORT = tincanchat.PORT

if __name__ == '__main__':
    while True:
        try:
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.connect((HOST, PORT))
            print('\nConnected to {}:{}'.format(HOST, PORT))
            print("Type message, enter to send, 'q' to quit")
            msg = input()
            if msg == 'q': break
            tincanchat.send_msg(sock, msg) # Blocks until sent
            print('Sent message: {}'.format(msg))
            msg = tincanchat.recv_msg(sock) # Block until
                                        # received complete
                                        # message
            print('Received echo: ' + msg)
        except ConnectionError:
            print('Socket error')
            break
        finally:
            sock.close()
            print('Closed connection to server\n')

我先运行服务器,然后运行客户端,它与服务器连接并请求输入。此时,它返回以下错误:

代码语言:javascript
运行
复制
Connected to 127.0.0.1:4040
Type message, enter to send, 'q' to quit
Hello
Closed connection to server

Traceback (most recent call last):
  File "C:\xxxxxxxxx\1.2-echo_client-uni.py", line 22, in         <module>
    except ConnectionError:
NameError: name 'ConnectionError' is not defined

问题出在哪里?提前感谢:)

EN

Stack Overflow用户

发布于 2017-05-19 16:06:51

如果你想捕获指定的错误或异常,你应该首先导入它们。例如,您可以执行以下操作:

代码语言:javascript
运行
复制
from requests.exceptions import ConnectionError
try:
    r = requests.get("http://example.com", timeout=0.001)
except ConnectionError as e:    # This is the correct syntax
    print e
    r = "No response"

在这种情况下,您的程序将不会返回'NameError‘

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44064232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档