Python:跨TCP客户机/服务器传递多个变量
我正在使用Python3.3创建一个TCP客户机和服务器,并且我对使用Python和套接字都是新手。我的问题是,我需要能够将通过连接传递的任何内容存储为单独的变量,以便写入各种文件等 我不确定如何做到这一点,因为这一切似乎都是一个数据流,我无法单独存储。下面是我的最新工作代码,它所做的只是通过连接发送我需要的数据。我是否应该尝试将所有数据作为列表发送,并将其分解为单独的变量?我是否可以单独访问它们,但我还没有弄清楚?我的方法全错了吗 服务器代码:Python:跨TCP客户机/服务器传递多个变量,python,tcp,python-3.x,client-server,Python,Tcp,Python 3.x,Client Server,我正在使用Python3.3创建一个TCP客户机和服务器,并且我对使用Python和套接字都是新手。我的问题是,我需要能够将通过连接传递的任何内容存储为单独的变量,以便写入各种文件等 我不确定如何做到这一点,因为这一切似乎都是一个数据流,我无法单独存储。下面是我的最新工作代码,它所做的只是通过连接发送我需要的数据。我是否应该尝试将所有数据作为列表发送,并将其分解为单独的变量?我是否可以单独访问它们,但我还没有弄清楚?我的方法全错了吗 服务器代码: import os from socket im
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()
服务器:
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()
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..)
我不确定您要保存/存储/响应什么,
您在代码和客户机代码中提到了有关密钥的内容,您创建了多个套接字,但实际上只使用了一个。。那是为了打印服务器正在扫描的东西
开始清理,试着在把所有东西都弄混之前弄清楚。
并说明您希望通过代码实现的明确目标?你想送什么?当发送X时,您希望服务器响应什么
战术:
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()
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..)
知道要执行的操作后,ex file share:
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
c->s:get:file:/root/storage/file.txt\n
cIt是一条流。你将不得不以某种方式分离出一些片段。有像ZeroMQ这样的库,它们通过套接字发送单独的消息-您可能希望了解这一点。谢谢您的回答。我将努力从这一点出发,并汇报进展情况。我将把流中传递的几乎所有内容存储为一个单独的变量。具体来说,密钥是一个要写入文件的变量,IP是另一个变量。另一个是软件版本号,它被读取、传递,然后在流的另一端进行比较,如果软件过时,它将触发一个单独的shell脚本。我添加了一个简短的示例,说明如何响应客户端请求版本
或密钥文件
:)Gl构建服务器!虽然这对我很有用,但并不完全是你所需要的。我决定用另一种方式来写这个,因为它只是一个小脚本。我决定为每个变量打开一个单独的套接字和数据流,并写入和读取文件来存储每个变量。