25.1 网络通信协议介绍

网络通信协议:网络协议是构成网络的基本组件之一,协议是若干规则和协定的组合。

协议protocol:通信双方必须遵循的规矩

网络通信协议是分层的:一般指A机器的第n层与B机器的第n层的对话,这种对话中所使用的若干规则和约束便称为第n层网络协议。

事实上网络编程简单的理解就是两台计算机相互通讯数据而已。java提供了java.net包供开发者进行网络编程。

25.1.1 TCP/IP协议

在Internet中TCP/IP协议是使用最为广泛的通讯协议(互联网上的一种事实的标准)。TCP/IP是英文Transmission Control Protocol/Internet Protocol的缩写,意思是“传输控制协议/网际协议”

TCP/IP 协议是一个工业标准协议套件,专为跨广域网(WAN)的大型互联网络而设计。

TCP/IP 网络体系结构模型就是遵循TCP/IP 协议进行通信的一种分层体系,现今,Internet和Intranet所使用的协议一般都为TCP/IP 协议。

在了解该协议之前,我们必须掌握基于该协议的体系结构层次,而TCP/IP体系结构分为四层。

  1. 第一层 网络接口层

    包括用于协作IP数据在已有网络介质上传输的协议,提供TCP/IP协议的数据结构和实际物理硬件之间的接口。比如地址解析协议(Address Resolution Protocol, ARP )等。

  2. 第二层 网络层

    对应于OSI模型的网络层,主要包含了IP、RIP等相关协议,负责数据的打包、寻址及路由。还包括网间控制报文协议(ICMP)来提供网络诊断信息。

  3. 第三层 传输层

    对应于OSI的传输层,提供了两种端到端的通信服务,分别是TCP和UDP协议。

  4. 第四层 应用层

    对应于OSI的应用层、表达层和会话层,提供了网络与应用之间的对话接口。包含了各种网络应用层协议,比如Http、FTP等应用协议。

25.1.2 IP地址和端口号

  • IP地址:网络中每台计算机的一个标识号,是一个逻辑地址,如:127.0.0.1 代表本机地址或 localhost

  • 端口号:具有网络功能的应用软件的标识号

    • 端口是一个软件结构,被客户程序或服务程序用来发送和接收数据,一台服务器有 256*256个端口。 0 - 65535

    • 0-1023是公认端口号,即已经公认定义或为将要公认定义的软件保留的端口号。

    • 1024-65535是并没有公共定义的端口号,用户可以自己定义这些端口的作用。

端口与协议有关,TCP和UDP的端口互不相干

25.1.3 基于TCP的网络编程

25.1.3.1 什么是TCP协议

​ TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的、可靠的、基于IP的传输层协议。弥补了IP协议的不足,属于一种较高级的协议,它实现了数据包的有力捆绑,通过排序重传来确保数据传输的可靠(即数据的准确传输以及完整性)。排序可以保证数据的读取是按照正确的格式进行,重传则保证了数据能够准确传送到目的地!

  1. TCP传输数据大小限制,一旦连接建立起来,双方的socket就可以按统一的格式传输大的数据。

  2. TCP是一个可靠的协议,它确保接收方完全正确地获取发送方所发送的全部数据。

25.1.3.2 Java对TCP协议的支持

java.net包中定义了两个类ServerSocket 和Socket ,分别用来实现双向连接的server 端和client 端。

25.1.3.3 TCP通讯原理

25.1.4Socket和ServerSocket

25.1.4.1 Socket

该类为建立连向服务器套接字及启动协议交换而设计,当进程通过网络进行通信的时候,java技术使用流模型来实现数据的通信。

一个Socket包括两个流,分别为一个输入流和一个输出流,一个进程如果要通过网络向另一个进程发送数据,只需简单地写入与Socket相关联的输出流,同样,一个进程通过从与Socket相关联的输入流来读取另一个进程所写的数据。

如果通过TCP协议建立连接,则服务器必须运行一个单独的进程来等待连接,而某一客户机必须试图到达服务器,就好比某人打电话,必须保证另一方等待电话呼叫,这样才能实现两人之间的通信。

25.1.4.1.1 ServerSocket

ServerSocket负责接收客户连接请求。

什么是TCP通讯?

有一个夜店(ServerSocket),你是嫖客(socket),晚上6点夜店进入营业状态,夜店正在阻塞等客户,你一进来,夜店马上安排一个小姐(server.accept()的client)与你激情对接,你向小姐输出就是你调用(outputStream),你吸入小姐精华是你调用(inputStream),你吸入小姐精华的时候得有小姐在向你输出(outputStream)

25.1.5 TCP通讯的实现

25.1.5.1 案例一:

服务端等待客户端连接,服务端连接上服务端的时候,服务端向客户端发送数据。客户端接收服务端发送过来的数据并打印在控制台上。代码示例:

服务端:


    public static void main(String[] args) {
        // 1.创建服务器Socket对象
        try {
            ServerSocket scoket = new ServerSocket(7777);
            System.out.println("服务端,正在监听7777端口:");
            Socket s = scoket.accept();//阻塞,等待客户端连接
            // 2.如有其它机器连接本机,则发送一条消息
            OutputStream out = s.getOutputStream();//获得客户端的输出流
            PrintWriter pw = new PrintWriter(out);
            System.out.println("正在向客户机发送消息 ");
            pw.write("我是服务器,你好!");
            pw.flush();//必须刷新缓存区
            s.close();
            System.out.println("向客户机发送消息完毕!");
        } catch (IOException e) {
            System.err.println("通讯异常:"+e.getMessage());
        }
    }

客户端:

public static void main(String[] args) {


        try {
             // 1.创建连接服务器Ip地址
            InetAddress address = InetAddress.getByName("192.168.1.103");
            // 2.设置连接服务器的端口号
            Socket s = new Socket(address, 7777);//指定连接的服务端
            // 3.获取服务器传输过来的消息流
            InputStream in = s.getInputStream();//得到服务器传输进来的输入流
            // 4.转换并输出流
            System.out.println("接受服务器消息:");
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            String serverMessage = br.readLine();
            System.out.println(serverMessage);
            br.close();
        } catch (UnknownHostException e) {
            System.out.println("找不到主机:"+e.getMessage());
        } catch (IOException e) {
            System.out.println("连接异常:"+e.getMessage());
        }
    }

25.1.5.2 JAVA中的InetAddress类

Java一切皆对象:这个类是对IP地址的封装

java.net.InetAddress类是java的IP地址封装类,内部隐藏了IP地址,可以通过它很容易的使用主机名以及IP地址。一般供各种网络类使用。直接由Object类派生并实现了序列化接口。该类用两个字段表示一个地址:hostName与address。hostName包含主机名,address包含IP地址。InetAddress支持ipv4与ipv6地址。一些常用方法如下:

  1. static InetAddress getLocalHost():返回本地计算机的InetAddress。

  2. String getHostName():返回指定InetAddress对象的主机名。

  3. String getHostAddress():返回指定InetAddress对象的主机地址的字符串形式

  4. static InetAddress getByName(String hostname):使用DNS查找指定主机名或域名为hostname的IP地址,并返回InetAddress。

应用举例:

InetAddress addr = InetAddress.getByName("java.sun.com")
System.out.println(addr);

以上代码将打印网址域名为java.sun.com的对应主机和IP地址信息。因此,在网络编程中,我们可以很方便的使用InetAddress类实现Ip地址的各种操作。示例如下:

public static void main(String[] args) throws Exception{
    // 获得本地主机的相关信息
    InetAddress ia = InetAddress.getLocalHost();
    // 获取本地ip地址
    System.out.println(ia.getHostAddress());
    // 获取本地主机名
    System.out.println(ia.getHostName());
    // 获取主机名为xiaoxiao的ip地址
    System.out.println(InetAddress.getByName("xiaoxiao").getHostAddress());
    // 获得指定域名的主机信息
    System.out.println(InetAddress.getByName("java.sun.com"));
    // 获得本地PC机名为PC-20131114BGRJ的所有ip地址
    InetAddress[] ias = InetAddress.getAllByName("PC-20131114BGRJ");
    for(InetAddress i : ias){
        System.out.println(i.getHostAddress());
    }
}

25.1.5.3 案例二:

实现服务端等待客户连接,客户端连接服务端,建立连接后。服务端可以随时向客户端发送数据,客户端即时接收数据口并打印在控制台。客户端也可以随时向服务端发送数据,服务端接收到数据后即时在控制台打印接收到的数据。

服务端:

客户端:

results matching ""

    No results matching ""