socket编程客户端冻结python

时间:2017-06-29 21:41:11

标签: python multithreading sockets

基本上,我有一个python客户端发送命令要求服务器做些事情,我已经实现了线程,但似乎无法正常工作。例如,当我向服务器发送“start”命令时,它将执行job_function,但在此期间,客户端正在冻结。所以基本上,我希望我的服务器仍然能够在执行任务时响应客户端的请求,这就是我使用线程的原因。

Server.py:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 5005))  # Bind to the port
s.listen(1)  # Now wait for client connection.
c, addr = s.accept()  # Establish connection with client.

while True:
    print('Got connection from', addr)
    data = c.recv(1024).decode()
    print(data)
    if data == "start":
        print("start the service")
        c.sendall('started service'.encode())

        threading.Thread(target=job_function).start()

    elif data == "suspend":
        print("suspend service")
        c.sendall('suspended service'.encode())
    else:
        c.sendall('wrong command'.encode())

c.close()  # Close the connection

Client.py:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1',5005))

while True:
   x = input("Enter command: ")
   s.sendall(x.encode())
   print(x)
   data = s.recv(1024).decode()
   print(data)
s.close()

1 个答案:

答案 0 :(得分:0)

也可以仅使用 recv() 函数来完成。

客户端:

                    sssize = os.stat('fileName').st_size
                    file = open('fileName', 'rb')
                    amm = file.read(sssize)

                    dfd = amm
                    #########
                    c.send(bytes(str(sssize), 'utf-8'))
                    rrespo = c.recv(1024).decode()

                    ######
                    if rrespo == 'yess':
                        m = 0
                        lenmsg = 1024
                        loop = (int((sssize) / lenmsg))


                        if (sssize)<lenmsg:
                            c.send(dfd[0:sssize])
                        else:
                            dddf='oksend'

                            for ioo in range(0, loop):
                                if dddf=='oksend':
                                    c.send(dfd[ioo * lenmsg:ioo * lenmsg + lenmsg])
                                    stloop = ioo * lenmsg + lenmsg
                                    print(int(m / (loop - 1) * 100))
                                    m = m + 1
                                    dddf = c.recv(6).decode()
                                    print(dddf, ioo)



                            nextloop = sssize - loop * lenmsg
                            if nextloop > 0:
                                c.send(dfd[stloop:stloop + nextloop])




                        file.close()
                        print('file transffered successfully')

服务器端:

                        filename = input(str("Enter file name :")
                        fill = open(filename, 'wb')
                        c.send(bytes(commm, 'utf-8'))
                        # sizze=c.recv(1024).decode()
                        # print('size')
                        # print(sizze)
                        # c.send(bytes('done', 'utf-8'))
                        fileSize = c.recv(1024).decode()
                        c.send(bytes('yess', 'utf-8'))
                        lenmsg=1024

                        loop = int(int(fileSize) / lenmsg)

                        if (int(fileSize))<lenmsg:
                            image = c.recv(int(fileSize))
                            fill.write(image)
                        else:
                            for i in range(0, loop):
                                image = c.recv(lenmsg)

                                fill.write(image)
                                print('completed downloading:', int((i / (loop - 1) * 100)), '%')
                                c.send(bytes('oksend', 'utf-8'))

                            nextloop = int(fileSize) - loop * lenmsg
                            if nextloop > 0:
                                image = c.recv(nextloop)
                                fill.write(image)
                        fill.close()
                        print('file downloaded successfully')