2013-06-23 29 views
0

試圖創建我的第一個客戶機 - 服務器應用程序時遇到了錯誤... 此代碼與文檔中的完全相同,但我遇到了問題。Windows 7上的套接字無法連接

服務器:

import socket 

HOST = 'localhost' 
PORT = 9090 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((HOST, PORT)) 
s.listen(1) 
conn, addr = s.accept() 
print 'Connected by', addr 
while True: 
    data = conn.recv(1024) 
    if not data: break 

print data 
conn.close() 

客戶:

import socket 

HOST = 'localhost' 
PORT = 9090 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((HOST, PORT)) 
s.sendall('Hello, world') 
s.close() 

執行後,我看不出在服務器部分的消息print Connected by, addrprint data。我使用Windows 7,Comodo防火牆(我試圖關閉防火牆,但它沒有解決問題),Avast Antivirus,Python 2.7。

非常有趣的是,所有的工作正常,並在一瞬間不起作用。

此外,我的服務器應用程序只是凍結,直到客戶端連接到服務器。它可以解決只是使用線程?

對不起,我的英文不好。提前致謝。

+0

嗨!很高興您開始使用套接字工作!但是,如果您對套接字和線程不太熟悉,那麼對您的代碼進行評論就太多了。我可以建議你看看:twisted http://twistedmatrix.com/trac/。一個事件驅動的框架,它會爲你打擾線程!它非常易於使用! – enpenax

+0

wimps框架=)其實,套接字看起來不太複雜 – progerz

回答

0

+1給Cfreak。基本上,數據發生的是它被分配了一個空字符串,導致循環中斷。因此,在循環中放置print語句可以解決問題。假設你需要在循環之後訪問數據終止嘗試像

data = [] 
while True: 
    datum = conn.recv(1024) 
    data.append(datum) 
    if not datum: break 

print " ".join(data) 

這裏是我運行的代碼,我的電腦,和它的作品

客戶

import socket 
HOST = 'localhost' 
PORT = 9090 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((HOST, PORT)) 
s.sendall('Hello, world') 
s.close() 

服務器

import socket 

HOST = 'localhost' 
PORT = 9090 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((HOST, PORT)) 
s.listen(1) 
conn, addr = s.accept() 
print 'Connected by', addr 
data = [] 
while True: 
    datum = conn.recv(1024) 
    data.append(datum) 
    if not datum: break 

print " ".join(data) 

conn.close() 

所以我不認爲這是你的代碼的問題...如果你有一臺機器沒有一個防火牆/防病毒軟件會嘗試該機器上的程序。

+0

** johnthexiii **,我試過你的版本,同樣的問題。其實,問題,也許,在這裏「** conn,addr = s.accept()**」因爲字符串「打印」**連接',addr **「我不會看到,並且此代碼在循環之前 – progerz

+0

@progerz事實上,你沒有看到連接打印語句讓我覺得這是你的電腦有問題。 – John

+0

我也認爲,這是計算機的問題...非常奇怪的問題...在早上(12小時前)所有工作正常 – progerz

1

你需要accept()print在循環中。 (或使用兩個循環)。我對Python中的套接字編程不是很熟悉,但我猜它看起來像這樣。 (完全未經測試!)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((HOST, PORT)) 
s.listen(1) 

while True: 
    conn, addr = s.accept() 
    print 'Connected by', addr 

    while True: 
     data = conn.recv(1024) 
     if not data: 
      break 

     print data 
    conn.close() 
+0

感謝您編輯我的文章! – progerz

相關問題