0

Python 3.3を使用してTCPクライアントとサーバーを作成していますが、Pythonとソケットの両方を使用するのは初めてです。私の問題は、さまざまなファイルなどに書き込むために、接続を介して渡されたものを個別の変数として格納できる必要があることです。

すべてが個別に保存できない1つのデータストリームのように見えるため、これを行う方法がわかりません。以下は私の最新の動作コードであり、接続を介して必要なデータを送信するだけです。すべてのデータをリストとして送信し、それを個別の変数に分解しようとすべきですか?すでに個別にアクセスできますが、まだ理解していませんか?私のアプローチはすべて間違っていますか?

サーバーコード:

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

1 に答える 1

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

何を保存/保存/応答したいかわかりません。コード内のキーについて何か言及し、クライアントコードで複数のソケットを作成しましたが、実際には1つしか使用していませんでした。サーバーは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

例えば。

于 2013-02-08T17:39:14.100 に答える