如何将套接字消息转换为字符串消息

时间:2018-02-13 15:21:47

标签: python-3.x sockets

大家好我一个月前开始学习python,请原谅我任何愚蠢的错误。我最近制作了这个聊天服务器并且它可以找到,但是客户收到的消息,或者具有嗨,那里的形式,它们看起来像这样 b'嗨,那里\ r \ n \ n' ,就像二进制消息一样,也是因为\ n和\ r \ n不生效。我在这里发布我的代码,所以如果有人能帮助我,那就太棒了,谢谢。 如果有人想测试它,客户端通过telnet连接

import socket
import select
class ChatServer:
    def __init__( self, port ):
        self.port = port;
        self.srvsock = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
        self.srvsock.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 )
        self.srvsock.bind( ("", port) )
        self.srvsock.listen( 5 )
        self.descriptors = [self.srvsock]
        print ('ChatServer started on port %s' % port)
    def run( self ):
        while 1:
            # Await an event on a readable socket descriptor
            (sread, swrite, sexc) = select.select( self.descriptors, [], [] )
            # Iterate through the tagged read descriptors
            for sock in sread:
                # Received a connect to the server (listening) socket
                if sock == self.srvsock:
                    self.accept_new_connection()
                else:
                    # Received something on a client socket
                    str = sock.recv(100)
                    # Check to see if the peer socket closed
                    if str == b'exit\r\n':
                        host,port = sock.getpeername()
                        str = 'Client left %s:%s\r\n' % (host, port)
                        self.broadcast_string( str, sock )
                        sock.close
                        self.descriptors.remove(sock)
                    else:
                        host,port = sock.getpeername()
                        newstr = '[%s:%s] %s' % (host, port, str)
                        self.broadcast_string( newstr, sock )

    def broadcast_string( self, str, omit_sock ):
        sms=bytes(str,'utf-8')
        for sock in self.descriptors:
            if sock != self.srvsock and sock != omit_sock:
                sock.send(sms)
        print (str)


    def accept_new_connection( self ):
        newsock, (remhost, remport) = self.srvsock.accept()
        self.descriptors.append( newsock )
        newsock.send(b"You're connected to the Python chatserver, enter 'exit' to get out\r\n")
        str = 'Client joined %s:%s\r\n' % (remhost, remport)
        self.broadcast_string( str, newsock )

myServer = ChatServer( 2626 )
myServer.run()

1 个答案:

答案 0 :(得分:0)

我们假设变量str是你的二进制字符串。

您可以按照您指定的方式进行转换:

str = str.decode('utf-8').strip('\r\n')

如果这不起作用,请告诉我!