在ubuntu vmware

时间:2017-07-24 11:24:38

标签: python sockets ubuntu

您好我的服务器 - 客户端连接有问题 我在Windows 10上编写了2个代码,它们运行得很好。但是当我尝试在VM中的ubuntu上执行它们时,我遇到了这个错误:

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)

1 个答案:

答案 0 :(得分:2)

不确定为什么这可以在Windows上运行,但是当我在Ubuntu上运行你的代码时,你的服务器就会退出 - 就像它应该的那样。它打印&#34;服务器循环运行...&#34;然后退出。当您的线程设置为server_thread.daemon=True时,线程也会被杀死。它甚至没有时间初始化套接字。

如果您更改server_thread.daemon=False或添加sleep(600)或类似内容(当然是无限循环)作为main()中的最后一个语句,它会开始侦听套接字并处理请求 - 这可能是你想要的。