【问题标题】:Python: Passing Multiple Variables Across TCP Client/ServerPython:跨 TCP 客户端/服务器传递多个变量
【发布时间】:2013-01-24 12:35:07
【问题描述】:

我正在使用 Python 3.3 创建 TCP 客户端和服务器,而且我对同时使用 Python 和套接字是新手。我的问题是我需要能够将通过连接传递的任何内容存储为单独的变量,以便写入各种文件等。

我不确定如何执行此操作,因为这一切似乎都是我无法单独存储的一个数据流。下面是我最新的工作代码,它所做的只是通过连接发送我需要的数据。我是否应该尝试将所有数据作为列表发送并将其解构为单独的变量?我可以单独访问它们而我还没有弄清楚吗?我的方法全错了吗?

服务器代码:

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()

【问题讨论】:

  • 都是一个流。您将不得不以某种方式将位分开。有像 ZeroMQ 这样的库,它们通过套接字发送单独的消息——你可能想研究一下。

标签: python tcp python-3.x client-server


【解决方案1】:

服务器:

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()

我不确定您要保存/存储/响应什么, 您提到了一些关于您的代码和客户端代码中的密钥的内容,您创建了多个套接字,但实际上只使用了一个.. 那是为了打印服务器正在发送的任何内容?

从头开始,在混淆之前尝试弄清楚事情。 并陈述一个你想用你的代码实现的明确目标?你想寄什么?并且发送 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

例如。

【讨论】:

  • 感谢您的回答。我将尝试以此为基础,并报告进展情况。我会将流中传递的几乎所有内容都存储为一个单独的变量。具体来说,密钥将是要写入文件的变量,IP 将是另一个。另一个是软件版本号,它被读取、传递,然后在流的另一侧进行比较,如果软件过期,它将触发单独的 shell 脚本。
  • 我添加了一个简短的示例,说明如何响应客户要求 versionkeyfile :) Gl 构建您的服务器!
  • 虽然这对我很有用,但它并不是你所需要的。我决定采用不同的方式,因为它只是一个小脚本。我决定为每个变量打开一个单独的套接字和数据流,并写入和读取文件来存储每个变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-08
  • 1970-01-01
相关资源
最近更新 更多