【JavaSE】Java基础语法(四十五):TCP UDP 全解

简介: 1. TCP发送数据Java中的TCP通信Java对基于TCP协议的的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信。Java为客户端提供了Socket类,为服务器端提供了ServerSocket类

1. TCP发送数据

  • Java对基于TCP协议的的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信。
  • Java为客户端提供了Socket类,为服务器端提供了ServerSocket类

ab66bd537e58482188832fb39bf9fcfa.png

相关方法

be32e43d27a04943b0960ef1fb46571d.png

  • 示例代码
public class ClientDemo {
  public static void main(String[] args) throws IOException {
    //创建客户端的Socket对象(Socket)
    //Socket(String host, int port) 创建流套接字并将其连接到指定主机上的指定端口号
    Socket s = new Socket("127.0.0.1",10000);
    //获取输出流,写数据
    //OutputStream getOutputStream() 返回此套接字的输出流
    OutputStream os = s.getOutputStream();
    os.write("hello,tcp,我来了".getBytes());
    //释放资源
    s.close();
  }
}

2. TCP接收数据【应用】

  • 构造方法: 创建绑定到指定端口的服务器套接字
ServletSocket(int port)


  • 相关方法:监听要连接到此的套接字并接受它
Socket accept()


注意事项


accept方法是阻塞的,作用就是等待客户端连接

客户端创建对象并连接服务器,此时是通过三次握手协议,保证跟服务器之间的连接

针对客户端来讲,是往外写的,所以是输出流

针对服务器来讲,是往里读的,所以是输入流

read方法也是阻塞的

客户端在关流的时候,还多了一个往服务器写结束标记的动作

最后一步断开连接,通过四次挥手协议保证连接终止

  • 三次握手
  • 四次挥手

3. TCP程序练习

案例需求

客户端:发送数据,接受服务器反馈

服务器:收到消息后给出反馈

案例分析

客户端创建对象,使用输出流输出数据

服务端创建对象,使用输入流接受数据

服务端使用输出流给出反馈数据

客户端使用输入流接受反馈数据

代码实现

// 客户端
public class ClientDemo {
  public static void main(String[] args) throws IOException {
    Socket socket = new Socket("127.0.0.1",10000);
    OutputStream os = socket.getOutputStream();
    os.write("hello".getBytes());
    // os.close();如果在这里关流,会导致整个socket都无法使用
    socket.shutdownOutput();//仅仅关闭输出流.并写一个结束标记,对socket没有任何
    影响
    BufferedReader br = new BufferedReader(new
    InputStreamReader(socket.getInputStream()));
    String line;
    while((line = br.readLine())!=null){
      System.out.println(line);
    }
    br.close();
    os.close();
    socket.close();
  }
}
// 服务器
public class ServerDemo {
  public static void main(String[] args) throws IOException {
    ServerSocket ss = new ServerSocket(10000);
    Socket accept = ss.accept();
    InputStream is = accept.getInputStream();
    int b;
    while((b = is.read())!=-1){
      System.out.println((char) b);
    }
    System.out.println("看看我执行了吗?");
    BufferedWriter bw = new BufferedWriter(new
    OutputStreamWriter(accept.getOutputStream()));
    bw.write("你谁啊?");
    bw.newLine();
    bw.flush();
    bw.close();
    is.close();
    accept.close();
    ss.close();
  }
}

4. TCP程序文件上传练习【应用】

案例需求

客户端:数据来自于本地文件,接收服务器反馈

服务器:接收到的数据写入本地文件,给出反馈

案例分析

- 创建客户端对象,创建输入流对象指向文件,每读一次数据就给服务器输出一次数据,输出

结束后使用shutdownOutput()方法告知服务端传输结束

- 创建服务器对象,创建输出流对象指向文件,每接受一次数据就使用输出流输出到文件中,

传输结束后。使用输出流给客户端反馈信息

- 客户端接受服务端的回馈信息

相关方法

6bf3938a584c4896b1ec46e65e9a6e60.png

代码实现

// 客户端
public class ClientDemo {
  public static void main(String[] args) throws IOException {
    Socket socket = new Socket("127.0.0.1",10000);
    //是本地的流,用来读取本地文件的.
    BufferedInputStream bis = new BufferedInputStream(new
    FileInputStream("socketmodule\\ClientDir\\1.jpg"));
    //写到服务器 --- 网络中的流
    OutputStream os = socket.getOutputStream();
    BufferedOutputStream bos = new BufferedOutputStream(os);
    int b;
    while((b = bis.read())!=-1){
      bos.write(b);//通过网络写到服务器中
    }
    bos.flush();
    //给服务器一个结束标记,告诉服务器文件已经传输完毕
    socket.shutdownOutput();
    BufferedReader br = new BufferedReader(new
    InputStreamReader(socket.getInputStream()));
    String line;
    while((line = br.readLine()) !=null){
      System.out.println(line);
    }
    bis.close();
    socket.close();
  }
}
// 服务器
public class ServerDemo {
  public static void main(String[] args) throws IOException {
    ServerSocket ss = new ServerSocket(10000);
    Socket accept = ss.accept();
    //网络中的流,从客户端读取数据的
    BufferedInputStream bis = new
    BufferedInputStream(accept.getInputStream());
    //本地的IO流,把数据写到本地中,实现永久化存储
    BufferedOutputStream bos = new BufferedOutputStream(new
    FileOutputStream("socketmodule\\ServerDir\\copy.jpg"));
    int b;
    while((b = bis.read()) !=-1){
      bos.write(b);
    }
    BufferedWriter bw = new BufferedWriter(new
    OutputStreamWriter(accept.getOutputStream()));
    bw.write("上传成功");
    bw.newLine();
    bw.flush();
    bos.close();
    accept.close();
    ss.close();
  }
}

5. UDP发送数据

  • Java中的UDP通信
  • UDP协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket对象,但是这两个
    Socket只是发送,接收数据的对象,因此对于基于UDP协议的通信双方而言,没有所谓的客
    户端和服务器的概念
  • Java提供了DatagramSocket类作为基于UDP协议的Socket
  • 构造方法

484e31de366743faa5a4459193d76356.png

相关方法

  • 发送数据的步骤
    - 创建发送端的Socket对象(DatagramSocket)
    - 创建数据,并把数据打包
    - 调用DatagramSocket对象的方法发送数据
    - 关闭发送端

代码演示

public class SendDemo {
  public static void main(String[] args) throws IOException {
    //创建发送端的Socket对象(DatagramSocket)
    // DatagramSocket() 构造数据报套接字并将其绑定到本地主机上的任何可用端口
    DatagramSocket ds = new DatagramSocket();
    //创建数据,并把数据打包
    //DatagramPacket(byte[] buf, int length, InetAddress address, int port)
    //构造一个数据包,发送长度为 length的数据包到指定主机上的指定端口号。
    byte[] bys = "hello,udp,我来了".getBytes();
    DatagramPacket dp = new
    DatagramPacket(bys,bys.length,InetAddress.getByName("127.0.0.1"),10086);
    //调用DatagramSocket对象的方法发送数据
    //void send(DatagramPacket p) 从此套接字发送数据报包
    ds.send(dp);
    //关闭发送端
    //void close() 关闭此数据报套接字
    ds.close();
  }
}

6. UDP接收数据【应用】

  • 接收数据的步骤
  • 创建接收端的Socket对象(DatagramSocket)
  • 创建一个数据包,用于接收数据
  • 调用DatagramSocket对象的方法接收数据
  • 解析数据包,并把数据在控制台显示
  • 关闭接收端

构造方法

2a6d7ab624524099924d49fcb0c4cbcb.png

相关方法

f6bcd476025842ebba585381805a0c17.png示例代码

public class ReceiveDemo {
  public static void main(String[] args) throws IOException {
    //创建接收端的Socket对象(DatagramSocket)
    DatagramSocket ds = new DatagramSocket(12345);
    //创建一个数据包,用于接收数据
    byte[] bys = new byte[1024];
    DatagramPacket dp = new DatagramPacket(bys, bys.length);
    //调用DatagramSocket对象的方法接收数据
    ds.receive(dp);
    //解析数据包,并把数据在控制台显示
    System.out.println("数据是:" + new String(dp.getData(), 0,
    dp.getLength()));
    }
  }
}

7. UDP通信程序练习【应用】

  • 案例需求
  • UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束
  • UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收

代码实现

/*
  UDP发送数据:
  数据来自于键盘录入,直到输入的数据是886,发送数据结束
*/
public class SendDemo {
  public static void main(String[] args) throws IOException {
    //创建发送端的Socket对象(DatagramSocket)
    DatagramSocket ds = new DatagramSocket();
    //键盘录入数据
    Scanner sc = new Scanner(System.in);
    while (true) {
      String s = sc.nextLine();
      //输入的数据是886,发送数据结束
      if ("886".equals(s)) {
        break;
      }
      //创建数据,并把数据打包
      byte[] bys = s.getBytes();
      DatagramPacket dp = new DatagramPacket(bys, bys.length,
      InetAddress.getByName("192.168.1.66"), 12345);
      //调用DatagramSocket对象的方法发送数据
      ds.send(dp);
    }
    //关闭发送端
    ds.close();
  }
}


/*
  UDP接收数据:
  因为接收端不知道发送端什么时候停止发送,故采用死循环接收
*/
public class ReceiveDemo {
  public static void main(String[] args) throws IOException {
    //创建接收端的Socket对象(DatagramSocket)
    DatagramSocket ds = new DatagramSocket(12345);
    while (true) {
      //创建一个数据包,用于接收数据
      byte[] bys = new byte[1024];
      DatagramPacket dp = new DatagramPacket(bys, bys.length);
      //调用DatagramSocket对象的方法接收数据
      ds.receive(dp);
      //解析数据包,并把数据在控制台显示
      System.out.println("数据是:" + new String(dp.getData(), 0,
      dp.getLength()));
    }
    //关闭接收端
    // ds.close();
  }
}

8. UDP三种通讯方式

  • 单播
    单播用于两个主机之间的端对端通信
  • 组播
    组播用于对一组特定的主机进行通信
  • 广播
    广播用于一个主机对整个局域网上所有主机上的数据通信

 

相关文章
|
5月前
|
Java
Java基础语法与面向对象
重载(Overload)指同一类中方法名相同、参数列表不同,与返回值无关;重写(Override)指子类重新实现父类方法,方法名和参数列表必须相同,返回类型兼容。重载发生在同类,重写发生在继承关系中。
186 1
|
5月前
|
网络协议 安全 网络安全
什么是TCP/UDP/HTTP?它们如何影响你的内网穿透体验?
数据的传输离不开各种协议,它们就像现实世界中的交通规则,规定了数据如何打包、寻址、传输和接收。对于使用内网穿透的用户来说,理解TCP、UDP和HTTP这些基础协议的特点,能帮助你更好地理解其性能表现,并选择最适合的配置方案。
|
5月前
|
存储 SQL NoSQL
Redis-常用语法以及java互联实践案例
本文详细介绍了Redis的数据结构、常用命令及其Java客户端的使用,涵盖String、Hash、List、Set、SortedSet等数据类型及操作,同时提供了Jedis和Spring Boot Data Redis的实战示例,帮助开发者快速掌握Redis在实际项目中的应用。
419 1
Redis-常用语法以及java互联实践案例
|
6月前
|
算法 Java 测试技术
零基础学 Java: 从语法入门到企业级项目实战的详细学习路线解析
本文为零基础学习者提供完整的Java学习路线,涵盖语法基础、面向对象编程、数据结构与算法、多线程、JVM原理、Spring框架、Spring Boot及项目实战,助你从入门到进阶,系统掌握Java编程技能,提升实战开发能力。
414 0
|
6月前
|
存储 Java 容器
Java基本语法详解
本文深入讲解了Java编程的基础语法,涵盖数据类型、运算符、控制结构及数组等核心内容,帮助初学者构建坚实的编程基础。
|
7月前
|
Java 数据库连接 数据库
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
本文全面总结了Java核心知识点,涵盖基础语法、面向对象、集合框架、并发编程、网络编程及主流框架如Spring生态、MyBatis等,结合JVM原理与性能优化技巧,并通过一个学生信息管理系统的实战案例,帮助你快速掌握Java开发技能,适合Java学习与面试准备。
355 2
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
|
7月前
|
网络协议 安全 网络安全
详细阐述 TCP、UDP、ICMPv4 和 ICMPv6 协议-以及防火墙端口原理优雅草卓伊凡
详细阐述 TCP、UDP、ICMPv4 和 ICMPv6 协议-以及防火墙端口原理优雅草卓伊凡
589 2
|
7月前
|
存储 安全 Java
从基础语法到实战应用的 Java 入门必备知识全解析
本文介绍了Java入门必备知识,涵盖开发环境搭建、基础语法、面向对象编程、集合框架、异常处理、多线程和IO流等内容,结合实例帮助新手快速掌握Java核心概念与应用技巧。
178 0
|
存储 安全 Java
Java8语法最佳实践-什么是对象(下)
计算机革命起源机器。编程语言就像是那台机器。它不仅是我们思维放大的工具与另一种表达媒介,更像是我们思想的一部分。语言的灵感来自其他形式的表达,如写作,绘画,雕塑,动画和电影制作。编程语言就是创建应用程序的思想结构。
198 0
|
存储 算法 Java
Java8语法最佳实践-什么是对象(上)
计算机革命起源机器。编程语言就像是那台机器。它不仅是我们思维放大的工具与另一种表达媒介,更像是我们思想的一部分。语言的灵感来自其他形式的表达,如写作,绘画,雕塑,动画和电影制作。编程语言就是创建应用程序的思想结构。
434 0
Java8语法最佳实践-什么是对象(上)