2011-06-03 44 views
0

我在python 3中創建了一個類,我無法確定爲什麼我無法將服務器的信息發送給客戶端。服務器和客戶端使用相同的類。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代碼:

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編程和新的套接字,所以如果我做了愚蠢的錯誤,請告訴我。

感謝任何會閱讀此內容的人。

回答

1

您正在監聽套接字上發送數據,而不是由accept()返回的客戶端服務器套接字。

RGDS, 馬丁

1

我不認爲「Server_socket1.mysend()編碼(‘ASCII’)」是有效的尤其是mysend()不返回任何編碼(不管你做什麼,返回來自encode()的值)。您還需要在數據可以發送之前對其進行編碼。

我想你會發現asynchat模塊更容易處理套接字。只是子類吧:

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()