2013-05-14 91 views
0

我讀過throught此介紹給蟒蛇插座: http://docs.python.org/3.3/howto/sockets.html蟒蛇插座:winerror 10056

這是我的服務器

import socket 
serversocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
serversocket.bind(("localhost",8000)) 
serversocket.listen(5) 
while True: 
    (client,addr)=serversocket.accept() 
    data=serversocket.recv(1024) 
    print(data.decode("utf-8")) 

,這是客戶端

import socket 
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect(("localhost",8000)) 

的想法是服務器只是打印從客戶端發送的所有數據。正如你所看到的,我打算用utf-8將消息字符串編碼爲字節。但我從來沒有走過那麼遠。

隨着服務器腳本的運行,我將客戶端線路逐個輸入到IDLE python shell中。第三行後,此錯誤提示。由於我是德國人,這是一個模糊的翻譯。如果您可以重現錯誤,錯誤消息可能聽起來不同

Traceback (most recent call last): File "", line 1, in s.connect(("localhost",8000)) OSError: [WinError 10056] A connection attempt targeted an already connected socket.

如何解決此錯誤?服務器稍有改動,但客戶端是教程中的確切代碼。並且錯誤seens相當奇怪,畢竟我希望套接字已經連接 - 與服務器。起初我以爲不知何故已經有連接到我的服務器的套接字,但重新啓動它,再次輸入客戶端代碼導致相同的結果。

+1

我發現重複的線路,可以在此重複行是你的問題:ServerSocket的= socket.socket(socket.AF_INET,socket.SOCK_STREAM) – pylover

+0

感謝您的幫助。可悲的是,問題仍然存在 – lhk

+1

操作系統被稱爲不想關閉套接字,直到他們確信無論使用它們是否真的完成。把代碼放在那裏可以確保它們在雙方都能正常關閉。即使應用程序崩潰。 – cmd

回答

1

您希望在客戶端套接字上接收,並在客戶端關閉時關閉客戶端套接字。這將同時處理一個客戶端,但要注意它真正需要實現知道它有一個完整的消息解碼的消息協議:

import socket 
serversocket = socket.socket() 
serversocket.bind(('',8000)) 
serversocket.listen(5) 
while True: 
    client,addr = serversocket.accept() 
    while True: 
     data = client.recv(1024) 
     if not data: break 
     print(data.decode('utf8')) # Note this might not contain a complete UTF-8 character. 
    client.close() 
1

你不想在你調用listen()和accept()的套接字上調用recv()。改爲使用新連接的客戶端。