我在使用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()
答案 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)中,在文件关闭之前,新文件可能不会显示在项目概述中。但是,在文件系统级别,它确实存在。
另外,我之前关于失去第一线的注意事项是错误的。对不起。