一、TCP/UDP,Socket,Http,Ftp简介
1、TCP/IP是个协议组(主要解决数据如何在网络中传输),可分为三个层次:网络层、传输层和应用层:
网络层:IP协议(支持网间互联的数据报协议)
传输层:TCP协议、UDP协议
应用层:FTP协议、HTTP协议等
2、TCP协议:当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据,TCP提供超时重发功能,TCP一旦建立连接,客户端和服务端任何一方主动关闭连接前,TCP连接都将保持下去。TCP最大的优点是可靠,一般网页、邮件、远程连接传输就用TCP.
TCP连接的三次握手:发送数据前需要建立连接,这个连接就是“三次握手”,握手完了才可以开始发送数据。第一次连接:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的syn(ack=j+1),同时自己也发送一个syn包(syn=k),即syn+ack包,此时服务器进入syn_recv状态;第三次握手:客户端收到服务器的syn+ack包,向服务器发送确认包ack(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLESHED状态,即完成三次握手。
3、UDP协议:UDP是一个无连接的简单的面向数据报的传输层协议,UDP不提供可靠性,只是把应用程序传给IP层的数据报发送出去,并不保证他们能到达目的地,UDP不用在客户端和服务器间建立连接,故而传输速度快。一般语音广播,视频,QQ等传输就用UDP.
4、Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是实现传输层协议的一种API,Socket可以支持不同的传输层协议,可以是TCP,也可以是UDP,当使用TCP协议建立连接时,该Socket连接就是一个TCP连接。通常情况下建立TCP连接,Socket连接一旦建立通信双方就可以互相发送消息,直到连接断开。Socket连接步骤:服务器监听,客户端请求,连接确认。
5、Http协议,即超文本传输协议,是客户端浏览器与web服务器之间的应用层通信协议,web服务器上存储的都是超文本信息,客户端通过http协议传输所要访问的超文本信息,服务器通过http将超文本信息提取出来呈现给客户端。Http连接是建立在请求/响应模型上的,首先需要客户端建立一条与服务器端的TCP连接(不使用UDP连接是因为TCP协议提供传输控制,按顺序组织数据和错误纠正等功能),然后客户端发送一个请求到服务器,服务器才能回复数据。在请求结束后会主动释放TCP连接,从建立连接到释放连接称为“一次连接”。
6、FTP协议:文件传输协议是TCP/IP网络上两台计算机传送文件的协议,FTP是在TCP/IP网络和Internet上最早使用的协议之一,属于网络协议的应用层。FTP客户机可以给服务器发出命令来下载文件,上传文件,创建或改变服务器上的目录。
二、Java网络编程
1、InetAddress类代表IP地址,InetAddress类下还有 两个子类:Inet4Address、Inet6Address,分别代表IPV4地址和IPV6地址。
InetAddress ia = InetAddress.getLocalHost();//得到本机
IP对象
ia.getHostAddress();//得到IP地址
ia.getHostName();//获得此IP地址的主机名
ia.getCanonicalHostName();//获得此IP地址的全限定域名
byte[] bs = ia.getAddress();//得到的IP存进数组
System.out.println(Arrays.toString(bs));//打印出来的值会有负数,超过127,最高位会变为1,所以会打印出负数
InetAddress ia1 = InetAddress.getByAddress(bs);//根据原始IP地址获取对应InetAddress对象
InetAddress ia2 = //根据主机获取对应InetAddress对象
InetAddress.getByName("WIN-2TTIKAESLV6");
2、基于TCP协议的网络编程:
ServerSocket和Socket:ServerSocket类用于监听来自客户端的Socket连接,如果没有连接,将会一直处于等待状态。
accept();//如果接收到一个客户端Socket的连接请求,该方法将返回一个与客户端Socket对应的Socket;否则该方法将一直处于等待状态,线程也被阻塞。
ServerSocket(int port);//构造方法,用指定端口创建一个ServerSocket,没有指定IP地址,则该ServerSocket将会绑定到本机默认的IP地址。客户端连接时需指定与此相同的端口号。
示例代码:
服务器端
客户端
socket.getInputStream();//返回该Socket对象对应的输入流,让程序通过该输入流从Socket中取出数据
socket.getOutputStream();//得到socket的输出流,程序将输出信息保存到socket中返回给客户端
实际生活中客户端和服务器端需要不断地进行通信,所以为了不阻碍线程,应该使用多线程。示例代码如下:
服务器端:
客户端:
3.基于UDP协议的网络编程:
UDP协议是一种不靠谱的协议,他在通信实例两端各建立一个Socket,但这两个Socket之间并没有连接,这两个Socket只是发送、接收数据报的对象,Java提供DatagramSocket对象作为基于UDP协议的Socket,使用DatagramPacket类包装一条要发送的消息,之后使用DatagramSocket类完成信息的发送、接收操作,使用DatagramSocket发送消息时并不能指定消息到底发往何处,而是由DatagramPacket包装消息时指定消息发往的目的地。示例代码如下:
客户端:
服务器端:
由上程序可知:接收数据之前应该采用的DatagramPacket构造器有:DatagramPacket(byte[] buf, int length);
DatagramPacket(byte[] buf, int offset,int length);
发送数据之前应该采用的DatagramPacket构造器有:DatagramPacket(byte[] buf, int length,InetAddress addr,int port);
DatagramPacket(byte[] buf, int offset,int length, InetAddress addr,int port);
DatagramSocket.receive(DatagramPacket p);//从该DatagramSocket中接收数据
DatagramSocket.send(DatagramPacket p);//向外发送数据
4、URL、URLConnection、URLDecoder和URLEncoder
URLDecoder和URLEncoder类用于转换字符串,示例代码如下:
URL:url.openStream()会返回一个读取该URL资源的InputStream流,之后就可将网址上的内容以流的方式输入进来。如下代码所示:
URLConnection:通过这个类可以建立与远程服务器的连接,检查远程资源的一些属性,如下代码所示:
---------------这些博客都是我之前在学习过程中自书中摘出的重点,以及一些前辈总结的经验,外加一些自己的感悟,如果有前辈看到,有不对的地方希望大家指出,非常感谢。