1. 任务需求
-
任务1:创建客户端、服务器端,完成简单通信
-
任务2:完成登录、注册、退出、返回功能
-
任务3:完成小说查询列表的功能
-
任务4:完成在线阅读小说功能
-
任务5:完成下载小说功能
-
任务6:完成上传小说功能
客户端,服务端创建,简单通信——socket,serversocket,线程运用,拥塞式的接受客户连接,线程处理客户发送的请求信息。
客户端与服务端之间的每一次线程处理应该就是:
(ps:原先想法是对txt文件使用rendLine()方法,这样需要客户端与服务端进行频繁多次的交互,并不高效。)
第一步:完成登录,注册功能,获取书单列表功能,主要在于xml文件的读写操作需要熟练掌握
第二部分:上传文件,下载文件:要想要可以使用StringBuilder,可以完成字符串的拼接,最终达到存储整个txt文件的效果,在对应使用map集合,与对应键值存储,一起发送到服务端,达成高效的传输交流。
第三部分 在线小说阅读
错误处理:
注册失败:账户密码相同 || 账户相同
登录失败:账户,密码没有对应相等
在线阅读,下载书籍必须先经过获取书单功能,才可以对应选择书籍,继续进行操作
在线阅读已经是第一页时,继续选择第一页,会强制退出在线阅读
遇到问题:对于输入输出之间关流并没有十分明白
Socket
类提供了 shutdown()
方法,用于关闭套接字连接的某一部分。这个方法可以用来关闭套接字的读写功能,而不是完全关闭套接字。这样做的好处是允许发送或接收剩余的数据,而不需要完全断开连接。
shutdown()
方法有两种重载形式:
-
shutdownInput()
:关闭套接字的输入流,阻止接收更多的数据。 -
shutdownOutput()
:关闭套接字的输出流,阻止发送更多的数据。
示例代码:
Socket socket = new Socket("hostname", port); // ... 进行数据通信 ... // 关闭输入流,但保持连接以便接收剩余数据 socket.shutdownInput(); // 关闭输出流,并关闭连接 socket.shutdownOutput();
当调用 shutdownInput()
或 shutdownOutput()
方法时,套接字会进入一个关闭的状态。在关闭状态下,如果尝试写入一个已经关闭了输入的套接字,或者读取一个已经关闭了输出的套接字,将会抛出 IOException
。
此外,当调用 close()
方法关闭套接字时,会先调用 shutdownOutput()
(如果还没有调用过),然后关闭输入流,最后关闭套接字连接。
请注意,在实际编程中,应该始终检查 shutdown()
方法的返回值,以确定调用是否成功。如果返回 false
,表示套接字无法进入关闭状态,可能是由于远程主机已经关闭或网络问题。
在处理套接字时,正确使用 shutdown()
方法是一个好的编程实践,它可以确保在关闭连接之前,所有的数据都已经正确传输和接收。
详细掌握:
-
xml文件的读写方式
-
客户端与服务端之间的交互
-
客户端和服务端之间的功能函数的理解与对应流程图——着重:在线小说阅读方式
扩展:
-
集合流
-
properise文件使用——在配制文件添加下载路径的配制项
在Java编程中,properties
文件是一种简单的键值对格式的配置文件,通常用于存储应用程序的配置参数。properties
文件通常用于以下场景:
-
应用程序配置:存储应用程序运行时需要的参数,如数据库连接信息、API密钥、服务器地址等。
-
资源国际化:存储不同语言的本地化字符串,以支持应用程序的国际化。
properties
文件的特点:
-
键和值由等号
=
分隔。 -
文件编码通常是ISO-8859-1,但也可以使用其他编码,如UTF-8。
-
注释以
#
或!
开头。 -
行尾的空白字符会被忽略。
-
可以使用反斜杠
\
作为续行符。
properties
文件示例:
# 这是一个properties文件示例 # 数据库配置 db.url=jdbc:mysql://localhost:3306/mydb db.user=root db.password=secret # API配置 api.key=1234567890abcdef # 国际化 greeting=Hello, World!
在Java中读取properties
文件:
你可以使用java.util.Properties
类来加载和读取properties
文件。
import java.util.Properties; import java.io.FileInputStream; import java.io.IOException; public class PropertiesExample { public static void main(String[] args) { Properties prop = new Properties(); try { // 加载properties文件 FileInputStream input = new FileInputStream("config.properties"); prop.load(input); // 读取配置参数 String dbUrl = prop.getProperty("db.url"); String dbUser = prop.getProperty("db.user"); String dbPassword = prop.getProperty("db.password"); System.out.println("Database URL: " + dbUrl); System.out.println("Database User: " + dbUser); System.out.println("Database Password: " + dbPassword); // 关闭输入流 input.close(); } catch (IOException ex) { ex.printStackTrace(); } } }
在上面的例子中,PropertiesExample
类从名为config.properties
的文件中读取配置信息。 确保config.properties
文件位于正确的路径,或者在读取文件时指定正确的文件路径。
注意事项:
-
properties
文件中的键和值默认是字符串类型,如果需要其他类型,需要手动转换。 -
处理配置文件时,应考虑异常处理和资源管理(例如,使用
try-with-resources
语句来自动关闭资源)。 -
在生产环境中,敏感信息(如密码)不应直接存储在
properties
文件中,而应使用更安全的方式来管理。