Класс сокетов в питоне 3 - PullRequest
0 голосов
/ 03 июня 2011

Я создал класс в Python 3, и я не могу понять, почему я не могу отправить информацию для сервера клиенту. Сервер и клиент используют один и тот же класс.

class mysocket:
    receive_string_buffer_len = 0
    active_instance = 0

    def __init__(self):
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.receive_string_buffer = ''
        self.send_string_buffer = ''
        self.host = 'localhost'
        self.port = 30000 + self.active_instance    
        self.active_instance += 1

    def connect(self):
        self.sock.connect((self.host,self.port))

    def mysend(self):
        try:
            sent = self.sock.send(self.send_string_buffer)
        except socket.error:
            print('socket connection broken')

    def myreceive(self):
        try:
            self.receive_string_buffer = self.sock.recv(512)
        except socket.error:
            print('socket connection broken')
        finally: return self.receive_string_buffer

Код клиента:

Client_socket1 = mysocket()
Client_socket1.connect()
print(Client_socket1.myreceive().decode('ascii'))

Код сервера:

Server_socket1 = mysocket()
Server_socket1.bind(('', 30000))
Server_socket1.listen(1)
client1, add = Server_socket1.accept()
Server_socket1.send_string_buffer = ' alo '
Server_socket1.mysend().encode('ascii')

Проблема в том, что он не работает. Я новичок в программировании на Python и плохо знаком с сокетами, так что, если я сделал глупые ошибки, пожалуйста, сообщите мне.

Спасибо всем, кто прочтет это.

Ответы [ 2 ]

1 голос
/ 18 апреля 2015

Я не думаю, что "Server_socket1.mysend (). Encode ('ascii')" допустим, тем более что mysend () не возвращает ничего для кодирования (и вы ничего не делаете с возвращаемым значением encode ()).Также вам необходимо закодировать ваши данные перед отправкой.

Я думаю, что вы найдете модуль асинхата намного проще в обработке сокетов.Просто подкласс это как:

import threading

class mysocket(asynchat.async_chat):
    terminator = b'\n'
    def __init__(self,sock=None):
        asynchat.async_chat.__init__(self,sock)
        self.create_socket()
        self.connect(('127.0.0.1',6667))

    def handle_connect(self):
        pass
    def handle_close(self):
        pass
    def collect_incoming_data(self, data):
        pass    
    def found_terminator(self):
        pass
    def sockwrite(self,text=None):
        # Avoid conflict with text=''
        if (text == None):
            text = ''
        text += '\n'
        self.sendall(bytes(text,'latin-1'))

chatsock = {}
def main():
    chatsock['a'] = mysocket()
    socketloop = threading.Thread(target=asyncore.loop, daemon=1)
    socketloop.start()
    while True: 
        pass
if __name__ == "__main__":
    main()
1 голос
/ 03 июня 2011

Вы отправляете данные через прослушивающий сокет вместо клиент-серверного сокета, возвращаемого методом accept ().

Rgds, Martin

...