-
获取网络地址
(1)获取本地主机地址(使用InetAddress对象)
(2)获取指定域名主机地址(使用InetAddress数组对象)
**注意: 记得处理getAllByName的编译时异常,否则会报错!!!
-
案例1:心跳网络监测(简陋版)
思 路: 类似于计算机网络中的ping命令,监测网络联通性
(1)获取当前应用程序的"运行时rt"(运行时可理解为一个遥控器,用它来向操作系统发送要执行的命令)
(2)rt调用exec()方法,向操作系统发送要执行的命令,并抛出编译时异常IOException。
(3)通过process进程对象的输入流(InputStream),"读取"执行结果,使用循环进行整行读取。
**注意:读取的是字节流,是数字(看不懂),在这里我们需要把它转换为字符流,并将其写入字符输入流缓冲区,提高读取效率。
-
基于TCP协议点对点连接的(客户端<--->服务端)
- 服务端(首先启动,等待客户端连接)
(1)创建服务端Socket对象,监听8848端口;服务器启动,并进入"等待状态",等待某一个客户端的连接,当没有出现客户端连接时,accept()处于等待阻塞状态;若发现客户端连接,则返回当前正在连接的客户端。
(2)clientSocket调用getInetAddress()方法获取到当前客户端的网络地址。
(3)通过BufferReader来读取客户端发送过来的数据信息(将字节流转换为字符流)。
- 客户端(在服务端启动后,向服务端发送一个连接的请求)
(1)创建客户端Socket对象,连接指定ip和端口;并依据客户端对象创建一个输出流,并将字节流转换为字符流。
(2)调用write()方法将内容写入缓冲区即内存中,但此时还未向服务端发送请求,要发送请求,还需调用flush()方法。
**注意:clientSocket必须关闭,不允许长期占用,不关闭会报错。
此时运行,终端窗口则会出现:
-
案例2:人工机器对答程序
- 服务端
(1)创建一个HashMap集合,里面每一项均有问题及其答案信息。
(2)创建正在连接的客户端Socket和正在连接的客户端的主机地址clientIp。创建输入流对象和输出流对象,用来读取来自客户端传来的"问题"和在集合中查找后将问题的答案输出至"客户端"。
**注意:输入流--->读取客户端发送的问题(input和reader)
输出流--->发送问题的答案给客户端(output和writer)
- 客户端
(1)读取控制台输入的问题,创建输入流(BufferedReader使读取更加的高效)、输出流和Socket,向服务端发送"问题"。
(2)暂时关闭输出流,并接受服务端返回的答案(整行读取)。
-
本地图片的上传(客户端<--->服务端)
- 服务端
(1)创建服务端Socket对象,调用了clientNetAddress
的getHostAddress()
方法。这个方法返回该IP地址的字符串表示形式。这个方法会查找字符串中所有的.
字符,并将它们替换为-
字符。.concat(".jpg")
方法被调用来在转换后的字符串末尾添加".jpg"
扩展名。
(2)创建从clientSocket
获取的输入流in以及对InputStream in
的一个包装流bis,增加了缓冲功能、用于将数据写入文件系统的输出流bos、以及向clientSocket
的输出流写入字符数据的writer,它是对OutputStreamWriter
的包装,将字符数据转换为字节数据。
(3)读取客户端上传的图片以及给客户端反馈信息
- 客户端
(1)创建客户端Socket对象,连接指定ip和端口;读取本地图片;获取clientSocket输出流,通过此对象,向服务端发送数据。clientSocket.getInputStream()获取来自服务器端的响应信息(字节)。并处理相关异常。
(2)循环遍历,将内容写入缓冲区,调用flush()方法,发送至网络。
**注意:一定要暂时关闭输出流 clientSocket.shutdownOutput(); !!!
-
处理来自客户端的HTTP请求,并响应不同类型的内容
(1)使用BufferedReader
从客户端的输入流中读取HTTP请求。
(2)使用BufferedWriter
向客户端发送HTTP响应头和内容。这包括状态行、响应头(如Content-Type
和Content-Length
)以及实际的响应体(文本和HTML)。
(3)读取了一个名为“山川.jpg”的图片文件到字节数组imageBytes
中。然后,它构造了一个HTTP响应,包括状态行、Content-Type
头(指定响应内容为JPEG图像)、Content-Length
头(指定响应体的长度)以及一个空行来分隔响应头和响应体。最后,它将图片数据写入到客户端的输出流中,并调用flush()
方法确保所有数据都被发送出去。