2010-05-26 188 views
2

我在將數據從套接字的一端發送到另一端時遇到問題。發生什麼事情是服務器和客戶端都試圖讀取文件,以免文件被髮送。我想知道如何讓客戶端阻塞,直到服務器完成讀取客戶端發送的文件。通過套接字發送文件

我用send和recv原始數據包這方面的工作,但想通這是一個清晰的解決方案......

客戶:

  1. 連接到服務器建立socket連接
  2. 創建一個文件在套接字上併發送數據
  3. 等待文件從服務器

服務器:

  1. 等待文件從客戶

完成interraction:

  1. 客戶端將數據發送到服務器
  2. 服務器將數據發送到客戶端

編輯

的代碼實際上,我在看被張貼在這個問題,但我認爲Eventlet東西嚇到人... https://stackoverflow.com/questions/2909358/eventlet-client-server

底下它只是使用Python插槽,所以我想我倒是簡化的問題,並要求有關剛好芯插座的問題...

+0

郵一些代碼請? – 2010-05-26 16:50:24

回答

1

我不知道這個問題是清楚的,你問:

  1. 如何SE通過套接字查找整個文件的數據?
  2. 如何讓寫入者在寫入一些數據後阻塞?
  3. 其他的東西?

如果問題是#1,則需要打開文件並將其解析爲一個字節流,然後在單個「寫入」調用中傳遞整個字節集合。

如果問題是#2,這意味着你想要的作家在移動之前等待讀者完全讀取字節(和處理他們?),那麼你需要的讀寫器進行協調。您可以通過在寫入之後讓作者調用「讀取」(讀取是阻止調用)來完成此操作。然後,在閱讀器完成讀取(並處理字節)後,它會向作者寫入一些信息以喚醒它。

如果問題是#3,也許你可以提供一些更多的細節。

+0

第二個選項。出於某種原因,你所描述的是我正在做的事情,它不起作用。閱讀的協調是我想弄清楚的。 – johannix 2010-05-26 17:49:32

3

這聽起來像你的客戶端發送的文件,然後等待服務器的響應,但如果你不給服務器上的指示,它已經完全讀取文件,的recv()服務器端將掛起等待更多數據。一旦客戶端完成發送,您可以在客戶端調用shutdown(SHUT_WR)。這會通知服務器,一旦它讀取了所有發送的數據,就再也沒有數據了。

一個非常基本的例子(發送一個數據blob到服務器,並且響應接收到一個數據blob):

服務器

>>> from socket import * 
>>> s=socket() 
>>> s.bind(('',8000)) 
>>> s.listen(1) 
>>> c,a = s.accept() # will hang here until a client connects 
>>> recvd='' 
>>> while True: 
... data = c.recv(1024) 
... if not data: break # recv() will return '' only if the client calls shutdown(SHUT_WR) or close() 
... recvd += data 
... 
>>> recvd 
'a message' 
>>> c.sendall('a response') 
>>> c.close() # done with client, could loop back to accept here 
>>> s.close() # done with server 

客戶

>>> from socket import * 
>>> s=socket() 
>>> s.connect(('localhost',8000)) 
>>> s.sendall('a message') 
>>> s.shutdown(SHUT_WR) # tells server you're done sending, so recv won't wait for more 
>>> recvd='' 
>>> while True: 
... data = s.recv(1024) 
... if not data: break 
... recvd += data 
... 
>>> recvd 
'a response' 
>>> s.close()