Java TCP网络通信协议详细讲解

作者:Array_new 时间:2022-09-26 09:04:22 

TCP与UDP都属于TCP/IP协议

TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。 一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂, 只简单的描述下这三次对话的简单过程:

1)主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;

2)主机B向主机A发送同意连接和要求同步 (同步就是两台主机一个在发送,一个在接收,协调工作)的数据包 :“可以,你什么时候发?”,这是第二次对话;

3)主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”, 这是第三次对话。

三次“对话”的目的是使数据包的发送和接收同步, 经过三次“对话”之后,主机A才向主机B正式发送数据。

TCP的三次握手过程保证了传输的安全性,同时会确认对方是否接受到信息

断开的时候进行四次

UDP(User Data Protocol,用户数据报协议)是一个非连接的协议,传输数据之前源端和终端不建立连接, 当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。 在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、 计算机的能力和传输带宽的限制; 在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。

由于不需要像TCP那样的握手过程,使得UDP的传输速度非常快捷,但他不保证传输的安全性,也不确认对方是否接收到信息

实现代码:

//向指定ip发送信息
public static void main(String[] args) throws Exception{
   Socket s=new Socket(InetAddress.getByName(InetAddress.getLocalHost().getHostAddress()),10000);
   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
   //封装输出流对象
   BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
   String line;
   while (true) {
       if ((line=br.readLine())!=null){
           if("1024".equals(line)) {
               bw.write(line);
               bw.newLine();
               break;
           }
           bw.write(line);
           bw.newLine();
       }
       bw.flush();
       //获取输出流对象
   }
   //释放资源
   s.close();
}
//接收发送到本机的信息
ServerSocket socket=new ServerSocket(10000);
Socket accept = socket.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(accept.getInputStream()));
String line;
while ((line=br.readLine())!=null){
   System.out.println(line);
}

要让俩台进行互通就可以实现了,让他们运行到一起可以使用线程进行封装。

UDP使用的是

//创建发送端的Socket对象(DatagramSocket)
//创建数据,并把数据打包
//DatagramPacket(byte[] buf, int length, InetAddress address, int port)
//构造一个数据包,发送长度为 length的数据包到指定主机上的指定端口号。

使用UDP需要将ip地址固定成ipconfig所显示的ip网关等内容

Java TCP网络通信协议详细讲解

DatagramSocket ds = new DatagramSocket();
byte[] bys = "hello,udp,我来了".getBytes();
       DatagramPacket dp = new DatagramPacket(bys,bys.length,  InetAddress.getByName("10.102.13.18"),10086);
       //调用DatagramSocket对象的方法发送数据
       //void send(DatagramPacket p) 从此套接字发送数据报包
       ds.send(dp);
       System.out.println("已发送:"+new String(dp.getData(),0,dp.getLength()));
       //关闭发送端
       //void close() 关闭此数据报套接字
       ds.close();
DatagramSocket ds = new DatagramSocket(10086);
while (true) {
   //创建一个数据包,用于接收数据
   byte[] bys = new byte[1024];
   DatagramPacket dp = new DatagramPacket(bys, bys.length);
   //调用DatagramSocket对象的方法接收数据
   ds.receive(dp);
   System.out.println("-----");
   //解析数据包,并把数据在控制台显示
   System.out.println("数据是:" + new String(dp.getData(), 0, dp.getLength()));
}

我们同样使用DatagramSocket 方法进行接收数据

来源:https://blog.csdn.net/Array_new/article/details/126797463

标签:Java,TCP,协议,网络通信
0
投稿

猜你喜欢

  • 使用Logback日志保存到相对路径的操作

    2021-10-11 16:42:30
  • IntelliJ IDEA中properties文件显示乱码问题的解决办法

    2021-09-08 04:59:03
  • Android实现房贷计算器

    2022-11-23 17:58:56
  • Java计时器StopWatch实现方法代码实例

    2021-07-25 13:43:42
  • 深入剖析Java中的各种异常处理方式

    2022-05-29 20:20:24
  • Java 十大排序算法之希尔排序刨析

    2021-11-16 09:27:31
  • java FastJson的简单用法

    2022-07-07 23:51:47
  • Android提醒微技巧你真的了解Dialog、Toast和Snackbar吗

    2023-03-08 14:15:44
  • C#中DateTime日期类型格式化显示方法汇总

    2021-07-20 15:52:30
  • springcloud初体验(真香)

    2022-12-08 06:33:44
  • Android startService的使用与Service生命周期案例详解

    2021-07-14 01:51:24
  • Java编程基本概念

    2023-09-07 07:15:50
  • Spring Boot 搭建 ELK正确看日志的配置流程

    2022-08-28 17:13:46
  • 详解Android中Intent传递对象给Activity的方法

    2021-06-30 12:49:37
  • Android开发中如何去掉app标题栏的实现

    2023-07-25 00:38:27
  • 探讨C#中Dispose方法与Close方法的区别详解

    2023-01-24 03:59:55
  • Java设计模式之原型设计示例详解

    2023-08-04 04:53:35
  • MyBatis源码浅析(一)开篇

    2022-09-28 03:28:24
  • MyBatis中resultType和parameterType和resultMap使用总结

    2023-04-01 05:43:42
  • 常见的java面试题

    2023-11-26 18:03:44
  • asp之家 软件编程 m.aspxhome.com