2020-05-31

一、网络编程概述

1、定义

计算机网络

  • 指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源的共享和信息传递的计算机系统
    网络编程
  • 用来实现网络互联的不同计算机上运行程序的间 可以进行数据交换。

2、IP地址

  • 每个设备在网络中的唯一标识,不可变的,接入网络后就会产生的
  • 每台网络终端在网络中都有一个独立的地址,我们在网络中传输数据就是使用这个地址。
  • 查看本机IP:cmd 输入ipconfig;
  • ping: 测试连接。
  • 本地回路地址 :
  • IPv4:4个字节组成(32位0~255),4组。IPV4地址大概由42亿个,2011年初已经用尽。
  • IPv6:8组,每组4个16进制数。

3、端口号

  • 每个程序在设备上的唯一识别标识。
  • 每个网络程序都要绑定一个端口号,不同计算机进行网络数据传输时,除了确定要发送到那台机器上(IP:地址)外还需要明确到要发送到那个程序。
  • 端口号范围:0~65535 。
  • 编写网络应用需要绑定一个端口号,尽量使用1024以上的端口号,因为1024以下的端口号基本都被系统程序占用了。
    4、协议
  • 为计算在网络中进行数据交互而建立的规则、标准或约定的集合。
  • 原始网络编程协议
    UDP协议:面向无连接,数据不安全 ,但是传输速度快。不区分客户端与服务端。
    TCP协议: 面向连接(三次握手),数据安全,速度略低。分为客户端和服务端。其三次握手为:1 客户端向服务端发起连接请求 。 2服务端响应请求。 3客户端发送确认信息。

二、Socket通信

  • 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字
  • 通信两端都具有Socket套接字。
  • 网络通信其实就是Socket之间的通信。

三、UDP传输协议

1、定义

UDP协议User Datagram Protocol的简称,中文名时用户数据包协议。是OSI(Open System Interconnection,[开放式系统互联]) 参考模型中一种无连接的[传输层]协议,提供面向事务的简单不可靠信息传送服务。

2、特点

  • UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
  • 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。
  • UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包而言UDP的额外开销很小。
  • UDP协议吞吐量不受拥挤控制算法的调节,只受[应用软件]生成数据的速率、传输带宽、源端和终端主机性能的限制。
  • UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。
  • 虽然UDP是一个不可靠的协议,但它是分发信息的一个理想协议。例如,在屏幕上报告股票市场、显示航空信息等等。UDP也用在[路由信息协议]中修改路由表。在这些应用场合下,如果有一个消息丢失,在几秒之后另一个新的消息就会替换它。UDP广泛用在多媒体应用中。

3、基本使用方法

  1. 发送Send
  • 创建DatagramSocket, 随机端口号
  • 创建DatagramPacket, 指定数据, 长度, 地址, 端口
  • 使用DatagramSocket发送DatagramPacket
  • 关闭DatagramSocket
  1. 接收Receive
  • 创建DatagramSocket, 指定端口号
  • 创建DatagramPacket, 指定数组, 长度
  • 使用DatagramSocket接收DatagramPacket
  • 关闭DatagramSocket
  • 从DatagramPacket中获取数据
  1. 接收方获取ip和端口号
  • String ip = packet.getAddress().getHostAddress();
  • int port = packet.getPort();

4.代码演示01

  • 发送端
public static void main(String[] args) throws Exception {
    //确定要发送的内容
    String str = "你愿意跟我一起去吃麻辣烫吗?";
    //创建发送端Socket 可以ip ,会提供一个随机的
    DatagramSocket socket = new DatagramSocket();
    //创建装载数据的包  要指明IP地址,端口号, 
    DatagramPacket packet = new DatagramPacket(str.getBytes(), str.getBytes().length, 
            InetAddress.getByName("127.0.0.1"), 6666);
    //发送数据
    socket.send(packet);
    //关闭socket
    socket.close();
}
  • 接收端
public static void main(String[] args) throws Exception {
    //创建接收端Socket,必须指定端口,不然接收不到
    DatagramSocket socket = new DatagramSocket(6666);
    //创建装载数据的包
    DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
    //接收数据, 阻塞方法
    socket.receive(packet);
    //获取接收到的数据
    byte[] bs = packet.getData();
    //获取接收到的有效数据的长度
    int len = packet.getLength();
    System.out.println(new String(bs,0,len));
    //获取对方法的端口号
    System.out.println(packet.getPort());
    //获取对方的ip地址
    System.out.println(packet.getAddress());
    //关闭socket
    socket.close();
}

代码演示02-优化版

public static void main(String[] args) throws Exception {
    //从键盘录入数据
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
    //创建发送端Socket 可以ip ,会提供一个随机的
    DatagramSocket socket = new DatagramSocket();
    //循环接收数据
    while(true){
        String str = br.readLine();
        //创建装载数据的包  要指明IP地址,端口号, 
        DatagramPacket packet = new DatagramPacket(str.getBytes(), str.getBytes().length, 
                InetAddress.getByName("127.0.0.1"), 6666);
        
        //发送数据
        socket.send(packet);
        if("结束".equals(str)){
            break;
        }
    }

    //关闭socket
    socket.close();
}

五. TCP协议

  1. 定义

    • 客户端和服务器间的交流, 客户端发送信息,服务器接收到,并返回信息
    • 长连接
  2. 使用步骤

    • 客户端
      • 创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
      • 调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
      • 输入流可以读取服务端输出流写出的数据
      • 输出流可以写出数据到服务端的输入流
    • 服务端
      • 创建ServerSocket(需要指定端口号)
      • 调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
      • 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
      • 输入流可以读取客户端输出流写出的数据
      • 输出流可以写出数据到客户端的输入流
  3. 演示

    • 客户端
public static void main(String[] args) throws Exception {
    Socket socket = new Socket("127.0.0.1", 6666);
    
    //发送信息
    OutputStream stream = socket.getOutputStream();
    
    String str = "我很中意你呀";
    stream.write(str.getBytes());
    
    //接收返回的信息
    InputStream is = socket.getInputStream();
    byte[] bs = new byte[1024];
    int len ;
    len=is.read(bs);
    System.out.println(new String(bs,0,len));
    
    socket.close();
}

服务端

public static void main(String[] args) throws Exception {
    ServerSocket server = new ServerSocket(6666);
    
    Socket socket = server.accept();
    
    //接收信息
    InputStream is = socket.getInputStream();
    byte[] bs = new byte[1024];
    int len ;
    len = is.read(bs);
    System.out.println(new String(bs,0,len));
    
    //返回信息
    OutputStream stream = socket.getOutputStream();
    
    String str = "哎呀, 知道了";
    stream.write(str.getBytes());

    socket.close();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。