Socket 通信原理

Socket 通信机制详解 阅读详情

整理和总结了一下大家常遇到的问题:

1.  客户端socket发送消息后,为什么服务端socket没有收到?

2.  使用while 循环实现连续输入,是不是就是多线程模式?

3.  对多线程处理机制不是很明白,希望详细讲解?

4.  希望详细讲解ServerSocketChannel和SocketChannel与ServerSoket和Socket的区别?

5.  希望有详细的例子,可以直接拷贝下来运行?

针对童鞋们提出的问题,我会在本文章中详细一一简答,并且给出详细的例子,下面言归正传。

一:socket通信基本原理。

首先socket 通信是基于TCP/IP 网络层上的一种传送方式,我们通常把TCP和UDP称为传输层。

图片描述(最多50字)

如上图,在七个层级关系中,我们将的socket属于传输层,其中UDP是一种面向无连接的传输层协议。UDP不关心对端是否真正收到了传送过去的数据。如果需要检查对端是否收到分组数据包,或者对端是否连接到网络,则需要在应用程序中实现。UDP常用在分组数据较少或多播、广播通信以及视频通信等多媒体领域。在这里我们不进行详细讨论,这里主要讲解的是基于TCP/IP协议下的socket通信。

socket是基于应用服务与TCP/IP通信之间的一个抽象,他将TCP/IP协议里面复杂的通信逻辑进行分装,对用户来说,只要通过一组简单的API就可以实现网络的连接。借用网络上一组socket通信图给大家进行详细讲解:

图片描述(最多50字)

首先,服务端初始化ServerSocket,然后对指定的端口进行绑定,接着对端口及进行监听,通过调用accept方法阻塞,此时,如果客户端有一个socket连接到服务端,那么服务端通过监听和accept方法可以与客户端进行连接。

二:socket通信基本示例:

在对socket通信基本原理明白后,那我们就写一个最简单的示例,展示童鞋们常遇到的第一个问题:客户端发送消息后,服务端无法收到消息。

服务端:

package socket.socket1.socket;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.ServerSocket;

import java.net.Socket;

public class ServerSocketTest {

public static void main(String[] args) {

try {

// 初始化服务端socket并且绑定9999端口

  ServerSocket serverSocket =new ServerSocket(9999);

  //等待客户端的连接

  Socket socket = serverSocket.accept();

  //获取输入流

  BufferedReader bufferedReader =new BufferedReader(new InputStreamReader(socket.getInputStream()));

  //读取一行数据

  String str = bufferedReader.readLine();

  //输出打印

  System.out.println(str);

}catch (IOException e) {

e.printStackTrace();

}

}

}

客户端:

package socket.socket1.socket;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.OutputStreamWriter;

import java.net.Socket;

public class ClientSocket {

public static void main(String[] args) {

try {

Socket socket =new Socket(“127.0.0.1”,9999);

  BufferedWriter bufferedWriter =new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

  String str="你好,这是我的第一个socket";

  bufferedWriter.write(str);

}catch (IOException e) {

e.printStackTrace();

}

}

}

启动服务端:

发现正常,等待客户端的的连接

图片描述(最多50字)

启动客户端:

发现客户端启动正常后,马上执行完后关闭。同时服务端控制台报错:

图片描述(最多50字)

服务端控制台报错:

图片描述(最多50字)

然后好多童鞋,就拷贝这个java.net.SocketException: Connection reset上王查异常,查询解决方案,搞了半天都不知道怎么回事。解决这个问题我们首先要明白,socket通信是阻塞的,他会在以下几个地方进行阻塞。第一个是accept方法,调用这个方法后,服务端一直阻塞在哪里,直到有客户端连接进来。第二个是read方法,调用read方法也会进行阻塞。通过上面的示例我们可以发现,该问题发生在read方法中。有朋友说是Client没有发送成功,其实不是的,我们可以通debug跟踪一下,发现客户端发送了,并且没有问题。而是发生在服务端中,当服务端调用read方法后,他一直阻塞在哪里,因为客户端没有给他一个标识,告诉是否消息发送完成,所以服务端还在一直等待接受客户端的数据,结果客户端此时已经关闭了,就是在服务端报错:java.net.SocketException: Connection reset

那么理解上面的原理后,我们就能明白,客户端发送完消息后,需要给服务端一个标识,告诉服务端,我已经发送完成了,服务端就可以将接受的消息打印出来。

通常大家会用以下方法进行进行结束:

socket.close() 或者调用socket.shutdownOutput();方法。调用这俩个方法,都会结束客户端socket。但是有本质的区别。socket.close() 将socket关闭连接,那边如果有服务端给客户端反馈信息,此时客户端是收不到的。而socket.shutdownOutput()是将输出流关闭,此时,如果服务端有信息返回,则客户端是可以正常接受的。现在我们将上面的客户端示例修改

【通信篇】【Socket通信机制】 Socket通信机制是一种计算机网络通信协议,它是基于TCP/IP协议栈的应用层协议,提供了一组API(应用程序接口),允许不同的进程在不同计算机之间进行通信。socket通信一般涉及客户端和服务端两个socket。服务器端首先初始化Socket,然后与端口绑定,并对该端口进行监听。当客户端连接成功后,客户端会发送数据请求,服务器端接收并处理这些请求,然后将回应数据发送给客户端。客户端读取数据后,连接关闭。socket本身不是协议,是api接口,通过socket,我们可以使用Tcp/ip协议。 阅读详情

相关推荐

Socket通信原理

Socket通信原理 对TCP/IP、UDP、Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵。那么我想问: 什么是TCP/IP、UDP? Socket在哪里呢? Socket是什么呢? 你会使用它们吗? 什么是TCP/IP、UDP? TCP/IP(Transmission Control Pro...

kikityan的博客 2万+

lammps建模(电解液)opls-aa力场的基本流程

lammps建模(电解液)opls-aa力场的基本流程

syj0922的博客 2133

ggml_cgraph 详解

是 GGML 库的(Computation Graph)结构,它是深度学习框架的核心,用于表示、优化和执行神经网络的计算过程。

zhouzwd87的专栏 1203

存储关键技术·RAID技术·RAID2.0·华为RAID2.0+·华为服务器·云计算

一.RAID基本概念 常见的RAID级别组合RAID级别 二.RAID的数据组织形式 三.RAID的数据保护功能 方法一:镜像方法二:奇偶校验算法(XOR) 四.RAID热备和重构 1.热备(Hot Spare)的定义2.热备的分类3.热备的工作原理 五.RAID 2.0技术 1.RAID 2.02.RAID 2.0+3.华为RAID 2.0+ 六.RAID 2.0+块虚拟化技术 1.什么会出现RAID 2.0+技术?2.什么是RAID 2.0?3.RAID 2.0+的原理是什么?

qq_47480932的博客 3320

【CADARXC++】ObjectArx2023 C++ CAD二次开发环境配置笔记

从官网或第三方平台下载以下AUtoCAD2023、VisualStudio2019和ObjectArx2023安装时请注意安装顺序。

BIMCATIA的博客 1789

WSL2+Ubuntu20.04纯root环境搭建指南:告别权限烦恼的终极方案

本文提供了一份详细的WSL2+Ubuntu20.04纯root环境搭建指南,旨在为本地开发与学习打造一个免去权限干扰、极致流畅的Linux子系统环境。通过启用WSL2、安装Ubuntu 20.04,并执行核心的root用户设置,开发者可以彻底告别频繁的sudo操作,提升在文件操作、容器调试和系统配置等方面的效率。

time3的博客 474

SAP和Oracle EBS作为全球顶级的ERP系统,在中国市场深耕数十年,尤其是在大型国企、央企和跨国企业中,已经形成了强大的用户习惯和“舒适区”依赖

国产ERP替代国际系统的关键挑战在于打破用户对SAP/Oracle的操作习惯和心理依赖。需采取多维策略:战略上明确价值主张、分阶段实施;产品上优化用户体验、确保数据迁移;实施上加强情景化培训、流程再造。成功替代70%取决于变革管理,需将"被动替换"转为"主动升级",让用户在新系统中建立更优的舒适区。

金牌架构师 383

CADENCE 25.1打开元件库ERRORCannot perform the operation because of an exception.

摘要:解决CADENCE25.1打开元件库报错"ERRORCannotperformtheoperationbecauseofanexception"的方法:该错误通常由软件中文设置导致。解决方案为:进入Options→Preferences→MorePreferences,取消勾选两个本地语言选项后重启软件即可恢复正常。此方法简单有效,能快速解决因语言设置导致的元件库访问异常问题。(98字)

0 1011

apollo自动驾驶进阶学习之:如何实现施工路段限速绕行及其参数调试

首先需要理解Planning模块是基于Scenario、Stage、Task这样的层次来进行的,即场景->步骤->具体的决策方法。Apollo可以应对自动驾驶所面临的不同道路场景,都是通过Scenario统一注册与管理。Scenario通过一个有限状态机来判断选择当前行车场景,每个Scenario下又有多个Stage,指当前场景下需要执行的粗略步骤。.........

qq_41593516的博客 6596

水晶报表部署工具CRRuntime_64bit_13_0_5

水晶报表部署工具 CRRuntime 该工具用来部署水晶报表,64位,

unity3D期末大作业,坦克射击游戏

坦克射击游戏(免积分下载),可以发射子弹打击物体,坦克可以撞碎墙壁,树木,有背景音效,适合新手学习使用,游戏详情看我发布的文章。

WinCC_V6.0_SP4安装包_链接地址baiduyun.txt

WinCC_V6.0 SP4安装包_链接地址

EZ-EDS V3.23.1 编辑器:EtherNet/IP与Canopen设备描述文件(EDS)的专业管理工具

标题中提及的“EZ-EDS V3.23.1.20171205.zip”是一个软件更新包,其内部封装了EZ-EDS编辑器的3.23.1版,该版本于2017年12月5日发布。EZ-EDS是一款专业工具,主要用于编写与维护EtherNet/IP及Canopen网络中的设备描述文件(EDS)。EtherNet/IP作为一种工业以太网通信标准,由Allen Bradley(隶属于Rockwell Automation)主导开发,它构建于TCP/IP基础之上,广泛应用于自动化与制造行业,能够实现设备层与控制层之间的高速数据互联。Canopen,全称为基于对象字典的控制器局域网,是一种面向设备级的开放式通信体系,其物理层依托CAN总线,而应用层则遵循CiA组织制定的通信规则,包括过程数据对象和服务数据对象等机制,以保障不同设备间实现精准同步与信息交换。Canopen EDS文件,即设备描述文件,在Canopen网络中扮演关键角色。该文件详细记载了特定Canopen设备的各项参数,例如对象字典内容、通信设置、错误处理方式及制造商自定义功能等。这些数据对于配置与调试Canopen网络至关重要,它们确保了不同设备能够顺利交互与协同工作。ODVA(开放设备网络供应商协会)是一个国际机构,专注于推广和维护EtherNet/IP、Canopen等开放式网络标准。该组织通过发布统一规范,保障了各厂商产品在相同网络环境中的兼容性与互操作性。压缩文件“EZ-EDS V3.23.1.20171205”通常内含该软件的安装程序、操作指南、版本更新记录及相关辅助材料。借助此工具,技术人员能够便捷地生成、修改与管理Canopen设备的EDS文件,并将其整合至EtherNet/IP网络内。对于从事Canopen或EtherNet/IP网络配置与维护的系统集成人员及自动化工程师而言,这一工具具有显著实用价值。该压缩包所涵盖的技术要点主要包括:EtherNet/IP协议、Canopen协议、Canopen EDS文件结构、ODVA标准规范以及EZ-EDS编辑器的操作方法。这些内容均是工业自动化领域中的核心组成部分。通过运用EZ-EDS,使用者可更有效地完成网络设备的参数设置与数据通信优化,进而提升整个系统的运行效率与稳定程度。资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!

上一篇: 面试题系列:谈谈HTTP的请求和响应
下一篇: 面试解答系列:什么是Spring的依赖注入?哪些方法进行依赖注入?
程序员plus
博客等级 码龄8年 41粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值