任务要求

1. 建立服务端程序,服务器端程序接收来自客户端的请求;

2. 从网上下载程序,英语900句,每句占一行;

3. 服务端读取该文件,保存到集合或者列表中;

4. 建立客户端程序,使用”sentence: <编号#>,<编号#>”的格式发生数据。例如:发送”sentense:1,2,3” , 服务端把相应编号的句子发送给客户端,并加以呈现;

5. 客户端需要把服务端发送的句子保存起来,如果已经保存有相应的句子,将不再保存。

6. 客户端需要把从服务端获取的数据存储到文件中。

7. 增加对话协议,使“talk:<谈话内容>”来进行服务端和客户端的交互,服务端和客户端都可以进行谈话的发送和响应。服务器端和客户端都要根据对方请求的内容进行相应的处理。



我的思路

在socket通信中频繁读取套接字和频繁读写文件是 IO 密集型且非排斥的任务,所以对于这些任务代码采用多线程机制可能效率更高。而且任务中的很多场景都需要多线程去完成,比如一个服务器端开多个线程以应对多个客户端的请求,客户端发送与接收两线程分离以实现客户端给服务器发送数据时无需一来一回(即避免 input 阻塞了接收数据代码)。

数据接收也是一个问题,程序中客户端与服务器端之间的连接不是短连接/一次连接(客户端一次请求 -> 服务器应答 -> 客户端),而是长链接。两者对应的接收数据的方式是不同的,前者只需要判断 socket 通信时输出流最后的空串即可,而后者需要使用尾标识以及其他办法实现数据的接收。还有,短连接和长连接对应的代码设计区别也是很大的,后者需要在客户端代码加入循环控制。