2013-02-08 152 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