如何在TCP服务器上使用套接字在python中进行冒泡排序

时间:2017-03-23 11:41:43

标签: python sockets tcp

这是我的服务器端 - 需要是TCP,所以我需要接受并听取,我不能使用UDP。

import socket
import sys
from threading import Thread


class ThreadWorker(Thread):
    def __init__(self, sock2):
        Thread.__init__(self)
        self._socket = sock2
        self._run = True

    def bubble(self, x):
        length = len(x)
        for i in range(0, length):
            swapped = False
            for element in range(0, length - i - 1):
                if x[element] > x[element + 1]:
                    hold = x[element + 1]
                    x[element + 1] = x[element]
                    x[element] = hold
                    swapped = True
            if not swapped:
                break

    def run(self):
        while self._run:
            data_num = self._socket.recv(1024)
            number = data_num.split(" ")
            sort_num = []

            for num in number:
                sort_num.append(num)

            self.bubble(sort_num)

            for num in sort_num:
                print "Sorted numbers: ", num

            sys.stdout.flush()
            self._socket.close()


sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("127.0.0.1", 4242))
sock.listen(10)

while True:
    canal, address = sock.accept()
    print 'Connection from: ', address
    data = canal.recv(1024)
    print 'Received from the client: ', data, address
    canal.send("Goodbye")
    worker = ThreadWorker(canal)
    worker.setDaemon(True)
    worker.start()
    canal.close()

在服务器中使用线程。 我试图让泡泡排序运行,但我收到很多错误,我不知道我的TCP连接是否正确 - 错误是在数据接收方,而不是alg。 在客户端,没有更多的连接:

message = raw_input("Insert message: ")
sock.connect(('localhost', 4242))
sock.send(message)
data = sock.recv(1024)
print "I received back from the server: ", data
sock.close()

我错过了什么或做错了什么? 如果我在我的变量上使用split或str我得到:AttributeError:' str'对象没有属性' str。 任何人都可以以任何方式帮助吗?

1 个答案:

答案 0 :(得分:0)

看看你的排序:

客户端连接,发送数据,等待接收。

服务器接受连接,接收数据,发送再见。

客户端收到Goodbye并关闭套接字。

服务器同时创建Thread,启动它并关闭套接字。当线程运行时,两侧都有闭合插座。

要解决的问题:

  • 不要关闭服务器主线程中的客户端套接字,在为客户端创建的线程中关闭它。
  • 不要在服务器主线程中重新发送并再见。
  • 在处理线程中的数据后,实际发回数据并关闭客户端。
  • 不要关闭客户端中的套接字,直到您没有收到任何内容,表明服务器已关闭套接字。
  • TCP是面向字节的协议。您不一定要发送完整的消息或重新发送消息。在您知道消息完成之前,您需要协议和recv。还可以使用sendall来确保发送整个邮件。