JaveEE初阶--网络编程套接字

目录

一、引言

二、网络编程基本概念

2.1 什么是网络编程?

2.2 基本知识

三、Socket套接字

3.1 概念

3.2 分类 

  1.流套接字:使用传输层TCP协议

  2. 数据报套接字:使用传输层UDP协议

  3.原始套接字:用于自定义传输层协议

四、UDP数据报套接字编程

  一、API介绍

五、TCP流套接字编程

六、服务器引入多线程

七、服务器引入线程池


一、引言

  本篇文章将继续讨论网络编程的知识,重点介绍网络编程的基本概念,以及Socket套接字的相关信息。

二、网络编程基本概念

2.1 什么是网络编程?

  网络编程指网络上的主机,通过不同的进程,以编程的方式实现网络通信。此处,我们只需要保证不同的进程即可,即使是同一台主机上的不同进程也能进行网络编程。

2.2 基本知识

  发送端:数据的发送方进程,就是发送端。网络通信中的源主机。

  接收端:数据的接收方进程,就是接收端。网络通信中的目的主机。

  收发端:发送端和接收端两端,就称为收发端。

  请求与响应请求,即对对方发送一个自己的需求。响应:即对对方的请求提供一个回答。

  服务端:提供服务的一方进程称为服务端,可以提供对外服务。

  客户端:获取服务的一方进程,称为客户端。

  常见的客户端与服务端模型:

1. 客户端先发送请求到服务器。

2.服务器根据请求数据,执行相应的业务处理。

3.服务器返回响应,发送业务处理结果。

4.客户端根据处理结果,展示处理结果。

三、Socket套接字

3.1 概念

Socket套接字,是由系统提供用于网络通信的技术,是基于TCP/IP协议的网络通信的基本操作单元。基于Socket套接字的网络程序开发就是网络通信。

3.2 分类 

  1.流套接字:使用传输层TCP协议

对于字节流来说,传输数据是基于IO流,流式数据的特征就是在IO流没有关闭的情况下,是无边界的数据,可以多次发送,也可以分开多次接收。

  2. 数据报套接字:使用传输层UDP协议

传输的数据是一块一块的,发送一块数据假如100个字节,必须一次发送,接收也必须一次接收100个字节,而不能分成100次,每次接收一个字节。

  3.原始套接字:用于自定义传输层协议

原始层套接字用于自定义传输层协议,用于读写内核没有处理的IP协议数据。这个套接字简单了解即可。

Java流套接字通信模型:

Socket编程注意事项:

1. 客户端和服务端:开发时,经常是基于一个主机开启两个进程作为客户端和服务器,但真实场景是不同的主机

2. 注意目的IP和目的端口号,标识了一次数据传输时要发送数据的终点主机和进程

3. Socket编程我们是使用流套接字和数据报套接字,基于传输层的TCP或UDP协议,但应用层协议也需要考虑。

4. 如果一个进程A已经绑定了一个端口,再启动一个进程B绑定该端口,就会报错,这种情况也叫端口被占用。对于Java进程来说,端口被占用的错误信息一般会报:Address already in use。此时我们就需要进行检查,看看哪个进程绑定了这个端口。通过任务管理器中的PID进行查看。

四、UDP数据报套接字编程

  一、API介绍

DatagramSocket构造方法:

用于发送和接收UDP数据报:绑定到本机一个随机端口,若添加参数(int port)就可以绑定到指定端口。

DatagramSocket方法:

方法签名方法说明
void receive(DatagramPacket p)从此套接字接收数据报(会阻塞等待)
void send(DatagramPacket p)从此套接字发送数据报包(不会阻塞等待)

void close()

关闭此数据报套接字

DatagramPacket是UDP Socket发送和接收的数据报。

DatagramPacket构造方法:

方法签名方法说明
DatagramPacket(byte[] buf,int length)构造一个DatagramPacket用来接收数据报,接收的数据保存在字节数组中(buf)中,接收指定的长度(length)
DatagramPacket(byte[] buf,int offset,int length,SocketAddress address)构造一个DatagramPacket用来接收数据报,接收的数据保存在buf中,从offset开始,进行length字节,address指定目的主机和IP

DatagramPacket方法:

方法签名方法说明
inetAddress getAddress()从接收的数据报中,获取发送端主机IP,或从发送的数据报中获取接收端主机IP
int getPort()从接收的数据报中,获取发送端主机的端口号,或从发送的数据报中,获取接收端主机端口号
byte[] getData()获取数据报中的数据

构造UDP发送的数据报时,需要传入SocketAddress,该对象可以使用InetSocketAddress来创建。

InetDSocketAddress构造方法:

方法签名方法说明
InetSocketAddress(InetAddress addr,int port)创建一个Socket地址,包含IP地址和端口号

代码实例:

private DatagramSocket socket = null;

    public UdpEchoServer(int port) throws SocketException {
        socket = new DatagramSocket(port);
    }

    public void start() throws IOException {
        System.out.println("服务器启动!");
        while (true){
            DatagramPacket requestPacket = new DatagramPacket(new byte[4096],40);
            socket.receive(requestPacket);
            // 转为字符串
            String request = new String(requestPacket.getData(),0,requestPacket.getLength());
            // 计算响应
            String response = process(request);
            // 把响应写回给客户端
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),requestPacket.getLength(),requestPacket.getSocketAddress());
            socket.send(responsePacket);
        }
    }

    public String process(String request){
        return request;
    }

    public static void main(String[] args) throws IOException {
        UdpEchoServer echo = new UdpEchoServer(9090);
        echo.start();
    }

五、TCP流套接字编程

ServerSocket

创建一个服务端流套接字Socket,并绑定到指定端口

Socket accept():

void close()

Socket是客户端Socket,或服务端中接收到客⼾端建立连接(accept方法)的请求后,返回的服

务端Socket。
不管是客户端还是服务端Socket,都是双方建立连接以后,保存的对端信息,及用来与对方收发数据的。

六、服务器引入多线程

代码:

public class start {
    public static void main(String[] args) {
        System.out.println("服务器启动!");
        while (true){
            Socket clientSocket = serverSocket.accept();
            Thread t = new Thread(() ->{
               processConnection(clientSocket);
            });
            t.start();
        }
    }
}

七、服务器引入线程池

代码:

public void start(){
        System.out.println("服务器启动!");
        ExecutorService service = Executors.newCachedThreadPool();
        while (true){
            Socket clientSocket = serverPocket.accept();
            service.submit(new Runnable() {
                @Override
                public void run() {
                    processConnection(clientSocket);
                }
            });
        }
    }

八、总结

本篇文章简单介绍了一下Socket套接字中UDP协议和TCP协议的运用,感谢大家观看!

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

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

相关文章

Python爬虫——HTML中Xpath定位

Xpath是一种路径查询语言。利用一个路径表达式从html文档中找到我们需要的数据位置,进而将其写入到本地或者数据库中。 学习Xpath爬虫,我们首先学习一下python中lxml库 关于库 lxml 终端下载Xpath需要用到的模块 pip install lxml 关于HTML 超文本标…

Spring Cloud Alibaba 之 “Sentinel”

从网上下载好sentinel-dashboard-1.6.3.jar,然后执行 java -jar sentinel-dashboard-1.6.3.jar,执行成功之后在浏览器输入localhost:8080,Sentinel的登录名和密码都是sentinel,登陆成功之后看到只有一个首页。 接下来开始整合Spring Cloud Alibaba Sen…

伟测科技再融资11.75亿:增收不增利,毛利率近年来持续下滑

《港湾商业观察》施子夫 王璐 12月9日,上海证券交易所上市审核委员会召开2024年第34次上市审核委员会审议会议,审议上海伟测半导体科技股份有限公司(再融资)(以下简称,伟测科技;688372.SH)事项。 今年8月…

Postman cURL命令导入导出

你是否曾为在Postman和终端之间切换、整理请求而抓狂?其实,Postman支持与cURL命令的无缝互通,通过导入导出,极大提升效率。用好这个功能,分分钟让接口测试更高效! Postman如何快速导入cURL命令?…

MR30分布式 I/O 模块助力 CNC 设备产能飞跃

背景分析 在现代制造业中,CNC 设备扮演着极为关键的角色。然而,CNC 设备在运行过程中也存在着诸多痛点。传统的 CNC 设备往往在控制与通信方面存在局限,其内部的 I/O 系统大多采用集中式架构。这种架构下,一旦需要处理大量的输入输…

《ODIN: A Single Model for 2D and 3D Segmentation》CVPR2024

斯坦福和微软: 代码链接:ODIN: A Single Model For 2D and 3D Perception 论文链接:2401.02416 摘要 这篇论文介绍了ODIN(Omni-Dimensional INstance segmentation),一个能够同时处理2D RGB图像和3D点云…

从视觉到雷达:多模态感知如何引领自动驾驶安全革命

文章目录 摘要引言多模态感知融合的原理与架构感知技术的特点多模态感知融合的目标 数据融合实现示例代码结构与主要组件模型定义 MultimodalFusionModel前向传播(forward 方法)模型细节剖析实践应用 QA环节总结参考资料 摘要 本文探讨了多模态感知技术…

uniapp结合movable-area与movable-view实现拖拽功能

前言 因为公司业务开发需要拖拽功能。 ps&#xff1a;该功能只能针对高度一致的&#xff0c;如果高度不一致需要另外二开 演示 开始 <template><view style"height: 100%;"><movable-area :style"{width: 100%, height: allHeight px}"…

ElasticSearch如何做性能优化?

大家好&#xff0c;我是锋哥。今天分享关于【ElasticSearch如何做性能优化&#xff1f;】面试题。希望对大家有帮助&#xff1b; ElasticSearch如何做性能优化&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Elasticsearch 中&#xff0c;性能优化是…

AI开发: 知识图谱的初识,学会制作知识图谱- Python 机器学习

一、知识图谱的概念 知识图谱是一个通过图结构来表示和组织知识的工具&#xff0c;它将事物、概念和它们之间的关系以图的形式呈现出来&#xff0c;图中的节点代表实体&#xff08;比如人物、地点、事件等&#xff09;&#xff0c;而边代表这些实体之间的各种关系&#xff08;…

软考高级难度排名,哪个科目容易过?

软考高级五个科目&#xff0c;哪个比较好考&#xff1f;今天就来和大家聊一聊~ 一、软考高级科目设置 高级科目包含&#xff1a;信息系统项目管理师、系统分析师、系统架构设计师、网络规划师以及系统规划与管理师5个科目。 1. 信息系统项目管理师 信息系统项目管理师&#…

浅谈网络 | 应用层之云网络隔离GRE/VXLAN

目录 前言GRE 隧道技术VXLANGRE/VXLAN接入云平台 前言 之前提到&#xff0c;为云平台中的租户实现隔离时&#xff0c;常用的策略是基于 VLAN。然而&#xff0c;VLAN 只有 12 位&#xff0c;共支持 4096 个 ID&#xff0c;这在最初设计时看似足够&#xff0c;但随着云计算的快速…

上海交通大学《2024年816自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《上海交通大学816自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2024年真题 Part1&#xff1a;2024年完整版真题 2024年真题

零基础入门 Pyecharts 实用教程:从基础绘图到进阶技巧

简介&#xff1a;本文面向 Python 数据可视化初学者&#xff0c;脚踏实地分享 Pyecharts 库的使用经验。从查看 Pyecharts 版本起步&#xff0c;详细拆解绘制首个图表的全过程&#xff0c;涵盖导入模块、设置坐标轴、渲染 HTML 文件等基础操作&#xff1b;点明链式调用的版本要…

STM32 通过读取看门狗溢出标志检测程序是否发生复位

通过 __HAL_RCC_GET_FLAG 函数&#xff0c;读取看门狗溢出标志检测程序是否发生复位&#xff0c; 目录 一、__HAL_RCC_GET_FLAG 函数二、Stm32CubeMx配置三、代码编写四、运行效果 一、__HAL_RCC_GET_FLAG 函数 HAL库的 __HAL_RCC_GET_FLAG 函数可以获取到程序是否发生过看门狗…

记一次由docker容器使得服务器cpu占满密码和密钥无法访问bug

Bug场景&#xff1a; 前几天在服务器上部署了一个免费影视网站&#xff0c;这个应用需要四个容器&#xff0c;同时之前的建站软件workpress也是使用docker部署的&#xff0c;也使用了三个容器。在使用workpress之前&#xff0c;我将影视软件的容器全部停止。 再使用workpress…

Linx下自动化之路:Redis安装包一键安装脚本实现无网极速部署并注册成服务

目录 简介 安装包下载 安装脚本 服务常用命令 简介 通过一键安装脚本实现 Redis 安装包的无网极速部署&#xff0c;并将其成功注册为系统服务&#xff0c;开机自启。 安装包下载 redis-7.0.8.tar.gzhttp://download.redis.io/releases/redis-7.0.8.tar.gz 安装脚本 修…

开发 UEFI 驱动

服务型驱动的特点&#xff1a; 1&#xff09;在 Image 的入口函数中执行安装&#xff1b; 2&#xff09;服务型驱动不需要驱动特定硬件&#xff0c;可以安装到任意控制器上&#xff1b; 3&#xff09;没有提供卸载函数。 一个设备 / 总线驱动程序在安装时首先要找到对应的硬件…

实现 DataGridView 下拉列表功能(C# WinForms)

本文介绍如何在 WinForms 中使用 DataGridViewComboBoxColumn 实现下拉列表功能&#xff0c;并通过事件响应来处理用户的选择。以下是实现步骤和示例代码。 1. 效果展示 该程序的主要功能是展示如何在 DataGridView 中插入下拉列表&#xff0c;并在选择某一项时触发事件。 2.…

传输层5——TCP可靠传输的实现(重点!!)

TCP协议如何实现可靠传输&#xff1f;确保接收方收到数据&#xff1f; 需要依靠几个结构&#xff1a; 以字节为单位的滑动窗口 这其中包括发送方的发送窗口和接收方的接收窗口 下面的描述&#xff0c;我们指定A为发送端口&#xff0c;B为接收端口 TCP的可靠传输就是靠着滑动窗口…