2017-05-19 257 views
0

我学习python 3,是我的第一语言,所以很抱歉,如果这是一个愚蠢的问题,但我不知道为什么它doesn没有工作... 我正在测试一个简单的回声客户端/服务器应用程序。根据我的书,我首先创建了一个名为tincanchat文件:NameError与回声客户端/服务器测试:客户端无法发送自定义消息到服务器

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) 

然后,我写的服务器:

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) 

而且客户端:

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') 

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

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 

问题在哪里? 在此先感谢:)

回答

0

如果你想捕捉指定的错误或例外,你应该先导入它们。 你可以为例如做的是:

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”

相关问题