2017-07-24 109 views
1

嗨我的服務器 - 客戶端連接有問題 我在Windows 10上編寫了2個代碼,他們工作得很完美。但是,當我試圖在虛擬機上執行他們在Ubuntu我有這個錯誤:errno 111連接被ubuntu中的python拒絕vmware

Traceback (most recent call last): 
    File "client3.py", line 9, in <module> 
    sock.connect(('192.168.1.53', 1234)) 
    File "/usr/lib/python2.7/socket.py", line 228, in meth 
    return getattr(self._sock,name)(*args) 
socket.error: [Errno 111] Connection refused 

服務器代碼:

import threading 
import SocketServer 
import json 
import base64 

class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler): 

    def handle(self): 

     data = self.request.recv(327680) 
     data = json.loads(data) 
     cur_thread = threading.current_thread() 
     JL= data['Jliste'] 
     for i in range(0,9) : 
      cel = json.loads(JL[i]) 
      file_name = cel['name'] 
      img = base64.b64decode(cel['img']) 
      with open(file_name,'wb') as _file: 
       _file.write(img) 
      print "image {} Received ".format(i) 
     response = "images Received " 
     print response 
     self.request.sendall(response) 

class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): 
    pass 


if __name__ == "__main__": 



     server = ThreadedTCPServer(("localhost", 1234), ThreadedTCPRequestHandler) 


     # Start a thread with the server -- that thread will then start one 
     # more thread for each request 
     server_thread = threading.Thread(target=server.serve_forever) 
     # Exit the server thread when the main thread terminates 
     server_thread.daemon = True 
     server_thread.start() 
     print "Server loop running in thread:", server_thread.name 

客戶端代碼:

import socket 
import json 


sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sock.connect(('localhost', 1234)) 
try: 

    def generate_names(count): 
      return 'User.2.{}.jpg'.format(count) 
    L = [] 
    for i in range(0,9): 
      name = generate_names(i+1) 
      fp = open(name,'rb') 
      fp = fp.read() 
      fp = fp.encode('base64') 
      cel = {} 
      cel['name'] = name 
      cel['img'] = fp 
      jcel = json.dumps(cel) 
      L.append(jcel) 
    data = {} 
    data['Jliste'] = L 
    s = json.dumps(data) 
    sock.send(s) 
    response = sock.recv(1024) 
    print "Received: {}".format(response) 
finally: 
    sock.close() 

新的錯誤我得到是:

Exception happened during processing of request from ('127.0.0.1', 60900) 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/SocketServer.py", line 596, in process_request_thread 
    self.finish_request(request, client_address) 
    File "/usr/lib/python2.7/SocketServer.py", line 331, in finish_request 
    self.RequestHandlerClass(request, client_address, self) 
    File "/usr/lib/python2.7/SocketServer.py", line 652, in __init__ 
    self.handle() 
    File "server.py", line 12, in handle 
    data = json.loads(data) 
    File "/usr/lib/python2.7/json/__init__.py", line 339, in loads 
    return _default_decoder.decode(s) 
    File "/usr/lib/python2.7/json/decoder.py", line 364, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/usr/lib/python2.7/json/decoder.py", line 380, in raw_decode 
    obj, end = self.scan_once(s, idx) 
ValueError: Unterminated string starting at: line 1 column 16913 (char 16912) 

回答

2

不知道爲什麼這適用於Windows,但是當我在Ubuntu上運行代碼時,服務器剛剛退出 - 就像它應該這樣。它打印「服務器循環運行...」,然後退出。當你的線程設置爲server_thread.daemon=True時,線程也會被終止。它甚至沒有時間來初始化套接字。

如果你改變server_thread.daemon=False或者添加sleep(600)或者類似的東西(你當然是一個無限循環)作爲main()中的最後一個語句,它會開始監聽套接字和處理請求 - 這可能是你想要的。

+0

謝謝你的回答,它解決了連接問題 – chiheb

+0

那麼你能否接受答案,以防萬一別人有類似的問題。 – Hannu

+0

該錯誤與json解碼有關。你的json解碼器試圖解碼json數據,但無論它試圖解碼的是不是json格式。您可以捕獲異常,如果發生此錯誤,則打印「數據」,然後從打印輸出中檢查json語法出了什麼問題。 – Hannu

相關問題