网络编程UDP和TCP简单使用实例

常见的软件结构有:
    CS:客户端服务器
        优点:用户体验好,可以将一些运算交给客户端执行,减轻服务器压力
        缺点:开发成本高,周期长,维护成本高
    BS:浏览器服务器
        优点:开发成本低,周期短,维护成本低
        缺点:所有运算都必须在服务器完成,服务器压力
        
网络编程三要素是什么
    IP:计算机唯一标识
    端口:进程的唯一标识
    协议:确定数据传输格式
            通过ip找主机,通过端口找程序,通过协议确定如何传输数据。
            
理解UDP协议的特点
    1. UDP协议的特点
        面向无连接
        只管发送不管对方是否接收到
        基于数据包进行数据传输
        数据包大小限制在64k以内
        因为面向无连接,速度快但不可靠

    2. UDP协议的应用场景
        * 即时通讯(QQ,微信,陌陌....)
        * 在线视频
        * 网络语音电话

    3. UDP协议相关的类
        * DatagramPacket
             数据报包,比喻为集装箱
             作用:用来封装要发送的数据,用来封装要接收的数据
        * DatagramSocket
             发送对象或接收对象,比喻为码头
             作用:用来发送数据包
             
使用UDP协议实现发送端程序
    1. UDP发送端实现步骤
        1. 定义字符串:要发送的内容
        2. 创建数据包对象:DatagramPacket
        3. 创建数据包发送对象:DatagramSocket
        4. 调用发送对象的方法发送数据包
        5. 释放资源

    public static void main(String[] args)throws Exception{
        // 1. 定义字符串:要发送的内容
        byte[] content = "你好UDP接收端,约吗".getBytes();
        // 2. 创建数据包对象:DatagramPacket
        DatagramPacket dp = new DatagramPacket(content, content.length,InetAddress.getLocalHost(),8888);
        // 3. 创建数据包发送对象:DatagramSocket
        DatagramSocket ds = new DatagramSocket();
        // 4. 调用发送对象的方法发送数据包
        ds.send(dp);
        // 5. 释放资源
        ds.close();
    }

2. UDP接收端实现步骤
        1. 创建数据包对象:用来存储接收到数据(DatagramPacket)
        2. 创建接收对象:DatagramSocket
        3. 调用接收对象的方法receive接收数据包
        4. 关闭资源

    public static void main(String[] args)throws Exception{
        // 1. 创建数据包对象:用来存储接收到数据(DatagramPacket)
        // 1.1 创建字节数组:用来存储接收到的实际数据
        byte[] buf = new byte[1024];
        DatagramPacket dp = new DatagramPacket(buf, buf.length);
        // 2. 创建接收对象:DatagramSocket
        DatagramSocket ds = new DatagramSocket(8888);
        // 3. 调用接收对象的方法receive接收数据包
        ds.receive(dp);// 阻塞方法
        // 3.1 定义整型变量记录实际接收到的字节个数
        int len = dp.getLength();
        System.out.println("接收到的字节个数:" + len);
        System.out.println("接收到的内容:" + new String(buf,0,len));
        // 3.2 获得发送端的端口号
        int port = dp.getPort();
        System.out.println(port);
        // 4. 关闭资源
        ds.close();
    }

    3. DatagramPacket类常用构造方法
        1. DatagramPacket(byte[] buf, int length)
            创建接收端的数据包对象
            buf:字节数组,用来存储要发送的数据
            length:能够接收内容的长度

        2. DatagramPacket(byte[] buf, int length, InetAddress address, int port)
            创建发送端数据包对象
                * buf:字节数组,用来存储要发送的数据
                * length:要发送的内容长度,单位是字节
                * address:接收端的IP地址
                * port:接收端的端口号


        3. DatagramSocket类常用构造方法
             DatagramSocket()
                创建发送端的Socket对象,随机分配端口号
             DatagramSocket(int port)
                创建接收端的Socket对象并指定端口号
                注:
                    Socket编程就是网络编程
                    网络编程就是Socket
                    Socket:套接字,插座

        4. DatagramSocket类常用方法
             void send(DatagramPacket dp) 发送数据包
             void receive(DatagramPacket dp) 接收数据包

        5. InetAddress类静态方法
            一个InetAddress类的对象就代表一个IP地址对象
            没有构造方法,通过静态方法创建InetAddress对象,静态方法有如下两个:
            static InetAddress getLocalHost(); 获得本机IP地址对象
            static InetAddress getByName(String host); 根据IP地址字符串或主机名创建IP地址对象

===============================================================================================             
理解TCP协议的特点
    1. TCP协议的特点
        面向连接的协议
        通过三次握手建立连接:形成数据传输通过
        通过四次挥手断开连接
        基于IO流进行数据传输
        传输数据大小没有限制
        因为面向连接,速度慢但可靠

     2. TCP协议的应用场景
        文件上传和下载
        邮件发送
        远程登录

     3. TCP协议相关的类
        Socket:
            * 客户端的Socket对象
            * 一个该类的对象就代表一个客户端程序
        ServerSocket
            * 服务器端的Socket对象
            * 一个该类的对象就带一个服务器程序    

使用TCP协议实现客端户和服务器端之间的数据传输。
    1. TCP客户端代码实现步骤
        1. 创建客户端Socket对象
        2. 调用Socket对象的getOutputStream方法获得字节输出流
        3. 调用字节输出流的write方法输出数据到服务器端
        4. 调用Socket对象的getInputStream方法获得字节输入流
        5. 调用字节输入流的read方法读取服务器返回的数据
        6. 关闭socket释放资源

    2. Socket类构造方法
        * Socket(String host, int port)
            * 根据主机名或IP地址字符串和端口号创建客户端Socket对象
            * host:服务器地址
            * port:服务器端的端口号
    3. Socket类常用方法
        * OutputStream getOutputStream();
        * InputStream getInputStream();

    public static void main(String[] args)throws Exception{
        // 1. 创建数据包对象:用来存储接收到数据(DatagramPacket)
        // 1.1 创建字节数组:用来存储接收到的实际数据
        byte[] buf = new byte[1024];
        DatagramPacket dp = new DatagramPacket(buf, buf.length);
        // 2. 创建接收对象:DatagramSocket
        DatagramSocket ds = new DatagramSocket(8888);
        // 3. 调用接收对象的方法receive接收数据包
        ds.receive(dp);// 阻塞方法
        // 3.1 定义整型变量记录实际接收到的字节个数
        int len = dp.getLength();
        System.out.println("接收到的字节个数:" + len);
        System.out.println("接收到的内容:" + new String(buf,0,len));
        // 3.2 获得发送端的端口号
        int port = dp.getPort();
        System.out.println(port);
        // 4. 关闭资源
        ds.close();
    }

小结:
        TCP客户端代码实现步骤
             1. 创建客户端Socket对象
             2. 调用Socket对象的getOutputStream方法获得字节输出流
             3. 调用字节输出流的write方法输出数据到服务器端
             4. 调用Socket对象的getInputStream方法获得字节输入流
             5. 调用字节输入流的read方法读取服务器返回的数据
             6. 关闭socket释放资源

使用TCP协议实现服务器端程序
    1. TCP服务器端代码实现步骤
        1. 创建ServerSocket对象:相当于开启了服务器程序
        2. 调用ServerSocket对象的accept方法等待客户端连接并获得Socket对象
        3. 调用Socket对象getInputStream方法获得字节输入流
        4. 调用字节输入流对象的read方法读取客户端发送的数据
        5. 调用Socket对象getOutputStream方法获得字节输出流
        6. 调用字节输出流对象的write方法往客户端返回数据
        7. 关闭serverSocket和socket对象

    2. ServerSocket类构造方法
        * ServerSocket(int port)
            * 创建ServerSocket对象并指定端口号
            * 相当于开启了服务器程序

    3. ServerSocket类常用方法
        Socket accept() 等待客户端连接并获得与客户端关联的Socket对象    小结:
        TCP服务器端代码实现步骤:
         1. 创建ServerSocket对象:相当于开启了服务器程序
         2. 调用ServerSocket对象的accept方法等待客户端连接并获得Socket对象
         3. 调用Socket对象getInputStream方法获得字节输入流
         4. 调用字节输入流对象的read方法读取客户端发送的数据
         5. 调用Socket对象getOutputStream方法获得字节输出流
         6. 调用字节输出流对象的write方法往客户端返回数据
         7. 关闭serverSocket和socket对象

      
    public static void main(String[] args)throws Exception{
        // 1. 创建ServerSocket对象:相当于开启了服务器程序
        ServerSocket serverSocket = new ServerSocket(6666);
        System.out.println("开启了服务器......");
        // 2. 调用ServerSocket对象的accept方法等待客户端连接并获得Socket对象
        Socket socket = serverSocket.accept();
        // 3. 调用Socket对象getInputStream方法获得字节输入流
        InputStream in = socket.getInputStream();
        // 4. 调用字节输入流对象的read方法读取客户端发送的数据
        // 创建字节数组:用来存储读取到客户端的数据
        byte[] buf = new byte[1024];
        int len = in.read(buf);
        System.out.println("len = " + len);
        System.out.println("接收到的内容:" + new String(buf,0,len));

        // 5. 调用Socket对象getOutputStream方法获得字节输出流
        OutputStream out = socket.getOutputStream();
        // 6. 调用字节输出流对象的write方法往客户端返回数据
        out.write("叔叔我们不约".getBytes());

        // 7. 关闭serverSocket对象
        serverSocket.close(); // 在实际开发中,服务器一般不会关闭的
    }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值