假设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. [SCOI 2010]字符串

    Description lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgw ...

  2. [JSOI2008]球形空间产生器

    Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球 面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧 ...

  3. 【USACO】 录制唱片

    题目描述 贝西想从奶牛摇滚乐队的 N 首歌里挑出一些录制一套专辑.专辑分 K 张唱片,每张唱片可容纳总长为 C 分钟的歌曲.第 i 首歌的长度为 T i 分钟,录制唱片时,唱片之间的歌曲需要保持原本的 ...

  4. APIO 2016

    我好菜啊都不会 T1.boats 题目大意:给你N段区间,按顺序决定每段区间可以选一个数或不选,若选则选的这个数必须大于所有在这之前选的数,求有多少种方案.(N<=500,区间在[1,1e9]范 ...

  5. kafka快速入门

    一.kafka简介 kafka,ActiveMQ,RabbitMQ是当今最流行的分布式消息中间件,其中kafka在性能及吞吐量方面是三者中的佼佼者,不过最近查阅官网时,官方与它的定义为一个分布式流媒体 ...

  6. seq2seq-chatbot:200 行代码实现聊天机器人

    Chatbot in 200 lines of code CPU 跑不动 github:https://github.com/zsdonghao/seq2seq-chatbot 更多英文,中文聊天机器 ...

  7. JS多个对象添加到一个对象中

    var obj1 = {"qq":10}; var obj2={"mm":2,"nn":3}; var obj3={"xx&quo ...

  8. 索引法则--IS NULL, IS NOT NULL 也无法使用索引

    Mysql 系列文章主页 =============== 1 数据准备 1.1 建表 DROP TABLE IF EXISTS staff; CREATE TABLE IF NOT EXISTS st ...

  9. rabbitMQ权限相关命令

    权限相关命令为: (1) 设置用户权限 rabbitmqctl  set_permissions  -p  VHostPath  User  ConfP  WriteP  ReadP (2) 查看(指 ...

  10. (转载)JVM知识小集

    1. 内存模型以及分区,需要详细到每个区放什么. 2. 堆里面的分区:Eden,survival from to,老年代,各自的特点. 3. 对象创建方法,对象的内存分配,对象的访问定位. 4. GC ...