网络协议

OSI七层模型(从下到上)

  • 物理层
  • 数据链路层
  • 网络层
  • 传输层
  • 会话层
  • 表示层
  • 应用层

TCP/IP四层模型(从下到上)

  • 链路层
  • 网络层
  • 传输层
  • 应用层

Java 网络编程(TCP/UDP)_java

基本的网络接口

使用InetAddress

两个子类 Inet4Address 和Inet6Address --分别对应IPV4和IPV6
    InetAddress提供公共的构造器,提供了几个公共的静态方法获得InetAddress对象
InetAddress localhost = InetAddress.getLocalHost();

byte[] addr = {(byte) 192,(byte) 168,88,1};
InetAddress byAddress = InetAddress.getByAddress(addr);

InetAddress byName = InetAddress.getByName("LAPTOP-3PKRMNI5");

InetAddress提供的常用方法:

  • public String getHostAddress():返回 IP 地址字符串(以文本表现形式)。
  • public String getHostName():获取此 IP 地址的主机名
  • public String getCanonicalHostName():获取此 IP 地址的完全限定域名
  • public boolean isReachable(int timeout):测试是否可以达到该地址。
      InetAddress localhost = InetAddress.getLocalHost();
String hostName = localhost.getHostName();
String hostAddress = localhost.getHostAddress();
System.out.println(hostName);
System.out.println(hostAddress);

使用URL

URI:表示一个统一资源标识符引用,用来唯一表示一个资源
URL:统一资源定位符,是指向互联网资源的指针,URL不仅能表示一个资源,还指明了如何locate这个资源。
url组成:
<传输协议>://<主机名>:<端口号>/<文件名>#片段名
<传输协议>://<主机名>:<端口号>/<文件名>?参数列表

URL构造方法:

  @Test
public void test3() throws Exception{
URL url = new URL("www.baidu.com/");
//public URL(URL context, String spec):
url = new URL(url, "download.html");//通过一个基准url和spec拼接部分的url进行组合一块
//public URL(String protocol, String host, String file);
url = new URL("http","baidu","download.html");//三部分进行拼接
//public URL(String protocol, String host, int port, String file);
url = new URL("http", "baidu", 8080, "download.hml");
}

URL常用方法:

  • string getProtocol():获取url的协议名
  • String getHost():获取主机名
  • String getPort():获取URL端口号
  • String getPath():获取URL的文件路径,服务器下的资源文件路径
  • String getFile():获取URL的文件名
  • String getRef():获得url在文件中的相对位置
  • String getQuery():获得url的查询名
  • String final InputStream openStream():返回一个从连接读入的inputstream
  @Test
public void test3() throws Exception{
URL url = new URL("http://192.168.34.53:80/web1/index.html");
System.out.println("协议:"+url.getProtocol());
System.out.println("主机名:"+url.getHost());
System.out.println("端口号:"+url.getPort());//获取端口号
System.out.println("路径名:"+url.getPath());//路径名
System.out.println("文件名:"+url.getFile());
System.out.println("锚点"+url.getRef());//锚点
System.out.println("查询名:"+url.getQuery());//查询名
}
  //从百度读取首页资源
@Test
public void test4() throws IOException{
URL url = new URL("http://www.baidu.com/index.html");
/*html标签(格式化数据)、css:皮肤(美化数据)、js:互动(交互数据)、数据:*/
InputStream input = url.openStream();
byte[] data = new byte[1024];
int len;
while((len=input.read(data))!=-1){
System.out.println(new String(data,0,len,"UTF-8"));
}
input.close();
}

URLConnection

url的openStream()可以从网上读取数据,但是无法上传数据,给服务器发送数据,如果希望,可使用URLConnection

步骤

  • 通过URL对象调用openConnection方法创建URLConnection连接对象
  • 处理设置参数和一般请求属性
  • 使用connect方法建立到远程对象的实际连接
  • 远程对象变为可用,远程对象的头字段和内容变为可访问
URLConnection的常用方法:
  • public InputStream getInputStream()返回从此打开的连接读取的输入流。
  • public OutputStream getOutputStream()返回写入到此连接的输出流。
  • public void setDoInput(boolean input)
    URL 连接可用于输入和/或输出。如果打算使用 URL 连接进行输入,则将 DoInput 标志设置为 true;如果不打算使用,则设置为 false。默认值为 true。
@Test
public void test5() throws Exception{
URL url = new URL("http://www.baidu.com/index.html");
URLConnection uc = url.openConnection();
uc.setDoOutput(true);
uc.getOutputStream().write("username=admin&password=123".getBytes());;
uc.connect();
InputStream is = uc.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
String string;
while((string = br.readLine())!=null){
System.out.println(string);
}
br.close();
}

Socket

分类:

  • 流套接字(stream socket):使用tcp提供可依赖的字节流服务
  • 数据报套接字(datagram socket):使用UDP提供 不太可靠的数据报服务
常用构造器
  1. public Socket(InetAddress address,int port):创建一个流套接字并指定IP地址的端口号
  2. public Socket(String host,int port):创建一个流套接字并将其连接到指定主机上的指定端口号

Socket类的常用方法:

  • public InputStream getInputStream():返回此套接字的输入流,可以用于接收消息
  • public OutputStream getOutputStream():返回此套接字的输出流,可以用于发送消息
  • public InetAddress getInetAddress():返回连接到的远程IP地址,如果套接字未连接,返回null
  • public void close():关闭套接字,套接字被关闭后,便于在网络中使用
  • publi void sutdownInput():调用后,返回EOF(文件结束符)
  • public void shutdownOutput():禁止套接字的输出流,禁止后,抛出IOException

基于TCP协议的网络编程

TCP(Transmission Control Protocol,传输控制协议)被称为一种端对端协议,是一种面向连接的,可靠的,基于字节流的传输层的通信协议,可以连续传输大量的数据

步骤
服务器程序的工作过程包含以下五个基本的步骤:

  1. 使用 ServerSocket(int port) :创建一个服务器端套接字,并绑定到指定端口上。用于监听客户端的请求。
  2. 调用 accept()方法:监听连接请求,如果客户端请求连接,则接受连接,创建与该客户端的通信套接字对象。否则该方法将一直处于等待状态。
  3. 调用 该Socket对象的 getOutputStream() 和 getInputStream ():获取输出流和输入流,开始网络数据的发送和接收。
  4. 关闭Socket对象:某客户端访问结束,关闭与之通信的套接字。
  5. 关闭ServerSocket:如果不再接收任何客户端的连接的话,调用close()进行关闭。

客户端Socket的工作过程包含以下四个基本的步骤:
6. 创建 Socket:根据指定服务端的 IP 地址或端口号构造 Socket 类对象,创建的同时会自动向服务器方发起连接。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。
7. 打开连接到Socket 的输入/出流:使用 getInputStream()方法获得输入流,使用 getOutputStream()方法获得输出流,进行数据传输。
8. 进行读/写操作:通过输入流读取服务器发送的信息,通过输出流将信息发送给服务器。
9. 关闭 Socket:断开客户端到服务器的连接

UDP协议编程

####UDP(User Datagram Protocol,用户数据报协议):是一个无连接的传输层协议,提供面向事物的简单不可靠的信息传送服务

特点
  • 将数据,源,目的封装成数据包,不需要建立连接
  • 每个数据报的大小限制在64K
  • 因无需连接,故不可靠,速度快
类 :DatagramSocket 和DatagramPacket 实现了基于UDP协议网络程序

DatagramSocket常用方法:

  • DatagramSocket(int port)
  • DatagramSocket(int port,InetAddress laddr)
  • close()关闭此数据报套接字
  • send(DatagramPacket p)
  • receive(DatagramPacket p)
  • getLocalAddress()获取套接字绑定的本地地址
  • getLocalPort()返回此套接字绑定的本地主机上的端口号
  • getInetAddress()返回此套接字连接的地址。如果套接字未连接,则返回 null
  • getPort()返回此套接字的端口
DatagramPacket类的常用方法
  • DatagramPacket(byte[] buf,int length), length 参数必须小于等于 buf.length
  • DatagramPacket(byte[] buf,int length,InetAddress address,int port)构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。length 参数必须小于等于 buf.length。
  • InetAddress getAddress()返回某台机器的 IP 地址
  • int getPort()返回某台远程主机的端口号
  • int getPort()返回某台远程主机的端口号
  • int getLength()返回将要发送或接收到的数据的长度

流程

  1. 建立发送端的DatagramSocket,需要指定本端的端口号
  2. 建立数据包DatagramPacket
    数据
    接收端的IP地址
    接收端的端口号
  3. 调用Socket的发送方法
  4. 关闭Socket