У меня проблема с сокетом и солеными огурцами. Значения не сохраняются в TXT - PullRequest
1 голос
/ 11 октября 2019

Идея моего кода на Python заключается в чтении значений из сетевого сокета и сохранении значений в файле txt для последующего использования в другом приложении.

Это не обязательноЭто должен быть текстовый файл, но это то, что я пытаюсь использовать.

Связь работает очень хорошо, он создает текстовый файл, но, к сожалению, ничего не записывает.

Кто-то можетПомоги мне. Спасибо.

Код сервера:

import socket
import pickle


HOST = ''              
PORT = 5000            
tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
orig = (HOST, PORT)
tcp.bind(orig)
tcp.listen(10)
filename = 'data.txt'


while True:
    con, cliente = tcp.accept()
    print('connector by', cliente)
    while True:
        msg = con.recv(4096)
        if not msg: break
        print(msg)

    with open(filename, 'wb') as f:
        pickle.dumps(msg, f)

    print('Ending client connection', cliente)
    con.close()

Код клиента:

import socket


HOST = '10.0.0.120'
PORT = 5000
tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
dest = (HOST, PORT)
tcp.connect(dest)

print('to exit press CTRL+C\n')
msg = input()
while msg != '\x18':
    msg = input()
    tcp.sendall(msg.encode('utf8'))


tcp.close()

Ответы [ 2 ]

1 голос
/ 12 октября 2019

Вы используете неправильный метод. pickle.dumps создает строку, а не принимает аргумент файла. Действительно, вы должны получить исключение из этого кода:

TypeError: an integer is required (got type _io.BufferedWriter)

Если вы измените свой код на использование pickle.dump, он будет работать нормально, так как это правильный метод для дампав файл. Вот пример, который демонстрирует его работу (сокеты не нужны, поскольку речь идет о том, как работает pickle, а не о работе в сети).

import pickle

foo = b'Some test string'
print("Pickling string '{}'".format(foo))

with open("/tmp/test.pickle", "wb") as tfile:
    pickle.dump(foo, tfile)

with open("/tmp/test.pickle", "rb") as tfile:
    bar = pickle.load(tfile)

print("Reloaded string '{}'".format(bar))
# Confirm they're identical
assert foo == bar
1 голос
/ 11 октября 2019

Здесь:

while True:
        msg = con.recv(4096)
        if not msg: break
        print(msg)

with open(filename, 'wb') as f:
        pickle.dumps(msg, f)

Код, открывающий файл, достигается тогда и только тогда, когда bool(msg) is False, потому что это когда цикл while True завершится, как указано здесь: if not msg: break.

Итак, msg == '', и вы заканчиваете тем, что пишете пустую строку

...