python:联机CLI版的极简日志制作
- 要求:在上周开发基础上, 完成 极简交互式笔记的网络版本
- 需求如下:
每次运行时合理的打印出过往的所有笔记
- 一次接收输入一行笔记
- 在服务端保存为文件:
- 在所有访问的客户端可以获得历史笔记
- 支持多个客户端同时进行笔记记录
知识储备
- python - socket
- TCP与UDP连接
- 关于socket的几个中文教程
编写
beta3.0
- 注:初始版本,属于审题不合格的作品。
存在问题:
- 使用TCP连接
- 不支持多客户端同时访问。
这一作品基本上照抄中文教程。
- 需要分别编写服务器端和客户端程序。
- 服务器端主要负责发送历史笔记、接收客户端数据、写入并保存文件
- 客户端主要接收历史笔记、使用raw_input进行输入并传递给客户端。
- 使用时分别打开服务器端和客户端的程序。根据服务器端的ip不同,客户端的HOST需要重新手动写入。
sever端程序
# -*- coding: utf-8 -*- #!/usr/bin/env python import socket import os from time import ctime #全局变量 global txt, New_ctnt HOST = '' #''表示连接到任意可用地址 PORT = 50007 #随意数字 ADDRESS = (HOST, PORT) bufsize = 1024 #接收的最大数据量 fn = 'simplelog.txt' #记录日志的文件 New_ctnt = '' #新纪录 #(创建并)打开日志记录文件,读取内容 FileExist = os.path.exists('simplelog.txt') if FileExist: txt = open(fn, 'r+') else: txt = open(fn,'w') txt = open(fn, 'r+') content = txt.read() #建立连接s #建立一个socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #使用bind公开一个端口,方便client连接 s.bind(ADDRESS) #设置一个listen队列的大小。 s.listen(1) try: while True: #与客户端建立连接 print 'waiting for connection ...' #服务器套接字通过socket的accept方法等待客户请求一个链接: connection,address = s.accept() print '...connected from', address break while True: #发送数据(历史日志) tr_cntnt = content[0:(bufsize-1)] print tr_cntnt connection.send(tr_cntnt) if len(content) <= bufsize: print 'end of the log' connection.send('end of the log') break else: content = content[bufsize: -1] while True: #接收数据(新写入日志) line = connection.recv(bufsize) if line == 'q()': break New_ctnt = New_ctnt + '\n' + line print line except BaseException, e: connection.close() #写入文件 txt.read() txt.write(New_ctnt) txt.close()
client程序
# -*- coding: utf-8 -*- #!/usr/bin/env python import socket HOST = '192.168.1.114' #为服务器端的ipv6 PORT = 50007 #为服务器端指定的端口 ADDRESS = (HOST, PORT) bufsize = 1024 print 'waiting for connection...' cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM) cs.connect(ADDRESS) print '...connected from', ADDRESS while True: #接收服务器端的数据(历史日志) content = cs.recv(bufsize) print content if content =='end of the log': break print 'type q() to quit inputting' while True: #发送数据(新日志) #客户和服务器通过send和recv方法通信。 line = raw_input('>:') cs.send(line) if line == 'q()': break #结束后,客户通过调用socket的close方法来关闭连接 cs.close()