这里对于几个基本的概念 URL TCP UDP Socket 就不加说明了,这里仅仅是记录一些学习日志备忘。
1:如何定义相对资源
假设有如下两个资源 :
http://www.gamelan.com/pages/Gamelan.game.html
http://www.gamelan.com/pages/Gamelan.net.html
我们可以通过URL 的构造函数来定义资源,可以通过一个 URL 对象来构造一个相当资源 URL(URL baseURL, String relativeURL)
,如下:
URL gamelan = new URL("http://www.gamelan.com/pages/");
URL gamelanGames = new URL(gamelan, "Gamelan.game.html");
URL gamelanNetwork = new URL(gamelan, "Gamelan.net.html");
对于有特殊字符的 url 地址 如:http://foo.com/hello world/ 含有空格,
那么这里的地址是需要 encode 的(URL url = new URL("http://foo.com/hello%20world");),
或者是通过uri 来生产 url。如下:
URI uri = new URI("http", "foo.com", "/hello world/", "");
URL url = uri.toURL();
2: Socket 就是一个点对点的 tcp 连接,服务端通过一个 serversocket 来监听本地的一个端口 sport1,如果有客户端socket 连接上来,
serversocket 会重新生成一个 socket ,这个socket 连接本机的端口 sport1 和 客户端socket 的端口。
客户端连接服务器的时候,会连接服务器的监听端口,而客户端为了能够使得服务端能够连接到客户端,客户端socket也会绑定一个本地端口,
这个端口一般来说都是系统分配的,而且服务端的生成的 socket 也会连接这个客户端机器的系统分配的端口来建立连接。
这里的 服务端 serversocket 在监听到客户端socket连接后 生成一个 服务端的连接客户端的socket,
这里针对每个连接生成的socket来产生一个线程处理业务的话,那么这个 server 就可以支持多个客户端了。
3: UDP 是采用数据包的形式发送。有很多的防火墙和 路由器配置有不接受UDP数据包,如果出现连接不上服务器,或者说服务端接收不到 UDP数据包,排查网络的时候可以核实一下这个网络配置。
UDP 数据包是一个自寻址的数据包,他包含有要到达的目的地信息,其到达的时间和顺序和内容是不被保证的。它不像TCP那样是建立一个可靠的链路通道传输数据。
在java 中提供了几个类来帮助你实现UDP传输的网络实现:DatagramSocket, DatagramPacket, and MulticastSocket。
传输的数据包通过制定目的地地址来达到传输到目的地的目的。这里的目的地地址可以是一个具体的接收者,也可以是一组接受者,这也就出现了单播、多播/组播、广播的形式。
例如单播形式:
InetAddress address = InetAddress.getByName(args[0]);
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 4445);
例如多播形式:
InetAddress group = InetAddress.getByName("230.0.0.1");
DatagramPacket packet;
packet = new DatagramPacket(buf, buf.length, group, 4446);
那么这里的InetAddress 对象地址只是目的地地址不一样,一个是单播地址,一个是多播地址。
这里简要说明下网络地址形式。
A类地址:网络地址占前8位,主机地址占后24位 0.0.0.0 ~ 127.255.255.255
B类地址:网络地址占前16位,主机地址占后16位 128.0.0.0 ~ 191.255.255.255
C类地址:网络地址占前24位,主机地址占后8位 192.0.0.0 ~ 223.255.255.255
D类地址:属多播地址 224.0.0.0 ~ 239.255.255.255
E类地址:保留今后使用 240.0.0.0 ~ 255.255.255.255
网络ID、主机ID和子网掩码:
网络ID用来表示计算机属于哪一个网络,网络ID相同的计算机不需要通过路由器连接就能够直接通信,
我们把网络ID相同的计算机组成一个网络称之为本地网络(网段);
网络ID不相同的计算机之间通信必须通过路由器连接,我们把网络ID不相同的计算机称之为远程计算机。
当为一台计算机分配IP地址后,该计算机的IP地址哪部份表示网络ID,哪部份表示主机ID,
并不由IP地址所属的类来确定,而是由子网掩码确定。子网确定一个IP地址属于哪一个子网。
子网掩码的格式是以连续的255后面跟连续的0表示,其中连续的255这部份表示网络ID;连续0部份表示主机ID。
比如,子网掩码255.255.0.0和255.255.255.0。
根据子网掩码的格式可以发现,子网掩码有0.0.0.0、255.0.0.0、255.255.0.0、255.255.255.0和255.255.255.255共五种。
采用这种格式的子网掩码每个网络中主机的数目相差至少为256倍,不利于灵活根据企业需要分配IP地址。
比如,一个企业有2000台计算机,用户要么为其分配子网掩为255.255.0.0,
那么该网络可包含65534台计算机,将造成63534个IP地址的浪费;要么用户为其分配8个255.255.255.0网络,
那么必须用路由器连接这个8个网络,造成网络管理和维护的负担。
网络ID是IP地址与子网掩码进行与运算获得,即将IP地址中表示主机ID的部份全部变为0,
表示网络ID的部份保持不变,则网络ID的格式与IP地址相同都是32位的二进制数;主机ID就是表示主机ID的部份。