2015-11-27 68 views
2

我正在嘗試在Python中編寫一個客戶端程序,它可以發送和接收來自同一個套接字,但它總是給我同樣的錯誤,哪個地址已被使用。這是我正在寫的功能。如何發送和接收來自Python中的相同套接字?

def Login(): 
    username=raw_input() 
    password=raw_input() 
    message=raw_input() 
    array=[username,password,message] 

    TCP_IP = '127.0.0.1' 
    TCP_PORT = 5563 
    BUFFER_SIZE = 1024 # Normally 1024, but we want fast response 
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sock.connect((TCP_IP, TCP_PORT)) 
    array_string=pickle.dumps(array) 
    sock.send(array_string) 
    sock.close() 

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sock.bind((TCP_IP, TCP_PORT)) 
    sock.listen(1) 

    conn, info = sock.accept() 
    while 1: 
     data = serverSocket.recv(1024) 
     if not data:break 
    conn.send(data) 
    conn.close() 

回答

0

這裏有一堆真正新手的錯誤。

  1. 您永遠無法將TCP套接字連接到自身。應該有兩個不同的插座。

  2. 如果你真的想要得到你監聽套接字較早發送的數據,這個監聽套接字應創建,約束,並配置爲監聽之前客戶端連接(或者,至少,在平行於這連接嘗試,在幾秒鐘內,所以連接嘗試會嘗試 - 但這很可能不會在本地主機上工作)。

  3. 如果兩者都阻塞,則無法在連接上等待接受相同的線程。最簡單的方法是將客戶端和服務器端分隔爲2個不同的程序並手動並行運行。然後,在成功調試後,您將能夠在同一進程的不同線程中執行此操作,或使用事件驅動的引擎。

+0

感謝您的幫助。是的,我是新來的。 –

0

雖然你可能無法將套接字連接到其自身發送和接收數據,你也許可以從下面的示例代碼的啓發,試圖做同樣的事情去學習。

import _thread 
import pickle 
import socket 
import time 


def main(): 
    """Run a server in a thread and start a client to talk to it.""" 
    _thread.start_new_thread(run_server, ('', 5563)) 
    run_client('localhost', 5563) 


def run_server(host, port): 
    """Handle all incoming connections by spawning worker threads.""" 
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    server.bind((host, port)) 
    server.listen(5) 
    while True: 
     _thread.start_new_thread(handle_connection, server.accept()) 


def handle_connection(client, address): 
    """Answer an incoming question from the connected client.""" 
    print('Incoming connection from', address) 
    client.settimeout(0.1) 
    data = recvall(client) 
    client.shutdown(socket.SHUT_RD) 
    question = pickle.loads(data) 
    answer = '''len(username) = {} 
len(password) = {} 
len(message) = {}'''.format(*map(len, question)) 
    client.sendall(answer.encode()) 
    client.shutdown(socket.SHUT_WR) 
    client.close() 
    print('Finished with', address) 


def recvall(connection): 
    """Receive all data from a socket and return as a bytes object.""" 
    buffer = bytearray() 
    while True: 
     try: 
      data = connection.recv(1 << 12) 
     except socket.timeout: 
      pass 
     else: 
      if data: 
       buffer.extend(data) 
      else: 
       return bytes(buffer) 


def run_client(host, port): 
    """Collect information from question and display returned answer.""" 
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    time.sleep(0.1) # wait for server to start listening for clients 
    client.connect((host, port)) 
    time.sleep(0.1) # wait for handler thread to display connection 
    username = input('Username: ') 
    password = input('Password: ') 
    message = input('Message: ') 
    question = pickle.dumps((username, password, message)) 
    client.sendall(question) 
    client.shutdown(socket.SHUT_WR) 
    answer = recvall(client) 
    client.shutdown(socket.SHUT_RD) 
    client.close() 
    print(answer.decode()) 
    time.sleep(0.1) # wait for handler to cleanly terminate execution 

if __name__ == '__main__': 
    main() 
相關問題