2013-02-08 96 views
0

我正在使用Python 3.3創建一個TCP客戶端和服務器,我對使用Python和套接字都很陌生。我的問題是,我需要能夠存儲通過連接傳遞的任何東西作爲一個單獨的變量,以寫入各種文件等。Python:跨TCP客戶端/服務器傳遞多個變量

我不確定如何做到這一點,因爲它似乎都是一個數據流我無法單獨存儲。下面是我最新的工作代碼,它所做的全部工作就是通過連接發送我需要的數據。我應該試圖將所有數據作爲列表發送並將其解構成單獨的變量嗎?我可以單獨訪問它們嗎?我還沒有弄清楚它們?我的方法都錯了嗎?

Server代碼:

import os 
from socket import * 

HOST = '' #We are the host 
PORT = 29876 
ADDR = (HOST, PORT) 
BUFFSIZE = 4096 

serv = socket(AF_INET,SOCK_STREAM) 
serv.bind(ADDR,) #Create tuple with one element 
serv.listen(5) 
print ('listening...') 

conn,addr = serv.accept() 
print (conn,addr) 
print ('...connected') 

with open(os.path.expanduser("~/.ssh/id_rsa.pub")) as f: 
    key = f.read() 
    conn.sendall(key) 
print(key) 


while True: 
    data = conn.recv(BUFFSIZE) 
    print(data) 


conn.close() 

客戶端代碼:

from socket import * 
import os 
import socket 

HOST = 'xxx.xxx.xxx.xxx' 
PORT = 29876 #Must match server.py 
ADDR = (HOST,PORT) 
BUFFSIZE = 4096 

cli = socket.socket(AF_INET, SOCK_STREAM) 
cli.connect(ADDR,) 

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
s.connect(("gmail.com",80)) 
ip = ((s.getsockname()[0])) 
ip = ip.encode('utf-8') 
cli.send(ip) 

while True: 
    data = cli.recv(BUFFSIZE) 
    print (data) 



cli.close() 
+1

它*是*全部一個流。你將不得不以某種方式分離比特。有像ZeroMQ這樣的庫通過套接字發送單獨的消息 - 您可能想要查看該消息。 – 2013-02-08 17:22:43

回答

0

服務器:

from socket import * 
from os.path import isfile 

s = socket() 
s.bind(('', 1234)) 
s.listen(4) 
ns, na = s.accept() 

loopdata = {} 

i = 0 
while 1: 
    try: 
     data = ns.recv(8192) 
    except: 
     break 

    for line data.split('\n'): 
     if line == 'version': 
      print na[0] + ' requested a version' 
      ns.send('1.0\n') 
     elif line == 'key': 
      print na[0] + ' is requesting a key' 
      if isfile(na[0] + '.key'): 
       with open(na[0] + '.key') as f: 
        ns.send(f.read()) 
      else: 
       ns.send('Missing key file!\n') 
     loopdata[i] = line 

     #ns.send('OK\n') 
     i += 1 
ns.close() 
s.close() 

print loopdata # <- Print all the lines 

客戶端:

from socket import * 
s = socket() 
s.connect(('127.0.0.1', 1234)) 

s.send('version\n') 
print 'Client got:', s.recv(8192) 
s.close() 

我不確定你要保存/存儲/響應什麼, 你提到了一些關於你的代碼和你的客戶端代碼中創建了多個套接字,但只有真正使用一個..和那是爲了打印服務器被sednding的任何東西?

開始乾淨的工作之前,先弄清楚事情,然後再把它們混合起來。 並指出您希望用您的代碼實現的明確目標?你想發什麼?並在發送X時,您希望服務器響應什麼?

戰術:

1. You want to define a protocol, 
    1.1 Command separator 
    1.2 Command structure (ex: command:parameter:data\n) 
    1.3 sates (ex login state etc etc..) 

後你知道你想要做什麼,恩文件共享的內容:

c->s: get:file:/root/storage/file.txt\n 
c<-s: file:content\n 
c<-s: <file data>\n\n 
c<-s: file:close\n 
c->s: file:recieved 

例如。

+0

謝謝你的回答。我會試着從這裏開始工作並報告它是如何發生的。 我將存儲幾乎所有沿着流傳遞的一切作爲一個單獨的變量。具體而言,密鑰將是要寫入文件的變量,IP將是另一個變量。另一個將是一個軟件版本號,讀取,傳遞並在流的另一端進行比較,如果軟件過期,將觸發單獨的shell腳本。 – Metagen 2013-02-11 12:15:25

+0

我添加了一個簡短的例子,如何響應客戶端請求'版本'或'keyfile' :)建立你的服務器! – Torxed 2013-02-11 14:15:03

+0

雖然這對我很有用,但並不完全符合你的需求。我決定採取與此不同的方式,因爲它只是一個小腳本。我決定爲每個變量打開一個單獨的套接字和數據流,並寫入和讀取文件以存儲每個變量。 – Metagen 2013-02-12 14:56:49