关于在python中使用套接字的文件I / O.

时间:2018-05-25 05:36:08

标签: python sockets file-io

我在使用python中的套接字编码文件I / O程序时遇到了问题。我的服务器程序的目的是通过套接字将文本文件发送到客户端程序。即使我确认客户端程序从服务器程序接收一些数据,客户端也无法将数据写入文件。问题是什么???请帮帮我..

[server.py]

String query = "CREATE TABLE COMPANY(ID INT );";
s.execute(query);
connection.commit();

[client.py]

import socketserver
from time import sleep

class TCPSocketHandler(socketserver.BaseRequestHandler):
    def handle(self):
        sock = self.request
        while True:
            with open('imageNames.txt', 'r') as file:
                try:
                    names=file.readlines()
                    for name in names:
                        print(name)
                        sock.send((name.encode('utf-8')))
                except Exception as exc:
                    print(exc)
            sleep(60)

def main():
    HOST, PORT = "192.168.xx.xx", 7799
    server = socketserver.TCPServer((HOST, PORT), TCPSocketHandler)
    server.serve_forever()

if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:0)

大编辑

经过多次挖掘后,我发现我之前写的内容只是部分正确。真正的原因是在Python和文件系统级别上进行缓冲。

如果创建了一个TextIO对象,则会有一个缓冲区来累积输入以避免过多的系统调用。一旦此缓冲区填满,内容将被刷新到文件系统,在那里它可能最终在另一个缓冲区中,直到这个填满并且内容最终写入文件。 现在,内容管理器退出,因此在内部调用TextIO上的close()会隐式强制刷新缓冲区。

随着服务器中的循环休眠60秒,可能两者都有,你和我都没耐心等待缓冲区填满一个触发刷新的级别,以查看磁盘上文件中的内容。

如果要强制客户端收到的每个块立即显示在文件中,则必须显式刷新TextIO缓冲区并调用os.fsync()以触发刷新文件系统缓冲区。

所以,这里是你如何改变客户端,同时让服务器保持在文件内容的无限循环中:

import os
import socket


def main():
    HOST, PORT = "127.0.0.1", 7799
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
        sock.connect((HOST, PORT))
        data = (sock.recv(1024)).decode('utf-8')
        with open('imageNames2.txt', 'w') as file:
            try:
                while data:
                    file.write(data)
                    file.flush()
                    os.fsync(file.fileno())
                    print(data)
                    data = (sock.recv(1024)).decode('utf-8')
            except Exception as e:
                print(e)

if __name__ == '__main__':
    main()

请注意,在某些IDE(例如PyCharm)中,在文件关闭之前,新文件可能不会显示在项目概述中。但是,在文件系统级别,它确实存在。

另外,我之前关于失去第一线的注意事项是错误的。对不起。