JavaSE—18.网络

网络基础概念

  • 什么是计算机网络
    • 把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息,共享硬件、软件、数据信息等资源。
  • 计算机网络的主要功能
    • 资源共享
    • 信息传输与集中处理
    • 均衡负荷与分布处理
    • 综合信息服务(www/综合业务数字网络 ISDN)

网络通信协议及接口

  • 什么是网络通信协议
    • 计算机网络中实现通信必须有一些约定即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等指定标准
  • 网络通信接口
    • 为了使两个结点之间能进行对话,必须在它们之间建立通信工具(即接口),使彼此之间能进行信息交换。接口包括两部分:
      1. 硬件装置:实现结点之间的信息传送
      2. 软件装置:规定双方进行通信的约定协议

通信协议分成的思想

  • 为什么要分层
    • 由于结点之间联系很复杂,在制定协议时,把复杂成分分解成一些简单的成分,再将它们复合起来。最常用的复合方式是层次方式,即同层间可以通信、上一层可以调用下一层,而与再下一层不发生关系。各层互不影响,利于系统的开发和扩展。
  • 通信协议的分层规定
    • 把用户应用程序作为最高层,把物理通信线路作为最底层,将其间的协议处理分为若干层,规定每层处理的任务,也规定每层的接口标准。

JavaSE—18.网络_第1张图片

数据封装——数据拆封

IP协议

  • IP(Internet Protocol)协议是网际层的主要协议,支持网间互连的数据报通信。它提供主要功能有:
    • 无连接数据报传送
    • 数据报路由选择和差错控制
  • 提供了唯一一个IP地址

TCP协议和UDP协议

  • TCP(transmission control protool)(可靠、慢)
    • 是专门设计用于在不可靠的因特网上提供可靠的、端到端的字节流通信的协议。它是一种面向连接的协议。TCP连接是字节流而非报文流。
    • 三次握手
  • UDP(user data protool)(不可靠、快)
    • UDP向应用程序提供了一种发送封装的原始IP数据报的方法、并且发送时无需建立连接。是一种不可靠的连接

Socket

  • 两个Java应用程序可通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个Socket
  • Socket通常用来实现client-server连接
  • java.net包中定义的两个类Socket和ServerSocket,分别用来实现双向连接的client和server端
  • 建立连接时所需的寻址信息为远程计算机的IP地址和端口号(Port number)
    • 端口号用来区别同一计算机上不同的应用程序,端口号两个字节(最多65536个)
    • 端口号分两种:1.TCP端口,2.UDP端口,每一个都有65536个

TCP编程

TCP通信模型

JavaSE—18.网络_第2张图片

//Server端
public class TCPServer {
    public static void main(String[] args) throws Exception {
       ServerSocket ss = new ServerSocket(6666);//指定端口号
        while (true) {//连接一个client后,继续等待下一个client连接
            Socket s = ss.accept();//接收申请连接的client,accept方法是阻塞式的
            System.out.println("A client connect!");
            DataInputStream dis = new DataInputStream(s.getInputStream());
            System.out.println(dis.readUTF());//readUTF是阻塞式的,等待client输入
            dis.close();
            s.close();
        }
    }
}
//client端
public class TCPClient {
    public static void main(String[] args) throws Exception {
        Socket s = new Socket("127.0.0.1", 6666);//连接到指定主机上的指定端口号
        System.out.println("连接成功");
        OutputStream os = s.getOutputStream();
        DataOutputStream dos = new DataOutputStream(os);
        dos.writeUTF("hello");
        dos.close();
        dos.flush();
        s.close();
    }
}
//server端
public class TCPServer {
    public static void main(String[] args) {
        try {
            ServerSocket ss = new ServerSocket(8888);
            while (true) {
                Socket s = ss.accept();
                System.out.println("有一个client连接");
                OutputStream os = s.getOutputStream();
                DataOutputStream dos = new DataOutputStream(os);
                dos.writeUTF("Hello," + s.getInetAddress() + "port#" + s.getPort() + "bye-bye!");
                dos.close();
                s.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("出错了");
        }
    }
}
//client端
public class TCPClient {
    public static void main(String[] args) {
        try {
            Socket s = new Socket("127.0.0.1", 8888);
            InputStream is = s.getInputStream();
            DataInputStream dis = new DataInputStream(is);
            System.out.println(dis.readUTF());
            dis.close();
            s.close();
        } catch (ConnectException e) {
            e.printStackTrace();
            System.out.println("连接服务器出错");
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}

UDP编程

  • 不可靠的
  • 效率高
  • 数据报/非连接
    • 音频
    • 视频
//Server端
public class UDPServer {
    public static void main(String[] args) throws Exception {
        byte buf[] = new byte[1024];//用于存放数据
        DatagramPacket dp = new DatagramPacket(buf, buf.length);//用于接收UDP发过来的数据
        DatagramSocket ds = new DatagramSocket(5678);
        while (true) {
            ds.receive(dp);//只要有发送过来的数据,就将数据放在dp中,阻塞式
            System.out.println(new String(buf, 0, dp.getLength()));
        }
    }
}

//client端
public class UDPClient {
    public static void main(String[] args) throws Exception {
        byte[] buf = (new String("Hello")).getBytes();
        DatagramPacket dp = new DatagramPacket(buf, buf.length,
                            new InetSocketAddress("127.0.0.1", 5678));//指定要发送的IP和端口号
        DatagramSocket ds = new DatagramSocket(9999);//client本身占据了9999端口,向5678发送数据
        ds.send(dp);
        ds.close();
    }
}

你可能感兴趣的:(javase)