1.Socket:Socket就是套接字。客户端与服务器之间通信用的。Socket接口是TCP/IP网络的API.

  

  2.SYN是TCP/IP建立连接时使用的握手信号。在客户端和服务器之间建立正常的TCP网络连接时,客户端首先发出一个SYN消息,服务器使用SYN+ACK应答表示接收到这个消息,最后客户端再以ACK消息响应。这样在客户端和服务器之间才能建立起可靠的TCP连接,数据才可以在客户端和服务器之间传递。

  

  3.ACK即确认字符,在数据通信中,接收站给发送站的一种传输类控制字符。表示发来的数据已确认接受无误。

  4.网络中进程之间的通信,首要解决的是如何标识一个进程,否则无从谈起!TCP/IP协议帮我们解决了这个问题,网络层的ip地址可以唯一标识网络中的主机,而传输层的协议+端口可以唯一标识主机中的应用程序(进程)。这样利用三元组(ip地址、协议、端口)就可以标识网络的进程了,进程通信就利用这个标志与其他进程进行交互。TCP/IP采用编程接口是socket(套接字)。

  5.socket的基本操作:“open-write/read-close”模式

   流程:①socket()

      ②bind()

      ③listen()、connect()

      ④accept()

      ⑤read()、write()

      ⑥close()

    

  6.socket()函数

   int socket(int domain,int type,int protocol);

   socket()用于创建一个socket描述符,传入不同参数,创建不同的socket描述符。

   参数:

   domain:协议域,决定了socket的地址类型;

   type:指定socket类型;

   protocol:协议(如TCP、UDP、STCP、TIPC)

   socket()创建一个socket时,返回的socket描述子存在于协议域空间中,但是没有一个具体的地址。如果想要给它赋值一个地址,必须调用bind()函数,否则当调用connect()、listen()时系统会自动随机分配一个端口。

    

  7.bind()函数

   int bind(int sockfd,const struct sockaddr *addr,socklen_t  adddrlen);

   参数:

   sockfd:bind()就是将给这个描述字绑定一个名字;

   addr:一个const struct sockaddr*指针,指向要绑定给sockfd的协议地址。这个地址结构根据创建socket时的地址协议族的不同而不同。

  8.listen()、connect()函数

   服务器在调用socket()、bind()之后就会调用listen()来监听这个socket,客户端调用connect()发出连接请求,服务端就会接收这个请求

   int listen(int sockfd,int backlog);

   int connect(int sockfd,const struct sockaddr *addr,socklen_t addrlen);

   参数:

   listen函数的第一个参数是要监听的socket描述字,第二个参数为相应socket可以排队的最大连接个数。socket()函数创建的socket默认是主动类型的,listen()将socket变为被动类型的,等待客户的连接请求。

   connect函数的第一个参数即为客户端的socket描述字,第二个参数为服务器的socket地址,第三个参数为socket地址的长度。客户端通过调用connect函数来建立与TCP服务器的连接。

  9.accept()函数

   TCP服务端依次调用socket()、bind()、listen()之后,就会监听指定的socket地址了。TCP客户端依次调用socket()、connect()之后就向TCP服务器发送了一个连接请求。TCP服务器监听到这个请求后,就会调用accept()函数接收请求,这样连接就建立好了。之后就可以开始网络I/O操作了。

   int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);

   accept函数的第一个参数为服务器的socket描述字,第二个为指向struct sockaddr*的指针,用于返回客户端的协议地址,第三个参数为协议地址的长度。如果accept成功,那么返回值是有内核自动生成的一个全新的描述字,代表与返回客户的TCP连接。

   注意:accept的第一个参数为服务器的socket描述字,是服务器开始调用socket()函数生成的,成为监听socket描述字;而accept函数返回的是已连接的socket描述字。一个服务器同城仅仅只创建一个监听socket描述字,它在该服务器的生命周期内一直存在。内核为每个有服务器进程接受的客户连接创建了一个已连接socket描述字,当服务器完成了对某个客户的服务,相应的已连接socket描述字就被关闭。

  10.read()、write()等函数

   服务器与客户建立好连接,就可以调用网络I/O进行读写操作了,实现网络中不同进程之间的通信!

   ①read()/write()

   ②recv()/send()

   ③readv()/writev()

   ④recvmsg()/sendmsg()

   ⑤recvfrom()/sendto()

   read函数是负责从fd读取内容,read返回实际所读的字节数,如果返回的值是0表示已经读到文件的结束了,小于0表示出现了错误。如果错误为eintr说明读是由中断引起的,如果是econnrest表示网络连接出了问题。

   write函数将buf中的字节内容写入文件描述符fd.成功时返回写的字节数。失败时返回-1,并设置errno变量。在网络程序中,当我们向套接字文件描述符写时有两种可能:①write返回值大于0表示写了部分或者是全部数据。②返回值小于0,此时出现了错误,错误为eintr表示在写的时候出现了中断错误。如果为epipe表示网络连接出现了问题(对方已经关闭了连接)

  11.close()函数

   int close(int fd)

   close函数操作只是使相应socket描述字的应用计数-1,只有当引用计数为0的时候,才会触发TCP客户端向服务器发送终止连接请求。

  12.socket中TCP的三次握手建立连接

   ①客户端向服务器发送一个SYN J(握手信号)

   ②服务器向客户端响应一个SYN K,并对SYN J进行确认ACK J+1;

   ③客户端再向服务器发一个确认ACK K+1;

初学Socket通信的更多相关文章

  1. 我看不下去鸟。。。。Java和C#的socket通信真的简单吗?

    这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...

  2. php简单实现socket通信

    socket通信的原理在这里就不说了,它的用途还是比较广泛的,我们可以使用socket来做一个API接口出来,也可以使用socket来实现两个程序之间的通信,我们来研究一下在php里面如何实现sock ...

  3. Socket通信类

    package com.imooc; import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt ...

  4. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  5. socket通信

    socket通信 一:socket基于Tcp连接,数据传输有保证 二:socket连接的建立过程: 1:服务器监听 2:客户端发出请求 3:建立连接 4:通信 三:一个简单的例子:服务器端每隔一段时间 ...

  6. Android之Socket通信、List加载更多、Spinner下拉列表

    Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务 ...

  7. .NET开源高性能Socket通信中间件Helios介绍及演示

    一:Helios是什么 Helios是一套高性能的Socket通信中间件,使用C#编写.Helios的开发受到Netty的启发,使用非阻塞的事件驱动模型架构来实现高并发高吞吐量.Helios为我们大大 ...

  8. iOS开发之Socket通信实战--Request请求数据包编码模块

    实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...

  9. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

随机推荐

  1. html中去除ul,li标签的样式列表标签的点?

  2. Maven项目引入log4j的详细配置

    注:本文来源于 _xiaoxiong  <Maven项目引入log4j的详细配置> 引入log4j pom.xml <dependency> <groupId>lo ...

  3. 【svn】本地文件夹同步到SVN

    本地代码上传至SVN 起因: 我在开发项目代码时往往在本地开发很久,在基本功能完成时才上传svn,添加版本控制. 做法: 右键 TortoiseSVN - Repo browser 在希望项目存储的根 ...

  4. js-将文本复制到剪切板

    // 将文本复制到剪切板 var clipboard2 = new ClipboardJS('.add_wx_guide_float', { text: function(trigger) { ret ...

  5. springboot整合mybatis开发

    1创建项目,在启动类上添加映射扫描注解 2导入依赖,添加mybatis generator自动生成代码插件 <!-- mybatis generator 自动生成代码插件 --> < ...

  6. Java堆和优先队列

    普通队列:先进先出,后进后出 优先队列:出队顺序和入队顺序无关,和优先级相关. 堆中某个节点的值总是不对于其父节点的值,最大堆. public class Array<E> { priva ...

  7. 在SOUI中使用窗口自適應大小

    SOUI 2.5.0.3開始支持窗口大小自適應. 2.5.0.3以前,宿主窗口要適應顯示內容大小比較麻煩,因爲一般都是佈局內容適應宿主. SOUI 2.5.+開始支持線性佈局,線性佈局是借鑑的Andr ...

  8. 记一次Hbase的行键过滤器事故问题

    数据总数:746条数据 因为后面需要进行算法合成,而且spark目前对这种算法支持并不好,因此采用代码编写,所以在查询hbase的过程中采用的是java直接查询, 但是为了加快查询速度,我尽可能的使用 ...

  9. Linux进程和端口互相查看方法

    一.查找应用进程的端口 ps -ef |grep mysql 查看进程 ps:将某个进程显示出来 -A 显示所有程序.  -e 此参数的效果和指定"A"参数相同. -f 显示UID ...

  10. 我的BO之强类型

    弱类型的缺点 有些程序员对类型比较随意,从前端传来的数据,不管应该是什么类型,都以String接收.然后在什么地方转成应该有的类型则要"看心情",在Controller, Serv ...