假设TCP套接字服务器端已经建立好并正在监听客户端的连接了,那么客户端就可以通过Socket类来发起连接。客户端发起一个连接请求后,就被动地在等待服务器的响应。这个类同样位于java.net包中,包含很多方法用于建立连接,操作数据流等。客户端按以下几步进行工作:

① 创建一个Socket实例,构造函数直接指定远程服务器IP跟端口,建立一个TCP连接。

② 通过这个Socket实例的输入输出流进行通信,Socket实例都包含一个InputStream对象和OutputStream对象,通过操作这些流就可以实现接收发送数据。

③ 完成通信后,用Socket实例的close()方法关闭连接。

上面了解了应用层java的工作方式,接着有必要深入研究socket从应用层到系统底层是怎么工作的,应用层的这些操作在系统底层是怎么反应的。如图2-3-2-3所示,以虚线为分界线,上层位应用层,下层为系统底层。整个工作流程可以分为以下几步:

(1) 首先确定要进行通信的目标,包括目标IP和目标端口。

(2) 根据目标IP跟端口,在Java应用层创建一个Socket实例。

(3) 阻塞等待,准备进行系统底层相关工作。

(4) 创建socket底层数据结构,socket初始状态为关闭。

(5) 向这个socket填入本地、远程的地址跟端口,并向远程服务器发送连接请求,此时socket的状态为正在连接。

(6) 跟远程服务器完成3次握手后,就完成了连接的建立,此时的socket状态为连接建立完成。

(7) 完成应用层上的socket实例化,接下去可以对这个socket进行操作,以实现通信。

 

图2-3-2-3 Socket底层工作原理

实际的通信中,客户端socket中虽然没有明显指定用哪个本地端口号,但其实系统会随机(一般大于1023)分配一个端口号,所以每次通信使用的本地端口号一般是不同的。另外,由于消息在网络中传输可能延迟,而如果关闭服务器客户端socket连接后,又产生同样地址的服务器跟客户端socket,这时在网络中延迟的旧消息会被误以为是新连接的消息发送给新的socket连接,导致错误。所以要TCP规范要求两端都完成关闭握手后,至少要有一个套接字保持一段时间Time-Wait状态。一般客户端的socket完成通信后会变为Time-Wait状态,并保持一段时间。在此期间,不允许socket使用这个本地端口号,应用层Java如果试图用该端口号创建一个新的socket实例,将抛出IOException异常。

喜欢研究java的同学可以交个朋友,下面是本人的微信号:

socket系列之客户端socket——Socket类的更多相关文章

  1. socket系列之什么是socket

    1.什么是socket Socket是应用层与TCP/IP协议族通信的中间抽象层,它是一组接口,应用层通过调用这些接口实现发送和接收数据.一般这种抽象层由操作系统提供或者由JVM自己实现.使用sock ...

  2. Socket网络编程(TCP/IP/端口/类)和实例

    Socket网络编程(TCP/IP/端口/类)和实例 原文:C# Socket网络编程精华篇 转自:微冷的雨 我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: TCP/IP层次 ...

  3. Ajax跨域问题及解决方案 asp.net core 系列之允许跨越访问(Enable Cross-Origin Requests:CORS) c#中的Cache缓存技术 C#中的Cookie C#串口扫描枪的简单实现 c#Socket服务器与客户端的开发(2)

    Ajax跨域问题及解决方案   目录 复现Ajax跨域问题 Ajax跨域介绍 Ajax跨域解决方案 一. 在服务端添加响应头Access-Control-Allow-Origin 二. 使用JSONP ...

  4. socket系列之服务器端socket——ServerSocket类

    一般地,Socket可分为TCP套接字和UDP套接字,再进一步,还可以被分为服务器端套接字跟客户端套接字.这节我们先关注TCP套接字的服务器端socket,Java中ServerSocket类与之相对 ...

  5. C# Socket系列二 简单的创建 socket 通信

    看了系列一 我们开启了对socket tcp的监听状态,那么这一章我们来讲解怎么创建socket的通信代码 我新建一个类 TSocketBase public abstract class TSock ...

  6. C#网络编程系列文章(五)之Socket实现异步UDPserver

    原创性声明 本文作者:小竹zz 本文地址http://blog.csdn.net/zhujunxxxxx/article/details/44258719 转载请注明出处 文章系列文件夹 C#网络编程 ...

  7. C#网络编程系列文章(一)之Socket实现异步TCPserver

    原创性声明 本文作者:小竹zz 本文地址http://blog.csdn.net/zhujunxxxxx/article/details/44258719 转载请注明出处 文章系列文件夹 C#网络编程 ...

  8. Socket聊天程序——客户端

    写在前面: 上周末抽点时间把自己写的一个简单Socket聊天程序的初始设计和服务端细化设计记录了一下,周二终于等来毕业前考的软考证书,然后接下来就是在加班的日子度过了,今天正好周五,打算把客户端的详细 ...

  9. Socket实现聊天客户端

    今天在极客学院上看到了一个关于Socket的视频讲解,感觉还不错,就写了份代码,拿来分享一下. Socket使用方法 关于Socket的使用,我们首先要弄清楚的是,在服务器端还是在客户端使用.因为这的 ...

随机推荐

  1. NKOJ4191 Trie树

    问题描述 字母(Trie)树是一个表示一个字符串集合中所有字符串的前缀的数据结构,其有如下特征: 1.树的每一条边表示字母表中的一个字母  2.树根表示一个空的前缀  3.树上所有其他的节点都表示一个 ...

  2. [USACO12FEB]牛的IDCow IDs

    题目描述 Being a secret computer geek, Farmer John labels all of his cows with binary numbers. However, ...

  3. 计蒜客NOIP模拟赛(2) D2T1 劫富济贫

    [问题描述] 吕弗·普自小从英国长大,受到骑士精神的影响,吕弗·普的梦想便是成为一位劫富济贫的骑士. 吕弗·普拿到了一份全国富豪的名单(不在名单上的都是穷人),上面写着所有富豪的名字以及他们的总资产, ...

  4. C++Primer学习——函数

    编译器能以任意顺序对形参进行求值 函数的返回类型不能是数组类型和函数类型. 函数开始时为形参分配内存,一旦函数结束,形参也就被销毁了. 如果弄成静态局部变量,那么回到程序终止结束时才被销毁. void ...

  5. bzoj1073[SCOI2007]kshort

    1073: [SCOI2007]kshort Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1483  Solved: 373[Submit][Sta ...

  6. bzoj4361isn dp+容斥

    4361: isn Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 370  Solved: 182[Submit][Status][Discuss] ...

  7. 数据挖掘实战<1>:数据质量检查

    数据行业有一句很经典的话--"垃圾进,垃圾出"(Garbage in, Garbage out, GIGO),意思就是,如果使用的基础数据有问题,那基于这些数据得到的任何产出都是没 ...

  8. IDE、SDK、API

    IDE 集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器.编译器.调试器和图形用户界面等工具.集成了代 ...

  9. Docker学习笔记【一】

    [本篇学习笔记来源于 Docker 从入门到实践] 1.什么事Docker?[What] Docker在容器的基础上,进行了进一步的封装,从文件系统.网络互联到进程隔离等,极大的简化了容器的创建和维护 ...

  10. windows的常用快捷键(实用篇)

    整理一下windows的常用快捷键,有些快捷键老不用都忘记了,这里整理一下方便自己以后忘记时翻阅. 一.Fn键的使用 1.F1帮助 2.F2重命名 3.F3打开搜索 4.F4打开地址栏常用地址 5.F ...