当前位置: 首页 > news >正文

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的基本步骤如下:

  1. 创建ServerSocket实例:通过调用ServerSocket的构造器,并指定一个端口号(可选地,也可以指定一个IP地址,但通常指定为null,表示监听所有可用的网络接口)。
  2. 等待连接:通过调用ServerSocket的accept()方法等待客户端的连接。这个方法会阻塞,直到一个连接被建立。
  3. 通信:一旦accept()方法返回了一个Socket实例,就可以通过这个实例的输入流和输出流与客户端进行通信了。
  4. 关闭连接:通信结束后,需要关闭Socket和ServerSocket实例以释放资源。

5.2 Socket

Socket是网络通信的端点,它包含了进行网络通信所需的输入流和输出流。一个Socket实例可以是由ServerSocket的accept()方法返回,代表一个客户端连接;也可以是通过调用Socket的构造器创建的,表示主动向服务器发起连接请求的客户端。

创建客户端Socket的基本步骤如下:

  1. 创建Socket实例:通过调用Socket的构造器,并指定服务器的IP地址和端口号。
  2. 通信:一旦Socket实例被创建,就可以通过它的输入流和输出流与服务器进行通信了。
  3. 关闭连接:通信结束后,需要关闭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…...

设计模式使用场景实现示例及优缺点(行为型模式——责任链模式)

在一个遥远的森林深处&#xff0c;有一个和谐的动物王国。这个王国里的动物们都有各自的职责&#xff0c;大家相互合作&#xff0c;共同维护着森林的和平与繁荣。 一天&#xff0c;森林里来了一只迷路的小兔子&#xff0c;她焦急地四处张望&#xff0c;不知道该怎么办。于是&am…...

CSS-1_0 CSS和文档流

文章目录 CSS和文档流如何证明这个流的存在呢&#xff1f;流和display番外&#xff1a;inline-block 碎碎念 CSS和文档流 首先什么叫流呢&#xff1f; 通常来说&#xff0c;我们最终看到的网页是HTML文档中定义的各个元素挨个输出的结果&#xff0c;这种一个接一个输出的方式…...

小程序图片下载保存方法,图片源文件保存!

引言 现在很多时候我们在观看到小程序中的图片的时候&#xff0c;想保存图片的原文件格式的话&#xff0c;很多小程序是禁止保存的&#xff0c;即使是让保存的话&#xff0c;很多小程序也会限制不让保存原文件&#xff0c;只让保存一些分辨率很低的&#xff0c;非常模糊的图片…...

新书速览|深入理解Hive:从基础到高阶:视频教学版

《深入理解Hive&#xff1a;从基础到高阶&#xff1a;视频教学版》 本书内容 《深入理解Hive:从基础到高阶:视频教学版》采用“理论实战”的形式编写&#xff0c;通过大量的实例&#xff0c;结合作者多年一线开发实战经验&#xff0c;全面地介绍Hive的使用方法。《深入理解Hiv…...

钡铼Profinet、EtherCAT、Modbus、MQTT、Ethernet/IP、OPC UA分布式IO系统BL20X系列耦合器

BL20X系列耦合器是钡铼技术开发的一款用于分布式I/O系统的设备&#xff0c;专为工业环境下的高速数据传输和远程设备控制而设计&#xff0c;支持多种工业以太网协议&#xff0c;包括Profinet、EtherCAT、Modbus、MQTT、Ethernet/IP和OPC UA等。如果您正在考虑部署BL20X系列耦合…...

Git分支合并以及分支部分合并 提交记录合并

Git分支合并,以及分支部分合并,提交记录合并 最近工作中用到git分支合并的场景,记录一下. 分支整体合并,合并所有记录 仅合并分支部分代码...

IDEA关联数据库

《IDEA破解、配置、使用技巧与实战教程》系列文章目录 第一章 IDEA破解与HelloWorld的实战编写 第二章 IDEA的详细设置 第三章 IDEA的工程与模块管理 第四章 IDEA的常见代码模板的使用 第五章 IDEA中常用的快捷键 第六章 IDEA的断点调试&#xff08;Debug&#xff09; 第七章 …...

【Leetcode】14. 最长公共前缀

leetcode原地址&#xff1a;https://leetcode.cn/problems/longest-common-prefix 描述 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 “”。 示例 1&#xff1a; 输入&#xff1a;strs [“flower”,“flow”,“flight”…...

【BUG】已解决:zipfile.BadZipFile: File is not a zip file

已解决&#xff1a;zipfile.BadZipFile: File is not a zip file 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开发…...

小白新手搭建个人网盘

小白新手搭建个人网盘 序云服务器ECS重置密码远程连接ECS实例 安装OwnCloud安装Apache服务PHP运行环境NAS挂载挂载验证操作体验 序 阿里云文件存储NAS&#xff08;Apsara File Storage NAS&#xff09;是一个可大规模共享访问&#xff0c;弹性扩展的分布式文件系统。本文主要是…...

NineData全面支持PostgreSQL可视化表结构设计

“PostgreSQL 是最像 Oracle 的开源关系型数据库“&#xff0c;也正因为如此&#xff0c;很多企业都青睐 PostgreSQL&#xff0c;拿它当成 Oracle 的替代品。所以毫无疑问&#xff0c;目前 PostgreSQL 在企业中非常常见。 对于直接接触 PostgreSQL 的开发人员而言&#xff0c;…...

从系统层面认识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(印制电路板)制造涉及的常规设备

印制电路板&#xff08;PCB&#xff09;的制造涉及多种设备和工艺。从设计、制作原型到批量生产&#xff0c;每个阶段都需要不同的专业设备。以下是一些在PCB制造过程中常见的设备&#xff1a; 1. 计算机辅助设计&#xff08;CAD&#xff09;软件&#xff1a; - 用于设计PC…...

《Windows API每日一练》10.3 公用对话框

Windows最初发行时的主要目标之一就是提倡一种标准化的用户界面。对于公用菜单 项来说&#xff0c;这一目标实现得很快。几乎所有的软件制造商都采用了Alt-File-Open组合来打开 文件。但是&#xff0c;真正用来打开文件的对话框却经常很不一样。 从Windows 3.1开始&#xff0c…...

C++中的引用

在C中&#xff0c;我们要学习一个新的概念&#xff0c;叫做引用。引用不是对象&#xff0c;它只是给变量取一个别名。就好比&#xff0c;我们每个人总会右一下外号&#xff0c;或者是小名。当朋友或者家长不管是直接叫你的名字&#xff0c;还是叫你的小名&#xff0c;你都会答应…...

【自学安全防御】三、企业双机热备和带宽管理的综合实验

实验拓扑&#xff1a; 实验任务&#xff1a; 12&#xff0c;对现有网络进行改造升级&#xff0c;将当个防火墙组网改成双机热备的组网形式&#xff0c;做负载分担模式&#xff0c;游客区和DMZ区走FW3&#xff0c;生产区和办公区的流量走FW1 13&#xff0c;办公区上网用户限制流…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...