Java高级视频:
网络编程:
一、知识点:
(1)、基础知识:
1、网络协议TCP/IP:
2、IP地址和端口号(Port):
(1) IP地址:每台联网的电脑所具有的唯一的标识符,用占四个字节(32bit)的二进制数来表示的。即 :8位.8位.8位.8位,每一整数为8个二进制位,故
每一整数的范围为:0~255。
(2) 本地回路IP地址:127.0.0.1, 发往该地址的数据,不经过网卡传递,而是直接通过计算机TCP中的几个上层协议接收。 在网卡出现故障的时候,我们
仍然可以使用该地址实现同一台计算机上的两个网络程序的通信。
(3) 端口号:IP地址只能保证将数据包送到某个联网的计算机上,但不能保证送到该计算机上的哪一个网络程序。故,每个被发送的网络数据包的头部,
都包含有一个称为端口的部分,它的英文名为Port,它占用两个字节,用于表示数据包该交给计算机的哪个应用程序来处理。与数据包中的端口相
对应,必须为网络程序也制定一个端口号,用来制定网络程序应该接受哪个端口的数据包。不同的应用程序接受不同端口的数据,同一台机子上不能
有两个使用同一个端口的程序运行。端口的范围为:0~65535之间。0~1023之间的端口数是用于一些知名的网络服务和应用。普通的网络应用程序应该
使用1024之后的端口。
(4) 网络通信更确切的说,不是两台计算机之间的通信,而是两个程序之间通过网络的通信。
(5) 在TCP/IP协议栈中,有两个高级协议时网络应用程序编写者应该了解的:分别是,
UDP:用户数据报协议(=User Datagram Protocol),是ISO参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
TCP:传输控制协议(=Transmission Control Protocol),是一种面向连接的、可靠的、基于字节流的运输层(Transport layer)通信协议。
(6) TCP、UDP的数据帧的基本格式:
协议类型 | 源IP | 目标IP | 源端口 | 目标端口 | 帧序号 | 帧数据
1、协议类型:区分TCP、UDP。
2、源IP:发送该数据包的IP地址。 目标IP: 接收该数据包的IP地址
3、源端口:发送该数据包的网络程序所使用的端口号 目标端口:接收该数据包的网络程序所使用的端口号。
4、帧序号:由于一个数据包都会分成若干个小数据帧来向外发送,所以,在这些数据帧中,需要指定数据帧的序号,以免接收的时候混淆。
TCP处理数据包:即使是TCP协议,在网线上传输的数据也不是可靠的。
只是在发送TCP的数据帧的时候,接收端每次接收到数据以后,就会进行差错验证,如果没有任何问题,就会反馈给发送端一个数据
帧,告之已收到第一个数据帧,然后发送端开始发送第二个数据帧,依次下去,通过这样的一问一答式来保证数据无差错的传输。
这种应答的过程,不是由编程人员来控制的,而是由驱动程序的底层协议来负责完成的。
UDP处理数据包:而UDP协议在发送这样的数据帧的时候,并不会等待目标的应答,而是直接将之后的数据包不停的发送过去,至于对方的接收
状况,发送程序是不关心的。这样就是不可靠的。
3、Socket: 网络编程必知.
(1)、Socket是网络驱动层提供给应用程序编程的借口和一种机制。
· 把Socket比喻成应用程序创建的一个港口码头,应用程序只需把数据放到该码头上,就算完成了货物的运送。
· 同样,应用程序只需等待数据到达码头之后,将数据取走即可。而剩下的工作,则又货运公司(驱动程序)来处理。
· Socket是在应用程序中创建的,它通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和Port。创建完Socket之后,应用程序
写入到Socket的数据,由Socket交给驱动程序向网络上发送数据。(发送数据)
· 计算机从网路上收到与某个与Socket绑定的IP和Port相关的数据后,由驱动程序再将数据交给Socket,应用程序便可以从该Socket中读取
接收到的数据。(接收数据)
· 使用Socket接收数据的过程: 应用程序、驱动程序与Socket之间的关系.
应用程序--|-----(1、)---> Socket <---|
| | | |
(2、) | ----<--(4、)------| |
| |
| |
驱动程序-------(3、)---------->-------
(1)、首先,应用程序产生Socket
(2)、然后,应用程序调用bind方法,将Socket的信息传递给驱动程序
(3)、之后,驱动程序根据从网卡读取到的目标端口号,将数据处理后传送到Socket中。
(4)、最后,引用程序从Socket中接收数据。
(2)、Java为相应的网络通信都提供了类,在java.net包中。其中
· DatagramSocket类,用于UDP通信。
· ServerSocket类,用于TCP通信的服务器端(TCP通信分为客户端和服务器端),是指接收客户端连接的Socket。
· Socket类,用于TCP通信的服务器端和客户端,是指为建立服务器与客户端连接的Socket。
· 如果在创建Socket的时候,没有指定端口号,则系统为该Socket分配一个还未被分配的端口号。若未为之指定IP地址,那么在发送数据的时候,
底层驱动程序会选择计算机上的任意一个IP地址作为发送源地址,再由IP地址所绑定的网卡将数据发送出去,而在接受数据的时候,底层驱动
程序将发送到该计算机上的所有的IP地址的某个端口号的数据报,都交给使用该端口号的应用程序去处理。对于一般只有一个IP地址的计算机,
不用指定IP地址,否则该网络程序只能在具有指定IP地址的计算机上运行,而不能在使用其他IP地址上运行。若计算机上有多块网卡或者多个
IP的情况下,就应该明确指定数据通过哪个IP地址向外发送和接收发送给对应本地IP地址的数据。
(2)、UDP网络程序的编写:
1、DatagramSocket类:
(1)、构造函数:
· public DatagramSocket():未指定Port和IP地址,若UDP程序不用事先接收对方发送的数据,而是主动的先给对方发送数据,则最后使用这种方式。
由于该构造函数为指定端口号,则系统将自动位置分配一个为未使用的端口号。只要UDP程序先给对方发送数据,则对方
就能知道该UDP程序的IP地址和端口号,对方就可以按照该IP 和Port来发送数据。
· public DatagramSocket(int port):若UDP程序有可能要先接收对方先发来的数据,则该UDP程序就必须选择这个构造函数来创建Socket。由程序自己
指定端口号,而不是由系统来分配。否则,我们就不能在UDP程序运行前知道该程序所使用的端口号,并且程序每一次运
行时所分配到的端口号是不一样的。
· public DatagramSocket(int port, InetAddress laddr):若UDP程序在具有多个IP地址的计算机上运行,则必须为其在第三个参数中指定该UDP程序
发送和接收数据报时的IP地址。
· close(): 当应用程序不再使用DatagramSocket对象的时候,它应该调用close()方法,来将对象关闭,以此来通知驱动程序释放为该DatagramSocket
对象所分配的资源,系统以后就可以将该DatagramSocket对象所使用的端口号重新分配给其他网络应用程序。
· send(DatagramPacket p):该方法用于发送UDP数据包,
· receive(DatagramPacket p):该方法用于接收UDP的数据包。
2、DatagramPacket类:若DatagramSocket类对象是收发数据的码头,则DatagramPacket类对象就是收发数据的一个个的集装箱。
(2)、构造函数:
· DatagramPacket(byte[] buf, int length):指定了数据包的缓冲区和长度。相当于定义了集装箱的大小
· DatagramPacket(byte[] buf, int length, InetAddress address, int port) :不仅指定了数据包的缓冲区和长度,而且还指定了接收该数据包
的目标计算机的IP地址和端口。
· 在接收UDP数据的时候,程序事先是不必而且无法知道是哪个地址和端口的Socket发送的数据。
因而,在接收数据的时候需要用第一个构造函数;而在发送数据的时候需要用第二个构造函数。
就像写信一样,寄信人的信息不是必要的,但是收信人的地址是一定需要的。
· DatagramPacket类提供了getInetAddress()方法和getPort()方法:
当用于接收数据包的DatagramPacket对象接收到网络上的发送过来的数据以后,目标的IP和Port都是包装在DatagramPacket对象内的。使用
getInetAddress()方法和getPort()方法可以得到目的地的IP和Port。创建一个用于发送数据报的DatagramPacket对象,需要为其指定InetAddress
,而这个参数就可以用getInetAddress方法来指定。
· 当创建DatagramPacket对象接收数据包对象时,因无法预知对方发送的数据报的大小,故在程序中都是事先预定义一个足够大的字节数组来作为
缓冲区,传递给DatagramPacket类的构造函数。
· getData方法:返回DatagramPacket对象中的字节数组缓冲区。
· getLength方法:返回DatagramPacket对象中实际接收到的数据的长度。
3、InetAddress类:InetAddress是用于表示计算机IP地址的一个类,在日常应用中使用的是4个字节的整数字符串表示的。
· InetAddress类的静态方法getByName:可以根据4个字节的整数字符串地址来返回一个相应的InetAddress实例对象。
· InetAddress类的getHostAddress:可以返回一个InetAddress对象当中所包装的用.分隔的用整数字符串表示的IP地址。(是getByName的逆过程)
4、最简单的UDP程序的编写:
(1)、字符串与字节数组之间的双向转换:
(2)、UDP接收程序必须先启动,才能接收UDP发送程序发送的数据:
(3)、用start命令来打开新命令行窗口的好处:
可以在命令行中使用start命令来打开一个新的窗口,该窗口可以完全的继承原来的窗口的环境特性。
(4)、解决发送中文字符串的问题: