Socket 简介与 Java Socket 编程示例
Socket(套接字)是网络通信中的一个关键概念,它是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。
一、定义与概念
- 基本概念:Socket可以被视为网络环境中进程间通信的API(应用程序编程接口),也是可以被命名和寻址的通信端点。它是应用程序通过网络协议进行通信的接口,上联应用进程,下联网络协议栈。
- 物理与逻辑层面:在物理层面上,Socket可能并不真实存在,它更多的是一个逻辑上的概念。但在网络编程中,Socket是不可或缺的组成部分。
二、功能与作用
- 数据交换:Socket提供了应用层进程利用网络协议交换数据的机制。通过Socket,不同主机上的应用进程可以互相发送和接收数据。
- 协议封装:Socket是对TCP/IP等网络协议的封装,它隐藏了复杂的网络协议细节,使得网络编程更加简单和直观。
- 类型与连接:Socket一般分为TCP Socket和UDP Socket两种类型。TCP Socket提供面向连接、可靠的数据传输服务;而UDP Socket则提供无连接的数据传输服务。
三、工作原理
- 服务器监听:服务器首先创建一个Socket,并绑定到指定的IP地址和端口上。然后,服务器进入监听状态,等待客户端的连接请求。
- 客户端请求:客户端也创建一个Socket,并尝试连接到服务器的IP地址和端口上。如果连接成功,客户端和服务器之间就建立了一个通信通道。
- 数据传输:建立连接后,客户端和服务器就可以通过Socket发送和接收数据了。在TCP连接中,数据会按照顺序、可靠地传输;而在UDP连接中,数据则可能会丢失或乱序到达。
四、应用场景
- 客户端/服务器架构:在客户端/服务器架构中,Socket被广泛用于实现服务器端和客户端之间的通信。
- 实时数据传输:Socket可用于实现实时数据传输,如视频流、音频流、实时游戏等。
- 分布式系统:在分布式系统中,Socket可以被用于节点之间的消息传递和数据交换。
- Web编程:在Web编程中,Socket可以用于实现WebSocket协议,以提供双向的实时通信。
五、Java Socket编程
Java中的Socket编程是网络编程的基础,它允许两个或多个程序通过网络进行通信。Socket编程在Java中通常涉及两种类型的Socket:ServerSocket和Socket。
5.1 ServerSocket
ServerSocket用于在服务器端监听来自客户端的连接请求。当一个连接被接受时,ServerSocket会返回一个Socket实例,这个实例代表了与客户端的连接,之后服务器端就可以通过这个Socket实例与客户端进行通信了。
创建ServerSocket的基本步骤如下:
- 创建ServerSocket实例:通过调用ServerSocket的构造器,并指定一个端口号(可选地,也可以指定一个IP地址,但通常指定为null,表示监听所有可用的网络接口)。
- 等待连接:通过调用ServerSocket的accept()方法等待客户端的连接。这个方法会阻塞,直到一个连接被建立。
- 通信:一旦accept()方法返回了一个Socket实例,就可以通过这个实例的输入流和输出流与客户端进行通信了。
- 关闭连接:通信结束后,需要关闭Socket和ServerSocket实例以释放资源。
5.2 Socket
Socket是网络通信的端点,它包含了进行网络通信所需的输入流和输出流。一个Socket实例可以是由ServerSocket的accept()方法返回,代表一个客户端连接;也可以是通过调用Socket的构造器创建的,表示主动向服务器发起连接请求的客户端。
创建客户端Socket的基本步骤如下:
- 创建Socket实例:通过调用Socket的构造器,并指定服务器的IP地址和端口号。
- 通信:一旦Socket实例被创建,就可以通过它的输入流和输出流与服务器进行通信了。
- 关闭连接:通信结束后,需要关闭Socket实例以释放资源。
六、示例
package org.example.socket;import org.apache.commons.lang3.time.DateFormatUtils;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;/*** Socket 服务端示例*/
public class SocketServerDemo {public static void main(String[] args) {try {ServerSocket serverSocket = new ServerSocket(8080);while(true) {Socket socket = serverSocket.accept();System.out.println("客户端连接成功!");System.out.println("对方端口号为:" + socket.getPort());//读取客户端写入内容BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));String receiveContent = bufferedReader.readLine();System.out.println("服务端收到客户端信息:" + receiveContent + " 【" + DateFormatUtils.format(new Date(), "yyyyMMdd HH:mm:ss") + "】");System.out.println("3秒后,回复对方。");Thread.sleep(3000);//服务端回复客户端信息BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bufferedWriter.write("你好,亲爱的客户端朋友!\n");bufferedWriter.flush();}} catch (Exception e) {e.printStackTrace();}}
}
package org.example.socket;import org.apache.commons.lang3.time.DateFormatUtils;import java.io.*;
import java.net.Socket;
import java.util.Date;/*** Socket 客户端示例*/
public class SocketClient {public static void main(String[] args) {Socket socket = null;try {socket = new Socket("localhost",8080);BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bufferedWriter.write("你好,尊敬的服务端先生!\n");bufferedWriter.flush();Thread.sleep(3000);BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));String acceptFromServer = bufferedReader.readLine();System.out.println("收到服务端回复:"+acceptFromServer+ " 【"+ DateFormatUtils.format(new Date(),"yyyyMMdd HH:mm:ss") +"】");bufferedReader.close();bufferedWriter.close();} catch (Exception e) {e.printStackTrace();}}
}
先执行服务端 main方法,ServerSocket阻塞;
然后执行客户端 main 方法,服务端与客户端相继输出如下内容:
服务端打印内容:
客户端连接成功!
对方端口号为:40057
服务端收到客户端信息:你好,尊敬的服务端先生! 【20240718 17:12:56】
3秒后,回复对方。
客户端打印内容:
收到服务端回复:你好,亲爱的客户端朋友! 【20240718 17:12:59】
七、总结
Socket是网络通信中的核心组件之一,它提供了应用层进程之间进行数据交换的机制。通过Socket,不同主机上的应用进程可以建立连接并传输数据。无论是客户端/服务器架构、实时数据传输还是分布式系统等领域,Socket都发挥着重要的作用。
以上就是 Socket 简介与 Java Socket 编程示例 全部内容,感谢阅读!
相关文章:
Socket 简介与 Java Socket 编程示例
Socket(套接字)是网络通信中的一个关键概念,它是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。 一、定义与概念 基本概念:Socket可以被视为网络环境中进程间通信的API(应用程序编程接口)&…...
跟着操作,解决iPhone怎么清理内存难题
在如今智能手机功能日益强大的时代,我们使用手机拍照、录制视频、下载应用、存储文件等操作都会占用手机内存。当内存空间不足时,手机运行会变得缓慢,甚至出现卡顿、闪退等现象。因此,定期清理iPhone内存是非常必要的。那么&#…...
React、Vue的password输入框组件,如何关闭自动填充?
有时候我们的表单使用了一个password组件,这时候每次打开新建,都会自动获取浏览器缓存的密码,但是它的上一个input输入框并不是用户名,这时候我们希望我们的表单,每次点开的时候密码是空的,让用户自动输入&…...
HTML+JS+CSS计算练习
可填 题目数量 数字范围 计算符号 题目做完后会弹窗提示正确率、用时 效果图 源代码在图片后面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevic…...
设计模式使用场景实现示例及优缺点(行为型模式——责任链模式)
在一个遥远的森林深处,有一个和谐的动物王国。这个王国里的动物们都有各自的职责,大家相互合作,共同维护着森林的和平与繁荣。 一天,森林里来了一只迷路的小兔子,她焦急地四处张望,不知道该怎么办。于是&am…...
CSS-1_0 CSS和文档流
文章目录 CSS和文档流如何证明这个流的存在呢?流和display番外:inline-block 碎碎念 CSS和文档流 首先什么叫流呢? 通常来说,我们最终看到的网页是HTML文档中定义的各个元素挨个输出的结果,这种一个接一个输出的方式…...
小程序图片下载保存方法,图片源文件保存!
引言 现在很多时候我们在观看到小程序中的图片的时候,想保存图片的原文件格式的话,很多小程序是禁止保存的,即使是让保存的话,很多小程序也会限制不让保存原文件,只让保存一些分辨率很低的,非常模糊的图片…...
新书速览|深入理解Hive:从基础到高阶:视频教学版
《深入理解Hive:从基础到高阶:视频教学版》 本书内容 《深入理解Hive:从基础到高阶:视频教学版》采用“理论实战”的形式编写,通过大量的实例,结合作者多年一线开发实战经验,全面地介绍Hive的使用方法。《深入理解Hiv…...
钡铼Profinet、EtherCAT、Modbus、MQTT、Ethernet/IP、OPC UA分布式IO系统BL20X系列耦合器
BL20X系列耦合器是钡铼技术开发的一款用于分布式I/O系统的设备,专为工业环境下的高速数据传输和远程设备控制而设计,支持多种工业以太网协议,包括Profinet、EtherCAT、Modbus、MQTT、Ethernet/IP和OPC UA等。如果您正在考虑部署BL20X系列耦合…...
Git分支合并以及分支部分合并 提交记录合并
Git分支合并,以及分支部分合并,提交记录合并 最近工作中用到git分支合并的场景,记录一下. 分支整体合并,合并所有记录 仅合并分支部分代码...
IDEA关联数据库
《IDEA破解、配置、使用技巧与实战教程》系列文章目录 第一章 IDEA破解与HelloWorld的实战编写 第二章 IDEA的详细设置 第三章 IDEA的工程与模块管理 第四章 IDEA的常见代码模板的使用 第五章 IDEA中常用的快捷键 第六章 IDEA的断点调试(Debug) 第七章 …...
【Leetcode】14. 最长公共前缀
leetcode原地址:https://leetcode.cn/problems/longest-common-prefix 描述 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 示例 1: 输入:strs [“flower”,“flow”,“flight”…...
【BUG】已解决:zipfile.BadZipFile: File is not a zip file
已解决:zipfile.BadZipFile: File is not a zip file 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,武汉城市开发…...
小白新手搭建个人网盘
小白新手搭建个人网盘 序云服务器ECS重置密码远程连接ECS实例 安装OwnCloud安装Apache服务PHP运行环境NAS挂载挂载验证操作体验 序 阿里云文件存储NAS(Apsara File Storage NAS)是一个可大规模共享访问,弹性扩展的分布式文件系统。本文主要是…...
NineData全面支持PostgreSQL可视化表结构设计
“PostgreSQL 是最像 Oracle 的开源关系型数据库“,也正因为如此,很多企业都青睐 PostgreSQL,拿它当成 Oracle 的替代品。所以毫无疑问,目前 PostgreSQL 在企业中非常常见。 对于直接接触 PostgreSQL 的开发人员而言,…...
从系统层面认识Linux及mysql中的多表查询
为什么计算机起始时间是1970年1月1日 为什么计算机起始时间是1970年1月1日-CSDN博客https://blog.csdn.net/csdn_kou/article/details/81535452 date "%Y-%m-%d %H:%M:%S" 查看日期 sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 在数据层面 CPU不…...
PCB(印制电路板)制造涉及的常规设备
印制电路板(PCB)的制造涉及多种设备和工艺。从设计、制作原型到批量生产,每个阶段都需要不同的专业设备。以下是一些在PCB制造过程中常见的设备: 1. 计算机辅助设计(CAD)软件: - 用于设计PC…...
《Windows API每日一练》10.3 公用对话框
Windows最初发行时的主要目标之一就是提倡一种标准化的用户界面。对于公用菜单 项来说,这一目标实现得很快。几乎所有的软件制造商都采用了Alt-File-Open组合来打开 文件。但是,真正用来打开文件的对话框却经常很不一样。 从Windows 3.1开始,…...
C++中的引用
在C中,我们要学习一个新的概念,叫做引用。引用不是对象,它只是给变量取一个别名。就好比,我们每个人总会右一下外号,或者是小名。当朋友或者家长不管是直接叫你的名字,还是叫你的小名,你都会答应…...
【自学安全防御】三、企业双机热备和带宽管理的综合实验
实验拓扑: 实验任务: 12,对现有网络进行改造升级,将当个防火墙组网改成双机热备的组网形式,做负载分担模式,游客区和DMZ区走FW3,生产区和办公区的流量走FW1 13,办公区上网用户限制流…...
无极与有极电容的区别
无极性电容与有极性电容:差异与应用探索 在电子元件的广阔世界里,电容器无疑是不可或缺的一部分。它们以储存电荷和调节电路中的电压与电流而闻名。然而,电容器并非一概而论,其中最为显著的区别之一就是无极性电容与有极性电容。…...
入坑树莓派(2)——树莓派4B与手机蓝牙通信
入坑树莓派(2)——树莓派4B与手机蓝牙通信 1、引言 在入坑树莓派(1)中已经搞掂了可视化问题。现在继续开展下一步,尝试与手机通信,一开始是想弄wifi连接的,但发现基于wifi的APP比较难弄,为了降低开发的难度,又因为树莓派板子自带蓝牙模块,所以直接选用蓝牙连接手机…...
RocketMQ单结点安装/Dashboard安装
目录 1.安装NameServer 2.安装Broker 3.使用自带工具测试数据发送 4.使用DashBoard进行查看 5.关闭相关设备 前置条件:两台虚拟机CentOS Linux release 7.5.1804(ps:当然也可以都部署在一台机器上) RocketMq属于天生集群。需要同时启动nameServer和Broker进行…...
【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第二篇 Linux系统编程篇-第三十四章 进程基础
i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…...
使用LVS+NGinx+Netty实现数据接入
数据接入 链接参考文档 LVSKeepalived项目 车辆数据上收,TBox通过TCP协议连接到TSP平台 建立连接后进行数据上传。也可借由该连接实现远程控制等操作。 通过搭建 LV—NGinx—Netty实现高并发数据接入 LVS:四层负载均衡(位于内核层&#x…...
云手机结合自主ADB命令接口 提升海外营销效率
现在,跨境电商直播已经成为在线零售的重要渠道,在大环境下,确保直播应用的稳定性和用户体验至关重要。 云手机支持自主ADB命令接口,为电商直播营销提供了技术支持,使得应用开发、测试、优化和运维更加高效。 什么是A…...
【计算机视觉前沿研究 热点 顶会】CVPR 2024中与域适应、分布外目标检测相关的论文
测试时间线性分布外检测 分布外( OOD)检测旨在通过在输入样本显著偏离训练分布(分布中)时触发警报来解决神经网络的过度置信度预测,这表明输出可能不可靠。当前的 OOD 检测方法探索各种线索来识别 OOD 数据࿰…...
首次由国产8K摄像机服务巴黎奥运会8K公用信号
法国巴黎时间16日上午,中央广播电视总台“中国红”8K转播车穿越大半个地球,抵达法兰西体育场,顺利完成与奥林匹克转播公司(OBS)的交接。 (1)“中国红”8K转播车 作为适合户外露天项目的“移动制作域”,“…...
idea怎么配置gradle多个版本
1.背景 gradle版本很多,而且很多时候版本是不兼容的,我们希望拉取下来的代码就包含已经配置好的版本,而不是去配置本机的gradle版本..... 意思就是要实现项目A可以用6.X版本 项目B可以使用7.X版本 项目C可以用9.X版本..... 2.配置方式 步骤一:项目根路径下保留一个文件夹…...
SpringCloudAlibaba-Seata2.0.0与Nacos2.2.1
一、下载 ## 下载seata wget https://github.com/apache/incubator-seata/releases/download/v2.0.0/seata-server-2.0.0.tar.gz## 解压 tar zxvf seata-server-2.0.0.tar.gz二、执行sql文件 ## 取出sql文件执行 cd /seata/script/server/db/mysql ## 找个mysql数据库执行三、…...
西安建设工程交易网站/谷歌手机版下载安装
介绍 在以前,服务基本上都是处于一个进程中,在同一进程中的不同线程要访问和操作同一个资源,可以使用编程语言提供的同步锁机制;但现在那些庞大的服务都已经被服务化和分布式化了,这样需要操作一个资源的可能就是一个个…...
怎样建立网站视频教程/十大新媒体平台有哪些
本文实例分析了Android开发之TimePicker控件用法。分享给大家供大家参考,具体如下:新建项目:New Android Project->Project name:HelloSpinnerBuild Target:Android 2.2Application name:HelloSpinnerPackage name:com.b510Create Activit…...
做银行设计有好的网站参考吗/网络营销策划方案模板范文
好课推荐:1.CAD2014:点击查看2.室内CAD:点击查看3.CAD2019:点击查看4.CAD2018:点击查看5.【bim】revit:点击查看6.室内手绘:点击查看7.CAD三维:点击查看8.全屋定制:点击查…...
自己做网站 赚钱/网站站外优化推广方式
感谢原作者雪兰,http://yupeizhi.blog.51cto.com/3157367/1413886DHCP配置的过程:1、DHCP客户端以广播的方式向网络中的DHCP服务器发送出DHCP Discover数据包;2、DHCP服务器在收到DHCP Discover数据包后,回应一个DHCP Offer数据包…...
深圳宣传片制作企业/爱采购seo
针对一些访问量比较大的网站,Mysql默认的最大连接数可能不够用,需要进行相应的修改,接下来吾爱编程为大家介绍一下关于MySQL最大连接数修改方法,有需要的小伙伴可以参考一下:1、查看最大连接数:show variab…...
建筑工程网校官网/谷歌seo外包
动态路由中的链路状态算法和距离矢量算法有什么区别? OSPF在点到点网络如何构建拓扑和计算路由? OSPF在广播型网络如何构建拓扑和计算路由? 两种动态路由算法 动态路由算法两大类,距离矢量和链路状态。 距离矢量算法是谣传性…...