文章目录
Java-网络编程
IP与端口
IP
- 在网络上我们是通过IP地址来寻找到某一台机器的。
- 寻找IP地址的命令为
ping
命令。 - 域名与IP之间有一一对应的关系。
端口
-
在网络上我们是通过端口号来寻找到数据包的目的程序。
-
IP地址后面的数字是端口号。
-
可以用
netstat
命令来检验本机各端口的网络连接情况。
Socket(用户端)
Socket(套接字)
- 有了IP+端口就可以实现网络通信。
- 套接字代表两台机器间通信的端点。
- 所以创建一个套接字的对象需要给出的属性就是:域名(对应IP地址)以及端口号。
- 建立起Socket后,本机就可以和网络上对应IP的某台主机进行网络通信了。
Socket与流
使用Socket的一般步骤:
-
建立Socket对象—与远程的主机建立了连接
-
从Socket对象上获取流。
-
对流进行读写。(底层实际上在进行网络通信)
**Attention:**Socket对象关联了资源,用完应该在finally块中关闭(close)。
An Example:
- 从socket对象上可以获得输入流(从远程主机读取数据)与输出流(往远程主机写数据)。
- 很多应用层网络协议基于文本,可使用字符流对字节流进行包装以便操作。
- 网络通讯可能使用具体的某一种网络协议,这里使用了HTTP协议。本质上使用了TCP协议进行通信。WHY?
- 这里使用了PrintWriter包装了输出流,然后向远程主机发送了HTTP协议中的GET命令。
其实这里的代码看得不是很懂?
ServerSocket(服务器端)
基本步骤:
- 服务器端首先要监听一个端口x!如果有用户端连接端口x,则创建一个Socket对象(这个Socket对象代表服务器与客户端之间的连接)
- ServerSocket并不是Socket,但是可以通过accept方法监听端口以生成Socket对象。
我的理解方法:服务器本身是一个网站,本身自带一个域名或者说IP,而形成一个Socket需要域名加端口,因此ServerSocket需要监听端口后才可以产出一个Socket。而一个Socket可以承担起一个方向(固定了源点和目的点)的读写(从目的点度读,向目的点写)服务。
- 这里的目的点主要为客户端。
网络与多线程
上面我们举的ServerSocket的例子只允许一个客户端连接,而如果要允许多个客户端连接的话那就需要使用多线程技术了。
NetHandler
实现了Runnable
接口,接收Socket对象,在内部操作Socket对象。
这一部分的实质是要求我们学会根据实际需求把多线程的技术用在网络编程上。
TCP与UDP
TCP
前面的基于Socket的程序都是基于TCP进行网络通信。
- 特点:有连接。可靠性高。(像打电话,需要接通才能开始通信,这就是建立连接的过程)
- 缺点:通信前必须先建立连接,负载高。
UDP
- 优点:无连接(不需要建立连接)、发送简单(就像发邮件,只要知道地址直接发过去就行,不需要等对方同意才能发送。)
- 缺点:可靠性不高,可能丢数据包。
UDP编程
DatagramSocket
- 功能:用于发送和接收UDP数据包的Socket
- 不同于前面的Socket对象。
- 依然是一种资源,需要进行管理,可以用
finally
也可以用try-with-recourse
来管理。
DatagramPacket
- 代表UDP数据包
基本步骤:
- 通过DatagramSocket获得数据包(DatagramPacket)
- 经常用字节数组(Byte[])来存放。
-
使用了
try-with-resource
-
使用了字节数组来存放数据
-
创建
DatagramSocket
需要指定端口号。 -
创建数据包(
DatagramPacket
),需要传入一个字节数组以及它的长度。 -
DSocket可以接收(receive)数据包。
-
数据包(
DatagramPacket
)带有IP地址信息、端口号信息和其他数据信息。