socket

socket通信原理

China☆狼群 提交于 2020-03-26 16:50:35
1、什么是socket 我们知道进程通信的方法有管道、命名管道、信号、消息队列、共享内存、信号量,这些方法都要求通信的两个进程位于同一个主机。但是如果通信双方不在同一个主机又该如何进行通信呢?在计算机网络中我们就学过了tcp/ip协议族,其实使用tcp/ip协议族就能达到我们想要的效果,如下图(图片来源于《tcp/ip协议详解卷一》第一章1.3)           、                            图一 各协议所处层次 当然,这样做固然是可以的,但是,当我们使用不同的协议进行通信时就得使用不同的接口,还得处理不同协议的各种细节,这就增加了开发的难度,软件也不易于扩展。于是UNIX BSD就发明了socket这种东西,socket屏蔽了各个协议的通信细节,使得程序员无需关注协议本身,直接使用socket提供的接口来进行互联的不同主机间的进程的通信。这就好比操作系统给我们提供了使用底层硬件功能的系统调用,通过系统调用我们可以方便的使用磁盘(文件操作),使用内存,而无需自己去进行磁盘读写,内存管理。socket其实也是一样的东西,就是提供了tcp/ip协议的抽象,对外提供了一套接口,同过这个接口就可以统一、方便的使用tcp/ip协议的功能了。百说不如一图,看下面这个图就能明白了。                                         

面试刷题11:java系统中io的分类有哪些?

烂漫一生 提交于 2020-03-26 00:21:25
随着分布式技术的普及和海量数据的增长,io的能力越来越重要,java提供的io模块提供了足够的扩展性来适应。 我是李福春,我在准备面试,今天的问题是: java中的io有哪几种? java中的io分3类: 1,BIO ,即同步阻塞IO,对应java.io包提供的工具;基于流模型,虽然直观,代码实现也简单,但是扩展性差,消耗资源大,容易成为系统的瓶颈; 2,NIO,同步非阻塞io,对应java.nio包提供的工具,基于io多路复用; 核心类: Channel ,Selector , Buffer , Charset selector是io多路复用的基础,实现了一个线程高效管理多个客户端连接,通过事件监听处理感兴趣的事件。 3,AIO,即异步非阻塞io, 基于事件和回调 io的类层级 java各种IO的例子 java.io客户端连接服务端例子 package org.example.mianshi.io; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.ServerSocket; import java

Reactor模型

半世苍凉 提交于 2020-03-25 16:43:13
要无障碍阅读本文,需要对NIO有一个大概的了解,起码要可以写一个NIO的Hello World。 说到NIO、Netty,Reactor模型一定是绕不开的,因为这种模式架构太经典了,但是好多人在学习的时候,往往会忽视基础的学习,一上来就是Netty,各种高大上,但是却没有静下心来好好看看Netty的基石——Reactor模型。本文就带着大家看看Reactor模型,让大家对Reactor模型有个浅显而又感性的认识。 说到Reactor,不得不提到一篇文章,文章作者是大名鼎鼎的Doug Lea,Java中的并发包就是出自他之手,下面我试着从文章中挑出一些重要的内容,结合我的理解,来说说Reactor模型,看看Doug Lea大神的脑回路是多么的与众不同。 经典的服务设计 这是最为传统的Socket服务设计,有多个客户端连接服务端,服务端会开启很多线程,一个线程为一个客户端服务。 在绝大多数场景下,处理一个网络请求有如下几个步骤: read:从socket读取数据。 decode:解码,因为网络上的数据都是以byte的形式进行传输的,要想获取真正的请求,必定需要解码。 compute:计算,也就是业务处理,你想干啥就干啥。 encode:编码,同理,因为网络上的数据都是以byte的形式进行传输的,也就是socket只接收byte,所以必定需要编码。 下面我们来看看传统的BIO代码:

php socket 编程

做~自己de王妃 提交于 2020-03-25 15:02:30
文章目录 1.实验预习:tcp协议 2.SOCKET 编程 3.多进程编程 4 I/O复用 5. 信号通信以及守护进程 1.实验预习:tcp协议 TCP协议的创建: 创建流程:1.客户端主动调用connect发送SYN分节;2.服务器端必须回复一个ACK分节来确认客户端的SYN分节,并发送一个SYN分节给客户端;3.客户端对服务器端发送SYN分节进行ACK分节的确认 TCP协议的拆除(TCP为全双工的传输协议,所以需要4次分节的交换): 拆除流程:1.首先申请拆除的一端调用close发送一个FIN分节;2.另一端接收到FIN分节时,发送一个ACK分节进行确认;3.另一端要申请拆除连接时,也要发送一个FIN分节;4.接收端发送一个ACK分节进行确认 TCP的状态转换图 连接: 1.SYN_SENT主动打开,SYN分节已发送; 2.SYN_RCVD被动打开,SYN分节已接收; 3.ESTABLISHED已经建立连接 关闭: 1.FIN_WAIT_1发起主动关闭,FIN分节已发送; 2.CLOSE_WAIT被动关闭,FIN分节已接收,ACK分节已发送; 3.FIN_WAIT_2成功实现半关闭,ACK分节已接收; 4.LAST_ACK最终的ACK,FIN分节已发送; 5.TIME_WAIT FIN分节已接收,ACK分节已发送; 6.CLOSE ACK分节已接收,成功拆除连接] 2

linux网络编程常见socket错误分析

爱⌒轻易说出口 提交于 2020-03-25 12:46:23
3 月,跳不动了?>>> 常见socket错误码 EINTR: 阻塞的操作被取消阻塞的调用打断。如设置了发送接收超时,就会遇到这种错误。 只能针对阻塞模式的socket。读,写阻塞的socket时,-1返回,错误号为INTR。另外,如果出现EINTR即errno为4,错误描述Interrupted system call,操作也应该继续。如果recv的返回值为0,那表明连接已经断开,接收操作也应该结束。 ETIMEOUT: 1、操作超时。一般设置了发送接收超时,遇到网络繁忙的情况,就会遇到这种错误。 2、服务器做了读数据做了超时限制,读时发生了超时。 3、错误被描述为“connect time out”,即“连接超时”,这种情况一般发生在服务器主机崩溃。此时客户 TCP 将在一定时间内(依具体实现)持续重发数据分节,试图从服务 TCP 获得一个 ACK 分节。当最终放弃尝试后(此时服务器未重新启动),内核将会向客户进程返回 ETIMEDOUT 错误。如果某个中间路由器判定该服务器主机已经不可达,则一般会响应“destination unreachable”-“目的地不可达”的ICMP消息,相应的客户进程返回的错误是 EHOSTUNREACH 或ENETUNREACH。当服务器重新启动后,由于 TCP 状态丢失,之前所有的连接信息也不存在了,此时对于客户端发来请求将回应 RST

django 代码

落花浮王杯 提交于 2020-03-25 07:17:34
Django 代码 day1 不含文件的初级版本 连抄带改 import socket from threading import Thread server = socket.socket() server.bind(('127.0.0.1',8001)) server.listen() def func(conn): # 接受请求数据 # 自从用了这个之后 不接收就不渲染 发过去的网页了 client_msg = conn.recv(1024).decode('utf-8') print(client_msg) # 组合响应协议的消息格式,然后发送响应信息 conn.send('HTTP/1.1 200 ok \r\n\r\n'.encode('utf-8')) # 打开index.html文件,返回给前端 with open('01 web 不含文件.html','rb')as f: data = f.read() conn.send(data) # 放在这 否则影响代码渲染 具体为什么? conn.send('who are you '.encode('utf-8')) # 防止资源占用 所以要断开 无保存连接 conn.close() # for i in range(10): while 1 : # 接收连接 如果不在这里会执行100个 只接收了一个,只执行一个线程 #

Java网络编程

拟墨画扇 提交于 2020-03-25 05:50:39
网络编程三要素: A:IP地址 B:端口 C:协议 举例: 我想和林青霞说话了。肿么办? A:我要找到林青霞。 B:对她说话,要对耳朵说。 C:我说什么呢?"I Love You" 但是,她没学过英语,听不懂。 我没必要说英语,说汉语就可以了:我爱你 IP地址: 网络中计算机的唯一标识。 计算机只能识别二进制的数据,所以我们的IP地址应该是一个二进制的数据。 但是呢,我们配置的IP地址确不是二进制的,为什么呢? IP:192.168.1.100 换算:11000000 10101000 00000001 01100100 假如真是:11000000 10101000 00000001 01100100的话。 我们如果每次再上课的时候要配置该IP地址,记忆起来就比较的麻烦。 所以,为了方便表示IP地址,我们就把IP地址的每一个字节上的数据换算成十进制,然后用.分开来表示: "点分十进制" IP地址的组成:网络号段+主机号段 A类:第一号段为网络号段+后三段的主机号段 一个网络号:256*256*256 = 16777216 B类:前二号段为网络号段+后二段的主机号段 一个网络号:256*256 = 65536 C类:前三号段为网络号段+后一段的主机号段 一个网络号:256 IP地址的分类: A类 1.0.0.1---127.255.255.254 (1)10.X.X.X是私有地址

LNMP分离部署

99封情书 提交于 2020-03-25 05:00:32
作者:逃离地球的小小呆 来源:CSDN 原文: https://blog.csdn.net/gui951753/article/details/80204325 版权声明:本文为博主原创文章,转载请附上博文链接! LNMP之间的数据流转: 第一步:浏览器发送http request请求到服务器(Nginx),服务器响应并处理web请求,将一些静态资源(CSS,图片,视频等)返回浏览器。 第二步:将php脚本通过接口传输协议(网关协议)PHP-FCGI(fast-cgi)传输给PHP-FPM(进程管理程序),PHP-FPM不做处理,调用PHP解析器进程,PHP解析器解析php脚本信息。PHP解析器进程可以启动多个,进行并发执行。 第三步:PHP脚本通过PHP和数据库的连接,完成对数据库进行增删改查的功能,并从数据库中获取数据。 第四步:将获取到的数据返回到PHP-FPM,PHP-FPM再通过fast-cgi的形式将脚本信息传送给Nginx。 第五步:服务器再通过Http response的形式传送给浏览器。浏览器再进行解析与渲染然后进行呈现。 Nginx+FastCGi工作流程 Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过Fast-CGI接口来调用。Fast-CGI接口在Linux下是socket(这个socket可以是文件socket

网络编程之socket新解

这一生的挚爱 提交于 2020-03-25 03:49:31
   由于工作并不是很忙,闲暇之余就读了下tomcat的源代码。我是从事java服务器开发工作的,大体的一些服务器线程模型我都是了解的。其大部分都是由一个线程调用监听端口等待客户端的链接,建立连接后再交由其他的线程负责具体的网络io操作。可tomcat居然是用多个线程调用同一个ServerSocket实例的accept方法。我读过mina也读过netty的源码,自己在大学时也写过不少的基于socket通信的程序,但是这种用法自己从未想过也从未见过。(恕本人咕噜寡闻了,-_-|||)不免好奇,这么做原来没问题啊?可这么做能有什么好处吗?   要明白这么做的道理,恐怖不得不去搞清楚套接字的accept方法底层到底干了什么,与TCP的三步握手又是什么关系。我查了一些资料大体把这些搞明白了,在这里记录下来以加强自己的认识,也同时共享给哪些跟我一样对socket的认识有所偏差的人。   一、首先说一下TCP三步握手的基本流程,如下图:   首先,请求端(客户端)发送一个包含SYN标志的TCP报文,SYN即同步(Synchronize),同步报文会指明客户端使用的端口以及TCP连接的初始序号;   第二步,服务器在收到客户端的SYN报文后,进入SYN-RECEVIED状态并将这个还没有完全建立起的连接放到半连接队列。还要返回一个SYN+ACK的报文,表示客户端的请求被接受,同时TCP序号被加一

socket example

自闭症网瘾萝莉.ら 提交于 2020-03-25 03:16:27
for code copy in the future simple server and client may be useful for copy in the future server: [cpp] view plain copy #include <errno.h> #include "sys/types.h" #include "sys/socket.h" #include "sys/stat.h" #include "unistd.h" #include <netinet/in.h> //#include <arpa/inet.h> #include <fcntl.h> #define SERVER_PORT (56738) #define SERVER_IP "127.0.0.1" #define LOG printf static void handle_crashing_process_new( int fd) { int n; unsigned int tid; int length = getpid(); int retry = 30; printf( "handle_crashing_process_new in\n" ); while ((n = read(fd, &tid, sizeof (unsigned))) != sizeof (unsigned