2017-05-19 168 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」

相關問題