2012-12-14 41 views
0

我是新來的Python,我需要用套接字來做一個程序。 我的服務器需要使用套接字將數據發送到客戶端。它簡單地給出了文件名稱 和他的大小。Python套接字和分割函數

所以,我在下面的格式發送數據,使用TCP服務器類:

for fname, size in db.getfiles(): 
    temp = fname + " " + size + " " 
    buffer = buffer + temp 

self.request.send(buffer) 

所以我有一個很長的字符串發送。

我收到的客戶端,我想用:

List = data.split(" ") 

但我想用列表就像一個平行排列在那裏我可以打印的名稱,並在一個循環中的文件,我想:

for name, f_size in List: 
     print name, f_name 

我該怎麼做?如果我不能在同一份清單中做到這一點,我如何再次分割清單以便我可以用這種方式打印?

如果不能這樣做,我該如何跳轉列表中的每兩個索引,以便我可以同時打印兩個東西?

例如:

for i in List: 
    print i, i + 1 
    #jump now to index 2 

謝謝!

回答

0

您應該在通過網絡發送時將您的列表serialize,並在另一端反序列化它。如此,像這樣在發送側:

import pickle 

list = db.getfiles() 
self.request.send(pickle.dumps(list)) 

而且在接收側:

import pickle 
List = pickle.loads(data) 

序列化將您的數據結構轉換爲適合於傳輸或存儲的格式,並且反序列化變換的編碼數據回到原始數據結構。這樣做,你首先發送一個元組列表(假設這是你從db.getfiles()得到的),並且你最終得到接收者的元組列表。

pickle模塊不是唯一可用於序列化的機制。其他常見的序列化格式包括JSON(通過json模塊),YAML和XML。

+0

:文件,即都在數據庫中保存的文件和SIZE,即數據庫中每個文件的大小。你知道我想要的方式嗎?只是我完全明白你對序列化的看法......:/ – Edwardo

+0

是的,你不明白這個答案。花些時間閱讀我鏈接到的[Wikipedia article](https://en.wikipedia.org/wiki/Serialization)。這實際上就是你想要做的,而不是用分隔符和其他東西來分析,因爲它是一種通用技術,可以用於各種各樣的情況,其數據結構比你當前使用的更復雜。 – larsks

0

當前消息格式的問題在於,您在兩個數據值(fnamesize)之間以及單獨的數據項(即不同文件的名稱和大小)之間使用相同的分隔符。雖然有可能成對獲取這些值,但它需要比我認爲必要的更多努力。相反,我建議使用兩個不同的分隔符。

例如,您可以通過在大小後面加一個換行符("\n"),而不是當前放置的空間,在單獨的行上發送每個文件的信息。然後在讀取結束,你要二兩個split操作,導致列表的列表:

raw_data = some_socket_read_function() 
data = [line.split(" ") for line in raw_data.split("\n")] 

for fname, size in data: # you can unpack the two values directly while iterating 
    do_stuff(fname, size) 

如果你不希望使用換行,還有可以使用其它字符種種(逗號,冒號等)來區分數據中的兩種分色。

0

另外兩個答案是正確的,它會更清潔地以另一種格式發送數據。但是,如果由於某種原因,你不能改變你接收數據的格式,你可以這樣做

List = data.split(" ") 
List = zip(List[::2], List[1::2]) 

for name, size in List: 
    # do something with name and size 

zip功能使得對的列表,在兩個成形從相應的元件分別對名單。所以zip([1,2,3], [4,5,6])返回[(1,4), (2,5), (3,6)]List[::2]回報List,每第二個元素開始的元素0,List[1::2]回報List每第二個元素從db.getfiles()我得到的起始元素1.