2013-02-09 47 views
0

我試圖使用an example作爲服務器,但客戶端只能發送一條消息,然後服務器會回覆一個數字。有幾個答案的一般Python套接字問題

這是代碼。

import socket 
mySocket = socket.socket (socket.AF_INET, socket.SOCK_STREAM) 
mySocket.bind (('', 2000)) 
mySocket.listen (1) 
while True: 
    channel, details = mySocket.accept() 
    print 'We have opened a connection with', details 
    print channel.recv (100) 
    channel.send ('Green-eyed monster.') 
    channel.close() 

問題:

  1. 爲什麼,每當客戶端發送消息到服務器,它與一些迴應?

  2. 如何通過互聯網使用套接字,而不是通過局域網?

  3. 有沒有辦法讓我的服務器使用套接字將數據從客戶端移動到客戶端 - 有點像IM程序。

  4. 我將最有可能的主機爲我在我的Mac的朋友該即時通訊服務器 - 將它的操作系統的鍵(Mac,PC)之間的工作

  5. 是否有使用這個任何好的庫? (我聽說HTTP很好)

  6. 這些代碼行是真的混淆。他們如何工作?

    print channel.recv (100) 
    channel.send ('Green-eyed monster.') 
    
  7. 此外,當我關閉服務器(用紅色的X),並重新使用的端口,就這樣說:

    Traceback (most recent call last): 
    File "C:\Users\****\Desktop\Python\Sockets\First Server\server.py", 
    line 3, in <module> 
    mySocket.bind (('', 2003)) 
    File "C:\Python27\lib\socket.py", line 224, in meth 
    return getattr(self._sock,name)(*args) 
    error: [Errno 10048] Only one usage of each socket address 
    (protocol/network address/port) is normally permitted 
    
  8. 最後,在那裏有一些很好的教程,我聽不懂這個更好?

對不起,問在同一職位這麼多的問題,但是當我發佈thisthis人生氣了,跟我要張貼有關在不同的問題類似的問題。

Python版本:Python的2.7.3

回答

0

我做了一些研究(超過幾個小時),並發現了一些解決方案,我的問題!

3:是的,有一種方法可以讓客戶互相溝通,他們只需要使用服務器!您必須在服務器端初始化一個無限循環,它將接收數據併發送它。這是我如何解決這個問題:

while True: 
     #Receiving from client 
     data = conn.recv(1024) 
     if not data: 
      break 
     conn.sendall(data) 
     print data 
     #To come out of the loop 
    conn.close() 

該方案是一個叫clientthread它初始化與客戶的所有連接定義的一部分。 「實際的」循環進行線程的休息:

 while True: 
     #Wait to accept a connection - blocking call 
     conn, addr = s.accept() 
     #display client information (IP address) 
     print 'Connected with ' + addr[0] + ':' + str(addr[1]) 

     #Start new thread takees 1st argument as a function name to be run, second 
     #is the tuple of arguments to the function 

     start_new_thread(clientthread ,(conn,)) 

4:是,它將操作系統的之間的工作。套接字是獨立的的平臺。

6:這段代碼其實很簡單。行print channel.recv (100)通知服務器打印用戶輸入,最多100個字符。下一行channel.send ('Green-eyed monster.')只是告訴服務器向客戶端發送消息Green-eyed monster

7:發生此錯誤是因爲每個端口不能打開多個套接字。我建議在代碼末尾使用諸如s.close()sys.exit()的行來關閉端口。或者你可以簡單地選擇另一個!

8:在互聯網上有一些很棒的教程。一個教你插座的基礎是this。 Telnet對我來說真的很混亂,所以我發現,與this客戶端一起,可以創建一個定製的客戶端,這實際上更好。

如果您有任何問題,請隨時發表評論,我會盡力回答。