【Java网络编程】TCP通信(Socket 与 ServerSocket)和UDP通信的三种数据传输方式

目录

1、TCP通信

1.1、Socket 和 ServerSocket

1.3、TCP通信示例

2、UDP的三种通信(数据传输)方式

1、TCP通信

TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象

        通信之前要保证连接已经建立(注意TCP是一定要建立连接的)

        TCP是通过Socket产生I0流来进行网络通信的,所以发送端和接收端的两个流的方向是不一样的,比如客户端和服务器进行通信(通信前要确保建立了连接),然后客户端向服务器发送了“你好帅”,这一次发送数据的过程,它们流的方向是不一样的,针对客户端来说,它是往外发所以用的是输出流,而针对服务器来说,它是接收数据所以用的是输入流。

1.1、Socket 和 ServerSocket

        socket可以使一个应用从网络中读取和写入数据,不同计算机上的两个应用可以通过连接发送和接受字节流,当发送消息时,你需要知道对方的ip和端口,在java中,socket指的是java.net.Socket类。

        一旦成功创建一个Socket类的实例,可以用它来发送和接收字节流,发送时调用getOutputStream方法获取一个java.io.OutputStream对象,接收远程对象发送来的信息可以调用getInputStream方法来返回一个java.io.InputStream对象。

        Socket类代表一个客户端套接字,即任何时候连接到一个远程服务器应用时构建所需的socket。现在,要实现一个服务器应用,需要不同的做法。服务器需随时待命,因为不知道客户端什么时候会发来请求,此时,我们需要使用ServerSocket,对应的是java.net.ServerSocket类。 
  ServerSocket与Socket不同,ServerSocket是等待客户端的请求,一旦获得一个连接请求,就创建一个Socket示例来与客户端进行通信。 

1.3、TCP通信示例

(1)写TCP通信的步骤:

客户端:

        创建客户端的Socket对象(Socket)与指定服务端连接:Socket(string host,int port)--host为服务器ip地址,port为端口

获取输出流,写数据:OutputStream getoutputstream()

释放资源:void close()

服务器:

创建服务器端的Socket对象(ServerSocket):Serversocket(int port)

监听客户端连接,返回一个Socket对象:Socket accept()

获取输入流,读数据,并把数据显示在控制台:InputStream getInputStream()

释放资源:void close()

示例:

提示:在客户端创建了Socket对象的同时会去连接服务端,如果连接不上,代码会报错;用来通信的I0流可以关可不关,因为这个流是TCP连接通道里的流,关闭TCP连接通道时这个流自然就关了

客户端代码

public class Client {
    public static void main(String[] args) throws IOException {
        //TCP协议,发送数据
        // 1.创建Socket对象
        // 提示:在创建对象的同时会连接服务端,如果连接不上,代码会报错
        Socket socket = new Socket("127.0.0.1",10001);
        //2.可以从连接通道中获取输出流(OutputStream是引用型数据类型)
        OutputStream os = socket.getOutputStream();
        //写出数据
        //os.write("aaa".getBytes());
        os.write("你好aaa是吧".getBytes());
        //3.释放资源
        os.close();//这里的流可以关可不关,因为这个流是TCP连接通道里的流,关闭TCP连接通道时这个流自然就关了
        socket.close();
    }
}

服务器代码

public class Server {
    public static void main(String[] args) throws IOException {
        //TCP协议,接收数据
        // 1.创建对象ServerSocket
        ServerSocket ss = new ServerSocket(10001);
        //2.监听客户端的链接
        Socket socket = ss.accept();
        //3.从连接通道中获取输入流读取数据
        InputStreamReader br = new InputStreamReader(socket.getInputStream());//这时候才能正确的读取到中文数据
        int b;
        while ((b = br.read()) != -1) {
            System.out.print((char) b);
        }
        //4.释放资源
        br.close();//这里的流可以关可不关,因为这个流是TCP连接通道里的流,关闭TCP连接通道时这个流自然就关了
        ss.close();
    }
}

先运行服务器,再运行客户端

结果结果

(2)客户端不断发送消息

客户端代码

public class Client {
    public static void main(String[] args) throws IOException {
        //客户端:多次发送数据
        //服务器:接收多次接收数据,并打印
        //1.创建Socket对象
        Socket socket = new Socket("127.0.0.1",10001);
        //2.可以从连接通道中获取输出流(OutputStream是引用型数据类型)
        OutputStream os = socket.getOutputStream();
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("输入要发送的数据:");
            String str = sc.nextLine();
            if ("886".equals(str)) {
                break;
            }
            //写出数据
            os.write(str.getBytes());
        }
        //3.释放资源
        socket.close();
    }
}

服务器代码

public class Server {
    public static void main(String[] args) throws IOException {
        //客户端:多次发送数据
        //服务器:接收多次接收数据,并打印
        // 1.创建对象ServerSocket
        ServerSocket ss = new ServerSocket(10001);
        //2.监听客户端的链接
        Socket socket = ss.accept();
        //3.从连接通道中获取输入流读取数据
        InputStreamReader br = new InputStreamReader(socket.getInputStream());
        int b;
        while ((b = br.read()) != -1) {
            System.out.print((char) b);
        }
        //4.释放资源
        ss.close();
    }
}

运行结果:客户端发送886后结束通信

(3)客户端和服务器互发互收消息

//客户端代码
public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1",10001);
        OutputStream os = socket.getOutputStream();
        String str = "你看的到我发信息吗?";
        os.write(str.getBytes());
        //往服务器写出结束标记,shutdownOutput()是关闭输出流,如果不关闭,服务器那边的输入流就不会关闭,就会继续阻塞在读信息的过程中
        socket.shutdownOutput();

        InputStreamReader br = new InputStreamReader(socket.getInputStream());
        int b;
        while ((b = br.read()) != -1) {
            System.out.print((char) b);
        }
        socket.close();
    }
}



//服务器代码
public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(10001);
        Socket socket = ss.accept();
        InputStreamReader br = new InputStreamReader(socket.getInputStream());
        int b;
        while ((b = br.read()) != -1) {
            System.out.print((char) b);
        }
        socket.getOutputStream().write("是的,我看到了。".getBytes());//链式编程
        //写出结束标记,shutdownOutput()是关闭输出流
        socket.shutdownOutput();
        socket.close();
        ss.close();
    }
}

运行结果

服务器端:

客户端:

2、UDP的三种通信(数据传输)方式

Java网络编程中的UDP(User Datagram Protocol)通信编程支持单播、组播和广播这三种方式。

  • 单播(Unicast):单播是指将数据从一个发送者发送到一个接收者的传输方式。在UDP编程中,通过指定目标主机的IP地址和端口号,可以实现单播通信。
  • 组播(Multicast):组播是指将数据从一个发送者发送到一组特定的接收者的传输方式。在UDP编程中,可以使用Java的MulticastSocket类来支持组播通信。
  • 广播(Broadcast):广播是指将数据从一个发送者发送到网络中的所有设备的传输方式。在UDP编程中,可以通过指定广播地址(通常是特定的子网地址)来实现广播通信。

单播:前面的发送接收数据的通信方式就是单播

组播:组播地址:224.0.0.0~239.255.255.255;其中224.0.0.0~224.0.0.255为预留的组播地址

广播:广播地址:255.255.255.255

UDP组播示例:

//发送端代码
public class SendMessageDemo {
    public static void main(String[] args) throws IOException {
        //组播发送端代码
        // 创建MulticastSocket对象
        MulticastSocket ms = new MulticastSocket();
        String str = "你好,你好!";
        byte[] bytes = str.getBytes();
        InetAddress address = InetAddress.getByName("224.0.0.2");//这里设置的ip为组播地址
        int port = 10000;
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length,address,port);
        //调用MulticastSocket发送数据方法发送数据
        ms.send(dp);
        //释放资源
        ms.close();
    }
}



//接收端代码
public class ReceiveMessageDemo1 {
    public static void main(String[] args) throws IOException {
        //1.创建MulticastSocket对象,并且设置端口为10000
        MulticastSocket ms = new MulticastSocket(10000);
        //2.将将当前本机,添加到224.0.0.1的这一组当中
        InetAddress address = InetAddress.getByName("224.0.0.2");
        ms.joinGroup(address);

        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
        //接收数据包
        ms.receive(dp);
        //3.解析数据包
        byte[] data = dp.getData();//获取数据包dp中的数据
        int len = dp.getLength();//获取这次收到了多少个字节的数据
        String str = new String(data,0,len);
        //因为字节数组data的长度是1024,太大了,所以要用到这次收到了多少个字节的数据个数len来决定把字节数组data中的多少数据转换成字符串
        String ip = dp.getAddress().getHostAddress();//ip
        String name = dp.getAddress().getHostName();//主机名

        System.out.println("ip为:" + ip + ",主机名为:" + name + "的人,发送了数据:" + str);
        //释放资源
        ms.close();
    }
}

要想运行并验证这个示例,修要允许运行多个发送端,步骤如下:

完成这些操作后,多运行几个接收端就可以了

发送端运行结果

接收端1显示结果

接收端2显示结果

UDP广播示例:

发送端把目的主机的IP设置为:255.255.255.255,这就是广播了

public class SendMessageDemo {
    public static void main(String[] args) throws IOException {
        /*
        按照下面的要求实现程序
        UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束
        UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收
         */
        //1.创建对象DatagramSocket的对象
        DatagramSocket ds = new DatagramSocket();
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请输入你想说的话:");
            String str = sc.next();
            byte[] bytes = str.getBytes();
            //InetAddress address = InetAddress.getByName("127.0.0.1");//设置目标主机的IP为:127.0.0.1,这是单播方式
            InetAddress address = InetAddress.getByName("255.255.255.255");//设置目标主机的IP为:255.255.255.255,这是广播方式
            int port = 10086;//设发送到目标主机的10086端口
            //2.打包数据
            DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);
            //3.发送数据
            ds.send(dp);
            if ("886".equals(str)) {//如果输入的数据是886,发送数据结束
                break;
            }
        }
        //4.释放资源
        ds.close();
    }
}

推荐:

【Java网络编程】网络编程概述、UDP通信(DatagramPacket 与 DatagramSocket)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/137928825?spm=1001.2014.3001.5501

【java多线程】线程池 ThreadPoolExecutor类和Executors工厂类以及线程池的最优大小_threadpool 线程池工厂类-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/137673188?spm=1001.2014.3001.5501

【Spring】依赖注入(DI)时常用的注解@Autowired和@Value-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/137784706?spm=1001.2014.3001.5501

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/580655.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【06】JAVASE-数组讲解【从零开始学JAVA】

Java零基础系列课程-JavaSE基础篇 Lecture:波哥 Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机,Java 仍是企业和开发人员的首选开发平台。…

从业务经营到企业战略,构建制药企业数字化应用新能力

我国医药的消费正处在一个高速增长的阶段,人口增长、老龄化加剧、经济总体增长、人均消费增长、农村收入提高,这五大因素是医药市场蓬勃发展的动力。在这五大因素的驱动下,我国的医药市场需求将会在未来相当长的时间内保持高速增长。从多个环…

神经网络:手写数字图像识别

一、导入相关库函数 import matplotlib.pyplot as plt import tensorflow as tf import keras import numpy as np 二、载入mnist数据集 使用keras.中的mnist数据集 (train_images, train_labels), (test_images, test_labels)\ keras.datasets.mnist.load_data() 三、测…

在微信上卖化妆品怎样发圈(学会写朋友圈段子卖货很简单)

大家好,我是只说人话,不讲概念,专给创业者们开思维脑洞 今天咱们要分享的内容比较有趣,教你如何写段子故事在朋友圈里做促销活动。 首先我们来看一个硬蹭明星热点的朋友圈案例。发朋友圈的是一位做装修的,在明星结婚的…

Python AI库 Pandas的常见操作的扩展知识

Python AI库 Pandas的常见操作的扩展知识 本文默认读者具备以下技能: 熟悉python基础知识,vscode或其它编辑工具 熟悉表格文件的基本操作 具备自主扩展学习能力 前文中对Pandas的数据结构以及基础操作做了介绍,本文中会在前文的基础上,对常见的操作进…

Python自动化系统6

元素的特征:根据页面设计规则,有些特征是唯一 开发遵循了这个规则 id :类比身份证号―仅限于当前页面 username username 注意:如果id 不是固定的话,就不能使用来定位! xpath: 1、绝对路径:/html/body/div/div/div[1]/a/b --根节点&#xff…

2024公共管理与社会发展国际学术会议(ICPMSD 2024)

2024公共管理与社会发展国际学术会议(ICPMSD 2024) 2024 International Conference on Public Management and Social Development 一、【会议简介】 2024公共管理与社会发展国际学术会议,将汇集全球顶尖学者,展开一场学术盛宴。 在这次会议上&#xff0…

【UE C++】设置游戏模式

问题 我们都知道如何使用蓝图创建一个游戏模式并且在这个游戏模式蓝图中去设置“默认pawn类”、“HUD类”、“玩家控制器类”、“游戏状态类”、“玩家状态类”、“旁观者类”。那么如何使用C完成该操作呢? 步骤 1. 首先创建“GameMode”、“GameState”、“HUD”…

如何用二维码实现现代仓库管理?

随着科技的进步,二维码技术逐渐应用与各个领域,其中在仓库管理中的应用也日益广泛。 那话不多说,我们直接来看如何用二维码实现现代仓库管理 简道云仓库管理模板,可以点击安装配合阅读:https://www.jiandaoyun.com 二…

Oracle集群ORA-03113:end-of-file on communication channel

一、问题场景描述 今天Oracle集群要更新各数据库的数据,折腾的启动不了了: --》数据量比较大,数据泵方式导出的dmp文件 准备导入集群 --》由于之前的生产数据库数据比较少,需要增大表空间。 --》于是在sqlplus命令窗口&#xff0c…

暗区突围端游海外版|暗区突围免费加速器有吗 免费加速器推荐

游戏中玩家可以创建男性或女性角色,可以通过选择脸型、发型、发色对人物形象进行调整;在进入游戏后,除人物性别不能修改,脸型、发型、发色都可以进行调整。除此之外可以在衣橱中对角色的上衣、手套、裤子、鞋子、帽子进行更换。游…

Leetcode—1017. 负二进制转换【中等】(string列表初始化、反向迭代器)

2024每日刷题(120) Leetcode—1017. 负二进制转换 实现代码 class Solution { public:string baseNeg2(int n) {string ans;while(n ! 0) {ans to_string(n & 1);n -(n >> 1);}return ans.empty() ? "0": string{ans.rbegin(),…

R语言详解二

一&#xff0c;列表详解 创建一个列表 > myList<-list(id2,name"张三",age20) > myList $id [1] 2$name [1] "张三"$age [1] 20 获取第一个元素 > myList[[2]] [1] "张三" 获取第一个子列表 > myList[2] $name [1] "张…

百度 测试|测试开发 面试真题|面经 汇总

百度测开 开发测试工程师 提前批一二三面面经 事业群&#xff1a;MEG base&#xff1a;北京 一面&#xff1a;2023.8.12 时长&#xff1a;50min 自我介绍 个人项目&#xff0c;我的项目是围绕着学校课程的项目来的&#xff0c;面试官就让我介绍这门课讲了些什么 &#xff…

信息化项目总体计划书(Word)

项目开发计划包括项目描述、项目组织、成本预算、人力资源估算、设备资源计划、沟通计划、采购计划、风险计划、项目过程定义及项目的进度安排和里程碑、质量计划、数据管理计划、度量和分析计划、监控计划和培训计划等。 软件全套精华资料包清单部分文件列表&#xff1a; 工作…

03-JAVA设计模式-模板方法模式

模板方法模式 什么是模板方法 模板方法模式&#xff08;Template Method Pattern&#xff09;在Java中是一种行为型设计模式&#xff0c;它定义了一个操作中的算法骨架&#xff0c;而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某…

7-34 通讯录的录入与显示

题目链接&#xff1a;7-34 通讯录的录入与显示 一. 题目 1. 题目 2. 输入输出格式 3. 输入输出样例 4. 限制 二、代码 1. 代码实现 #include <iostream> using namespace std;// 单条记录的信息 class infoContext { private:char name[11];char date[11];char man;c…

七、OSPF特殊区域及其特性

目录 OSPF区域分类 hello报文中option字段 1.末节区域&#xff08;Stub区域&#xff09; 2.完全末节区域&#xff08;Toally Stub区域&#xff09; 3.七类LSA 4.非完全末节区域&#xff08;NSSA区域&#xff09; 5.完全非完全末节区域&#xff08;Toally NSSA区域&#…

计算机服务器中了helper勒索病毒怎么办,helper勒索病毒解密流程工具

在网络技术飞速发展的今天&#xff0c;越来越多的企业离不开网络&#xff0c;网络可以为企业带来更高的生产效率&#xff0c;提供更多的便捷服务&#xff0c;但网络是一把双刃剑&#xff0c;在为人们提供便利的同时&#xff0c;也为企业的数据安全带来严重威胁。近日&#xff0…

微服务架构与SOA架构

SOA架构和微服务架构的区别 SOA关注的是服务重用&#xff0c;微服务在关注服务重用的同时&#xff0c;也同时关注快速交付&#xff1b; 微服务架构 80%的SOA服务架构思想 100%的组件化架构思想 80%的领域建模思想 首先SOA和微服务架构一个层面的东西&#xff0c;而对于ESB和…