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

这篇具有很好参考价值的文章主要介绍了Java-Java基础学习(2)-网络编程-TCP-UDP。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

2.网络编程

2.1. 通信协议

  1. TCP、UDP对比

    • TCP 打电话

      • 连接,稳定

      • 三次握手,四次挥手

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

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

    • UDP 发短信

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

2.2. Tcp上传测试

1TcpUploadClient.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();
    }
}

    
2TcpUploadServer.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 传输

1UdpClient.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();
    }
}

2UdpServer.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聊天室(多线程)

1TalkSend.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();
    }
}

2TalkReceive.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();
    }
}


3TalkStudent.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();
    }
}

4TalkTeacher.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通过慢开始、拥塞避免、快重传、快恢复等算法进行拥塞控制,避免网络拥塞。

应用场景文章来源地址https://www.toymoban.com/news/detail-844947.html

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

UDP传输

特点

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

应用场景

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

到了这里,关于Java-Java基础学习(2)-网络编程-TCP-UDP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机网络技术与JAVA网络编程UDP编程-----JAVA入门基础教程-----计算机网络经典

    import org.junit.jupiter.api.Test; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.*; public class UDP { public static void main(String[] args) { DatagramSocket datagramSocket = null; try { datagramSocket = new DatagramSocket(); InetAddress inetAddress = InetAddress.getByName(\\\"127.0.0.1\\\"); int port = 9090; byte[] byte

    2024年02月15日
    浏览(35)
  • 计算机网络技术与JAVA网络编程URL编程-----JAVA入门基础教程-----计算机网络经典

    import org.junit.jupiter.api.Test; import java.io.*; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class URLTest { public static void main(String[] args) { //URL:统一资源定位符(种子),一个URL就定位着互联网上某个资源的地址 //http:应用层协议,IP地址,端口号,资源地址,参数

    2024年02月15日
    浏览(31)
  • Java基础面试题04(网络编程)

    什么是网络编程?它的作用是什么? 网络编程是一种用于在计算机网络中进行数据交换和通信的编程技术。它涉及到使用网络协议和相关工具来实现程序之间的通信。网络编程的目标是允许不同设备或应用程序之间进行数据传输、共享资源和进行远程控制。 网络编程的作用

    2024年02月15日
    浏览(26)
  • 快速入门java网络编程基础------Nio

    哔哩哔哩黑马程序员 netty实战视频 NIO(New I/O)是Java中提供的一种基于通道和缓冲区的I/O(Input/Output)模型。它是相对于传统的IO(InputStream和OutputStream)模型而言的新型I/O模型。NIO的主要特点包括: 1.通道与缓冲区: 2.NIO引入了通道(Channel)和缓冲区(Buffer)的概念。通道

    2024年01月20日
    浏览(37)
  • 《Java SE》网络编程基础知识归纳。

    目录 一、网络基本介绍 1、什么是网络通信? 2、网络 3、IP地址 4、域名 5、网络通信协议 6、Socket 二、TCP网络通信编程  1、应用实例1(字节流) 2、应用实例2(字节流) 3、应用实例3(字符流) 4、netstat 指令 三、UDP网络通信编程  1、基本介绍 2、基本流程 3、应用实例  

    2024年01月20日
    浏览(39)
  • 【Java学习笔记】 68 - 网络——TCP编程、UDP编程

    https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter21/src 目录 项目代码 网络 一、网络相关概念 1.网络通讯 2.网络 3.IP地址 4.域名 5.端口号 6.网络通讯协议 TCP协议:传输控制协议 UDP协议: 二、InetAddress类 1.相关方法 三、Socket 1.基本介绍 2.TCP网络通信编程 基本介绍 应用案例

    2024年02月04日
    浏览(29)
  • Java学习笔记37——网络编程01

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

    2024年02月07日
    浏览(35)
  • Java网络编程基础:TCP Socket套接字编程 IntAddress UDP等...

    目录 一,网络基础 1.IP地址 2.端口 3.TCP/UDP协议 4.网络编程开发模式  二,基于套接字的Java网络编程 1.Socket  2.InetAddress 三.基于TCP的Socket网络编程 1.单服务器端与单Socket客户端一次通讯 2.单服务器端接收多次通讯  3.TCP网络通讯补充 四,基于UDP的网络编程 1. DatagramSocket:收发

    2024年04月29日
    浏览(27)
  • 【Java 基础篇】Java网络编程实战:P2P文件共享详解

    Java网络编程是现代软件开发中不可或缺的一部分,因为它允许不同计算机之间的数据传输和通信。在本篇博客中,我们将深入探讨Java中的P2P文件共享,包括什么是P2P文件共享、如何实现它以及一些相关的重要概念。 P2P(Peer-to-Peer)文件共享是一种分布式计算模型,其中每个

    2024年02月07日
    浏览(27)
  • Linux高性能服务器编程 学习笔记 第五章 Linux网络编程基础API

    我们将从以下3方面讨论Linux网络API: 1.socket地址API。socket最开始的含义是一个IP地址和端口对(ip,port),它唯一表示了使用TCP通信的一端,本书称其为socket地址。 2.socket基础API。socket的主要API都定义在sys/socket.h头文件中,包括创建socket、命名socket、监听socket、接受连接、发

    2024年02月07日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包