JAVA网络编程初步

网络编程就是编写程序是联网的两个(多个)设备之间可以进行数据传输,java语言对网络编程提供了良好的支持,通过它提供的接口可以方便地进行网络编程。接下来先介绍一些相关的背景知识。

首先是网络协议,计算机之间能够进行相互通信主要是因为他们都遵守一定的规则,也就是网络协议。我们之后介绍的TCP/IP协议也是目前最主流的协议。

计算机网络是个复杂的系统,按照人们解决复杂问题的方法,把计算机网络的整个系统划分成了不同的层次,现在主流的就是由TCP/IP协议定义的TCP/IP参考模型,它主要定义了四个层次:网络接口层、互联网层(IP层)、传输层(TCP层)、应用层。

TCP/IP协议对网络接口层没有给出具体的描述。而互联网层是整个TCP/IP协议栈的核心,它的功能是把分组发往目标网络或主机。除了完成路由的功能外,也可以完成将不同类型的网络互联的任务,以及完成拥塞控制的功能。传输层则主要负责在应用进程之间建立端到端的连接和可靠通信,它只存在于端节点中。最后的应用层则是为互联网的各种网络应用提供服务。

最后要强调的是,TCP/IP模型之所以叫这个名字,主要是取名自最重要的网络层和传输层,然后这两个层的主要协议就是IP协议和TCP协议,除了这两个协议之外,其实还有其他协议:
ポジショニングマップ
接下来会介绍一些比较流行的协议,首先是传输层的TCP协议,全称Transmission Control Protocol,即传输控制协议,是一种面向连接的传输层协议。

每次TCP连接都会有三个阶段:创建连接、数据传送、连接释放。

创建连接就是常说的'三次握手',举个通俗的例子,在游戏中我们如果想要和队友确定是否能正常语音,我们需要最少三句话,一个是我们问对方能不能听到,第二个是对方确定能听到,再反问我们能不能听到,最后是我们回复对方,成功连接。在TCP协议中,第一个过程就是建立连接,客户端发送连接请求,即SYN(同步)报文段,等待服务器确认;第二个过程就是服务器收到SYN报文段,进行确认,同时自己将确认信息,ACK(确认)报文段和请求信息,SYN报文段一同发给客户端;最后是客户端收到信息,发送ACK报文段给服务器,之后客户端和服务器端都进入Established状态,完成TCP的三次握手。

>创建了连接之后,就可以传输数据,主要通过把发送的文件数据拆分成一个个小片段(seq,序列号),让服务器端拼回来。

数据传输完成就开始终止连接,也就是'四次挥手',首先是客户端(也可以是服务器端)告诉对方(FIN报文段),已经没有数据要传输了,然后是另一方收到FIN报文段后,先发送确认收到对方消息的信息(ACK报文段),这是为了告诉客户端我已经收到你的信息了,但能不能终值连接还不确定,因为有可能数据还没有接受完成,所以还需要再发一个FIN报文段给客户端确认关闭连接,这也就是第三阶段,然后是第四阶段,客户端收到FIN报文段,发送ACK报文段给服务器端说我要关闭连接了,然后就关了,服务器收到ACK报文段后,也关闭了连接。

可以看到,TCP协议创建连接传输数据的整个过程十分可靠,相对的也会造成速度稍慢,所以也有一种追求速度的协议,就是UDP协议。UDP协议在传输数据之前是不需要建立连接的,因为UDP协议好像不是关注的重点,所以这里暂时不细说。

接下来要介绍的是应用层的HTTP协议,http是hyper text transfer protocol(超文本传输协议),基于TCP协议之上的请求/响应式协议,也就是说一个客户端和服务器建立连接后,像服务器发送一个请求,服务器收到请求,就会给予相应的响应信息(顺带一提,还有一个https,简单来说它是http的安全版,这里不细说了)

HTTP有以下特点:首先是简单快速,客户想读武器请求服务时只需要传送请求方法和路径,请求方法常用的有get、head、post;http允许传输任意类型的数据对象;每次连接只处理一个请求,处理完请求并收到了客户的应答之后就会断开连接,这样可以节省传输时间;http是无状态协议,也就是没有记忆能力的,如果后续处理需要前面的信息,则需要重新传输前面的信息。

HTTP使用URI(uniform resource identifiers,统一资源标识符)来传输数据和建立连接,URL(Uniform Resource Locator,统一资源定位符)是一种特殊类型的URI,用来标识某一处资源的地址,比如现在有一个url

http://www.abcabc.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name

从上面的url可以看出,一个完整的url包含以下几个部分:

1.协议部分,"http:",这代表网页使用的是http协议,除此之外还会有ftp协议等等,http后面的//是分隔符。

2.域名部分,也就是www.abcabc.com,一个url中,也可以使用ip地址作为域名。

3.端口部分,也就是:8080,这个不是必须的,如果省略了则采用默认端口。

4.虚拟目录部分,从第一个/到最后一个/之间的都是虚拟目录部分,其实就是服务器的文件夹分支。

5.文件名部分,之前定位了文件在服务器的那个文件夹之后,就可以通过文件名访问了

6.锚部分,从"#"开始到最后,都是锚部分,这不是一个url必须的

7.参数部分,从"?"到"#"之间的部分,又称为搜索部分、查询部分,参数可以有很多个,他们之间用"&"作为分隔符