写在前面
上一份笔记中,我们记录了本课程的前三章,关于并发编程的部分。
下面我们接着看,关于 网络编程 的相关部分。
4.2 URL 对象
首先,我们要学习的是访问网络资源(比如说一个网页)。而在 Java 中,对于网络资源的访问,通常是 使用 URL 类来实现的。本小节就介绍了 URL 这个类及其简单用法。
这里作者给出了一个通过URL读取WWW信息的例子(其实这个就是一个 java 爬虫,爬的是网页源码)。
还介绍了构造 URL 对象的构造方法。具体的可以去看类的构造方法。
4.3 URLConnection 对象
上面一个小节介绍了URL对象,可以实现对网络资源的访问。而比URL更强大的,是URLConnection 对象。
顾名思义,URLConnection对象代表一个 URL资源与Java程序的通讯连接,我们可以通过该对象,对URL资源进行 读或写。
比 URL对象更为强大的是:
- URL只能读(单向),URLConnection可以读和写(双向)
- URLConnection 可以查看服务器的响应头部
- URLConnection 可以设置客户端请求的头部
使用 URLCOnnection 通信的一般步骤
- 构造一个URL对象
- 调用URL对象的 openConnection() 方法,获取该对象对应的 URLConnection 对象
- 配置该 URLConnection 对象
- 读取首部字段
- 获得输入流读取数据
- 获取输出流写入数据
- 关闭连接
这里还是通过抓取新浪的例子,来说明了 URLConnection 读写WWW资源。(课程的例子中只有读,没有写)
4.4 Get请求 和 Post请求
这一节里面,作者介绍了用 java 如何编写 GET 请求 和 POST 请求。
都是应用 URLConnection 对象来实现的。
除了URLConnection 类,还有一个 HTTPURLConnection 类,更加好用。
4.5 Socket 通讯原理
首先我们需要理解的是,什么是 socket。
Socket 直译的话,是“插座”的意思。而在一个操作系统中,系统使用 socket 将底层的 TCP/IP 协议封装起来,用户不需要了解更底层的协议,写出来的代码自然是符合相关网络传输协议的了。

每一个 Socket 需要对应一个 ip + port(很好理解,需要唯一定位),这个叫做 bind(),绑定。
简单理解,就是一层抽象封装。
对于 Socket , 还有一个生动的例子。
将socket通信类比为打电话这一生活场景。这里我把TCP服务器比作政府某一服务部门能,TCP客户端比作企业中某一部门电话,描述这一过程,恰好就像是socket通信,服务部门提供服务,企业部门申请服务。
要实现通信,首先政府部门都必须申请一个电话(socket_fd),并向有关部门注册(我们的系统),提供地址(sockadrr)以及属于哪个部门的(port),录入系统后,就算是合约生效了(bind),于是乎,政府广而告之,这个服务热线就算开通了,在部门里面的人员所需要做的事情,就是等待企业家拨打热线(listen)。
企业家拨打电话对地点和部门没有这么多的要求了,他并不需要绑定地址和部门,在任何一个可以拨打电话的地方(可能是同个部门,也可以同公司不同部门,甚至可能是竞争对手),他只需要拿起一个已经注册的电话(socket_fd),拨打电话(connect)
政府部门接通电话(accept)后,桥梁就打通了(服务者client_fd、顾客server_fd),可以进行听说了(read write)。企业家咨询完成(close),政府到点下班关闭服务(close)
4.6 Socket 通讯实现
这里,作者给出了一个简单的聊天 C/S 代码。说明Socket通讯的简单实现。
其实,Socket 流 编程 最后就会成为输入输出流编程。
5. 多端网络编程
上一章中,我们介绍了网络编程的基础知识,这一章节主要看一下多端网络编程的实现。
5.2 Socke多客户端通信实现
这一节中,作者给出了多个客户端和一个服务器进行通讯的思想和实现。
核心思想就是说,在服务器端开启多个线程,每一个线程对应处理一个客户端。
因此,这个时候就需要一个线程类来,并在其 run() 方法中实现 ServerSocket 对象的生成,以及相关的处理.
/**
* 多客户端聊天的服务器进程类
*/
public class ServerThread extends Thread {
Socket socket = null;
int clientNum;
public ServerThread(Socket socket, int num){
this.socket = socket;
clientNum = num+1;
}
@Override
public void run() {
try{
String line;
// 输入流,用来收取从网络收来的数据
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 输出流,用来将服务器的内容发送到网络客户端
PrintWriter os = new PrintWriter(socket.getOutputStream());
// 输入流,用来获取键盘的输入
BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Client"+clientNum+":"+is.readLine());
line = sin.readLine();
while (!line.equals("bye")){
os.println(line);
os.flush();
System.out.println("Server:" + line);
System.out.println("Client:" + clientNum+":"+is.readLine());
line = sin.readLine();
}
os.close();
is.close();
socket.close();
}catch (Exception e){
System.out.println(e);
}
}
}
5.3 数据包通信UDP
我们这一章经常讲的,都是基于TCP协议的通信。
这一个小节作者介绍了基于 UDP 的通信及其相对应的类,有 DatagramPacket, DatagramSocket, MulticastSocket等。
这里作者给出了一个查询股票的例子,用来说明我们如何发送、接收、返回数据报的。
逻辑上来说,比较简单
- 客户端发送一个 DatagramPacket 对象(通过一个DatagramSocket 对象)
- 服务器根据接收到的 DatagramPacket 对象 获得客户端的 IP+Port
- 服务器构造自己的 DatagramPacket 对象,并且发送
5.4 使用数据报进行广播
上一小节中,我们使用 DatagramSocket 可以监听来自某个地址的数据报。
为了完成广播的功能,我们使用 MulticastSocket 类,来广播和监听。
这一个小节大概了解一下就行。
作者给出的例子的代码还是挺复杂的。
5.5 网络聊天程序
这一个小节实际上是把前面讲的 Socket 编程和图形化界面 Swing 联系起来,写了一个含有简单图形界面的聊天程序。没有什么别的。
网友评论