首页 > 编程语言 >Java-Java基础学习(2)-网络编程-TCP-UDP

Java-Java基础学习(2)-网络编程-TCP-UDP

时间:2024-03-19 11:33:31浏览次数:29  
标签:UDP Java socket java TCP import new public String

2.网络编程

2.1. 通信协议

  1. TCP、UDP对比

    • TCP 打电话

      • 连接,稳定

      • 三次握手,四次挥手

        三次握手
        A: 你瞅啥?
        B: 瞅你咋地?
        A:干一场!
        
        四次挥手
        A:我要走了
        B: 你真的要走了吗?
        B:你真的真的要走了吗?
        A:我真的要走了
        
        
      • 客户端、服务端

      • 传输完成,释放连接,效率低

    • UDP 发短信

      • 不连接,不稳定
      • 客户端,服务端,没有明确的界限
      • 不管有没有准备好,都可以发给你
      • 导弹
      • DDOS:洪水供给!(饱和攻击)

2.2. Tcp上传测试

1、TcpUploadClient.java
    package com.hzs.basic.inet;

import java.io.*;
import java.net.Inet4Address;
import java.net.Socket;
import java.net.URL;
import java.net.UnknownHostException;

/**
 * @author Cherist Huan
 * @version 1.0
 * @date 2021/6/8 11:39
 * @note 文件上传客户端
 */
public class TcpUploadClient {
    public static void main(String[] args) throws IOException {
        // 1、创建一个Socket连接
        Socket socket = new Socket(Inet4Address.getByName("127.0.0.1"),9999);

        // 2、创建一个输出流
        OutputStream os = socket.getOutputStream();

        // 3、读取文件
       // FileInputStream fis = new FileInputStream(new File(String.valueOf(TcpUploadClient.class.getResource("6.jpg"))));
    //    URL resource = TcpUploadClient.class.getResource("/images/6.jpg");
    //    FileInputStream fis = new FileInputStream(resource.getPath());

        File file = new File("java-test-questions-06/src/main/resources/images/6.jpg");
       // File file = new File("images/6.jpg");
        System.out.println(file.getAbsolutePath());
        FileInputStream fis = new FileInputStream(file);

        // 4、写出文件
        byte[] buffer = new byte[1024];
        int len;
        while((len = fis.read(buffer))!= -1)
        {
            os.write(buffer,0,len);
        }


        // 通知服务器,我已经传输完毕了
        socket.shutdownOutput(); // 我已经传输完毕

        // 接受服务器的响应,确定服务器接受完毕,才能关闭连接
        InputStream is2 = socket.getInputStream();
        byte[] buffer2 = new byte[1024];
        int len2;
        ByteArrayOutputStream baos = new ByteArrayOutputStream();


        while((len2 = is2.read(buffer2))!= -1)
        {
         baos.write(buffer2,0,len2);
        }

        System.out.println(baos.toString());

        // 5、关闭资源
        baos.close();

        fis.close();
        os.close();
        socket.close();
    }
}

    
2、TcpUploadServer.java
    package com.hzs.basic.inet;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.URL;

/**
 * @author Cherist Huan
 * @version 1.0
 * @date 2021/6/8 11:39
 *  @note 文件上传服务端
 */
public class TcpUploadServer {
    public static void main(String[] args) throws IOException {

        // 1、创建ServerSocket
        ServerSocket serverSocket = new ServerSocket(9999);

        // 2、创建Socket监听
        Socket socket = serverSocket.accept();

        // 3、获取输入流
        InputStream is = socket.getInputStream();

        // 4、文件输出

//        URL resource = TcpUploadClient.class.getResource("/images/6_receive.jpg");
//        //FileOutputStream fos = new FileOutputStream(new File(resource.getPath()));
//        FileOutputStream fos = new FileOutputStream(resource.getPath());

        File file = new File("java-test-questions-06/src/main/resources/images/6receive.jpg");
        //File file = new File("images/6_receive.jpg");
        FileOutputStream fos = new FileOutputStream(file);

        byte[] buffer;
        buffer = new byte[1024];
        int len;

        while((len = is.read(buffer))!= -1)
        {
            fos.write(buffer,0,len);
        }


        // 通知客户端,我已经接受完毕
        OutputStream os = socket.getOutputStream();
        os.write("服务端返回,服务端已经接受完毕了".getBytes());

        // 5、关闭资源
        os.close();

        fos.close();
        is.close();
        socket.close();
        serverSocket.close();

    }
}

    

总结:

  • 客户端

    1. 建立socket连接
    2. 创建一个输出管道流
    3. 读取需要上传的文件
    4. 将文件写出到管道流
    5. 通知服务器,我已经传输完毕
    6. 接受服务器的响应,确定服务器接受完毕,才能关闭连接
    7. 关闭资源
  • 服务端

    1. 建立ServerSocker端口服务
    2. 创建Socket监听,返回Socket
    3. 获取输入流
    4. 获取输入流中文件输出
    5. 通知客户端,我已经接受完毕
    6. 关闭资源

2.3. Udp 传输

1、UdpClient.java
    
package com.hzs.basic.inet;

import java.io.IOException;
import java.net.*;

/**
 * @Author Cherist Huan
 * @Date 2021/6/10 10:41
 * @Version 1.0
 */
public class UdpClient {
    public static void main(String[] args) throws IOException {

        // System.out.println(("AB".getBytes()).length);//2

        // 1、建立一个Socket
        DatagramSocket socket = new DatagramSocket();

        // 2、建包
        String msg = "Hello Cherist Huan!";
        InetAddress byName = Inet4Address.getByName("127.0.0.1");
        int port = 9090;
        DatagramPacket datagramPacket = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,byName,port);

        // 3、发送包
        socket.send(datagramPacket);
        // 4、关闭流
       socket.close();
    }
}

2、UdpServer.java
    package com.hzs.basic.inet;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

/**
 * @Author Cherist Huan
 * @Date 2021/6/10 10:57
 * @Version 1.0
 */
public class UdpServer {
    public static void main(String[] args) throws IOException {
        // 1、开放端口
        DatagramSocket datagramSocket = new DatagramSocket(9090);

        // 2、接受数据包
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);

        datagramSocket.receive(packet);// 阻塞式接受
        System.out.println(new String(packet.getData(),0,packet.getLength()));
        // 关闭流
        datagramSocket.close();
    }
}

    

2.4. Udp聊天室(多线程)

1、TalkSend.java
package com.hzs.basic.inet;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;

/**
 * @Author Cherist Huan
 * @Date 2021/6/10 15:24
 * @Version 1.0
 */
public class TalkSend implements  Runnable {

    DatagramSocket socket = null;
    BufferedReader reader = null;

    private  int fromPort;
    private  int toPort;
    private  String toIp;

    public TalkSend(int fromPort, int toPort, String toIp) {
        this.fromPort = fromPort;
        this.toPort = toPort;
        this.toIp = toIp;

        try {
            socket = new DatagramSocket(fromPort);
            reader = new BufferedReader(new InputStreamReader(System.in));

        } catch (SocketException e) {
            e.printStackTrace();
        }

    }

    public void run() {
          while(true)
          {
              try {
                  String data = reader.readLine();
                  byte[] dataBytes = data.getBytes();

                  DatagramPacket packet = new DatagramPacket(dataBytes,0,dataBytes.length,new InetSocketAddress(this.toIp,this.toPort));

                  socket.send(packet);

                  if(data.equals("bye")){
                      break;
                  }

              } catch (IOException e) {
                  e.printStackTrace();
              }
          }

          socket.close();
    }
}

2、TalkReceive.java
package com.hzs.basic.inet;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

/**
 * @Author Cherist Huan
 * @Date 2021/6/10 15:44
 * @Version 1.0
 */
public class TalkReceive  implements  Runnable{

    DatagramSocket socket = null;
    private int port;
    private  String msg;
    public  TalkReceive(int port,String msg){
        this.port = port;
        this.msg = msg;
        try {
            socket = new DatagramSocket(port);

        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    public void run() {
       while(true){

           try {
               byte[] container = new byte[1024];
               DatagramPacket packet = new DatagramPacket(container, 0, container.length);

               socket.receive(packet);//阻塞式接受包裹

               // 断开连接 bye
               byte[] data = packet.getData();
               String receiveData = new String(data,0,data.length);
               System.out.println(msg+":"+receiveData);

               if(receiveData.equals("bye"))
               {
                   break;
               }

           } catch (IOException e) {
               e.printStackTrace();
           }
       }
       socket.close();
    }
}


3、TalkStudent.java
package com.hzs.basic.inet;

/**
 * @Author Cherist Huan
 * @Date 2021/6/10 15:56
 * @Version 1.0
 */
public class TalkStudent {
    public static void main(String[] args) {
        // 开启两个线程
        new Thread(
                new TalkSend(7777,9999,"localhost")
        ).start();

        //学生端接受线程端口(服务端口 8888)
        new Thread(
                new TalkReceive(8888,"老师说")
        ).start();
    }
}

4、TalkTeacher.java
package com.hzs.basic.inet;

/**
 * @Author Cherist Huan
 * @Date 2021/6/10 16:04
 * @Version 1.0
 */
public class TalkTeacher {
    public static void main(String[] args) {
        // 开启两个线程
        new Thread(
                new TalkSend(6666,8888,"localhost")
        ).start();

        //老师端接受线程端口(服务端口 9999)
        new Thread(
                new TalkReceive(9999,"学生说")
        ).start();
    }
}    

2.5 对比总结

Java网络编程中,TCP(传输控制协议)和UDP(用户数据报协议)是两种主要的传输层协议。它们各有特点和适用场景。

TCP传输

特点

  1. 面向连接:TCP在传输数据之前需要先建立连接,传输完成后需要断开连接。
  2. 可靠传输:TCP通过序列号、确认应答、超时重传等机制确保数据的可靠传输。
  3. 流量控制:TCP通过滑动窗口机制进行流量控制,避免发送方发送速率过快导致接收方处理不过来。
  4. 拥塞控制:TCP通过慢开始、拥塞避免、快重传、快恢复等算法进行拥塞控制,避免网络拥塞。

应用场景

  • 需要可靠传输的应用,如文件传输、电子邮件等。
  • 对数据传输顺序有要求的应用,如网页浏览、在线视频等。

UDP传输

特点

  1. 无连接:UDP在传输数据之前不需要建立连接,每个数据报都是一个独立的信息。
  2. 不可靠传输:UDP不保证数据的可靠传输,不进行流量控制和拥塞控制。
  3. 开销小:由于UDP协议简单,传输开销小,适合实时性要求高的应用。

应用场景

  • 实时性要求高的应用,如音频、视频流等。
  • 允许一定程度上数据丢失的应用,如实时游戏、实时股市行情等。

标签:UDP,Java,socket,java,TCP,import,new,public,String
From: https://blog.csdn.net/donghuandong/article/details/136835823

相关文章

  • JAVA多线程常用方法
    文章目录1.常用方法总结2.run和start3.sleep4.yield5.join6.interrupt6.1相关方法6.2打断park线程6.3过时方法7.守护线程8.线程状态8.1操作系统中8.2Java中1.常用方法总结Thread类的常用API如下:方法说明publicvoidstart()启动一个新线程,Java虚拟......
  • Java中的实用类讲解(上篇)
    如果想观看更多Java内容可上我的个人主页关注我,地址子逸爱编程-CSDN博客https://blog.csdn.net/a15766649633?spm=1000.2115.3001.5343使用工具 IntelliJIDEACommunityEdition2023.1.4使用语言Java8 代码能力快速提升小方法,看完代码自己敲一遍,十分有用目录1.Java......
  • 十大排序算法--Java实现
    冒泡排序(BubbleSort)基本思想:冒泡排序是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。算法步骤:从第一个元素开始,比较相邻的元素。......
  • 【JavaScript编程实操10】1.实现一个函数,要求传递2个参数,返回两个参数的和 2.创建一个
    前言1、实现一个函数,要求传递2个参数,返回两个参数的和代码:实现效果:2、创建一个函数,传递两个参数,返回两个参数的相乘和相加的和代码:实现效果:总结前言    本次继续针对Javascript阶段的函数与对象相关方面的实操练习,共有2个实操,这两个实操具有相似性,只是一个......
  • 工作中Java最常见的6种OOM问题
    前言今天,跟大家一起聊聊线上服务出现OOM问题的6种场景,希望对你会有所帮助。1堆内存OOM堆内存OOM是最常见的OOM了。出现堆内存OOM问题的异常信息如下:java.lang.OutOfMemoryError:Javaheapspace此OOM是由于JVM中heap的最大值,已经不能满足需求了。举个例子:publicclass......
  • 招个Java工程师,却发现了一个宝藏平台
    一直关注磊哥的朋友都知道,磊哥出来创业(做Java就业指导)也快一年了,从最初的纠结彷徨、不知所措,到现在逐渐找到自己的节奏,也算是半个媳妇熬成婆了。磊哥现在每天做的事儿,就是通过文章和视频的方式分享Java干货,并且还能顺便赚点钱,解决自己的温饱问题,这种感觉真是太好了。既能帮......
  • 《手把手教你》系列技巧篇(四十二)-java+ selenium自动化测试 - 处理iframe -下篇(详解教
    1.简介经过宏哥长时间的查找,终于找到了一个含有iframe的网页。所以今天这一篇的主要内容就是用这个网页的iframe,宏哥给小伙伴或者童鞋们演示一下,在处理过程中遇到的问题以及宏哥是如何解决的。2.iframe是什么iframe就是我们常用的iframe标签:<iframe>。iframe标签是......
  • JAVA实战开源项目:农村物流配送系统(Vue+SpringBoot)
    目录一、摘要1.1项目介绍1.2项目录屏二、功能模块2.1系统登录、注册界面2.2系统功能2.2.1快递信息管理:2.2.2位置信息管理:2.2.3配送人员分配:2.2.4路线规划:2.2.5个人中心:2.2.6退换快递处理:2.2.7客户评价:三、系统展示四、核心代码4.1查询商家4.2退换快递4......
  • JAVA实战开源项目:城市桥梁道路管理系统(Vue+SpringBoot)
    目录一、摘要1.1项目介绍1.2项目录屏二、功能模块三、系统展示四、核心代码4.1查询城市桥梁4.2新增城市桥梁4.3编辑城市桥梁4.4删除城市桥梁4.5查询单个城市桥梁五、免责说明一、摘要1.1项目介绍基于Vue+SpringBoot+MySQL的城市桥梁道路管理系统,支持管......
  • 学习java第十六天
    IOC入门案例1门案例思路分析管理什么?(Service与Dao)如何将被管理的对象告知IOC容器?(配置文件)被管理的对象交给IOC容器,如何获取到IoC容器?(接口)IOC容器得到后,如何从容器中获取bean?(接口方法)使用Spring导入哪些坐标?(pom.xml)2实现步骤【第一步】导入Spring坐标【第二......