socket

java NIO基础

别来无恙 提交于 2020-02-13 20:47:49
Java I/O 分类 磁盘操作:File 字节操作:InputStream 和 OutputStream 字符操作: Writer 和 Reader 对象操作:Serializable 网络操作:Socket 新的输入/输出:NIO NIO (1)通道(Channel) 通道 Channel 是对原 I/O 包中的流的模拟,Channel 本身不能直接访问数据,Channel 只能与Buffer 进行交互。 通道与流的不同之处在于,流只能在一个方向上移动(一个流必须是 InputStream 或者 OutputStream 的子类),而通道是双向的,可以用于读、写或者同时用于读写。 通道包括以下类型: FileChannel:从文件中读写数据; DatagramChannel:通过 UDP 读写网络中数据; SocketChannel:通过 TCP 读写网络中数据; ServerSocketChannel:可以监听新进来的 TCP 连接,对每一个新进来的连接都会创建一个 SocketChannel。 (2)缓冲区(Buffer) 发送给一个通道的所有数据都必须首先放到缓冲区中,同样地,从通道中读取的任何数据都要先读到缓冲区中。也就是说,不会直接对通道进行读写数据,而是要先经过缓冲区。 缓冲区实质上是一个数组,但它不仅仅是一个数组。缓冲区提供了对数据的结构化访问

Go实现简单的Socket服务端笔记(一)

元气小坏坏 提交于 2020-02-13 17:28:55
###第一步 实现socket服务 简单实现一个socket服务,能接收客户端连接并接收数据 本文代码查看github: https://github.com/zboyco/go-server/tree/step-1 Go语言的socket服务由标准库 net 提供,主要就使用三个方法. ResolveTCPAddr 用于获取一个TCPAddr ListenTCP 开始监听 Accept 接受会话 下面直接放代码 package main import ( "fmt" "net" ) func main ( ) { //定义一个本机端口 localAddress , _ := net . ResolveTCPAddr ( "tcp4" , ":9043" ) //监听端口 tcpListener , err := net . ListenTCP ( "tcp" , localAddress ) if err != nil { fmt . Println ( "监听出错, " , err ) return } //程序返回后关闭socket defer tcpListener . Close ( ) fmt . Println ( "等待客户连接..." ) //开始接收连接 conn , err := tcpListener . Accept ( ) if err != nil {

Go实现简单的Socket服务端笔记(二)

流过昼夜 提交于 2020-02-13 17:22:48
第二步 循环读取数据 利用for循环,等待客户端发送数据 本文代码查看github: https://github.com/zboyco/go-server/tree/step-2 修改上一步的代码,让服务端循环接收客户端发送的消息,主要使用for循环,直接上代码 package main import ( "fmt" "net" ) func main ( ) { //定义一个本机端口 localAddress , _ := net . ResolveTCPAddr ( "tcp4" , ":9043" ) //监听端口 tcpListener , err := net . ListenTCP ( "tcp" , localAddress ) if err != nil { fmt . Println ( "监听出错, " , err ) return } //程序返回后关闭socket defer tcpListener . Close ( ) fmt . Println ( "等待客户连接..." ) //开始接收连接 conn , err := tcpListener . Accept ( ) if err != nil { fmt . Println ( "客户连接失败, " , err ) } //获取连接地址 remoteAddr := conn .

Go实现简单的Socket服务端笔记(三)

六眼飞鱼酱① 提交于 2020-02-13 17:17:26
利用goroutine实现同时多个客户端连接 将数据读取放入单独的方法中,利用goroutine运行 本文代码查看github: https://github.com/zboyco/go-server/tree/step-3 要实现多个客户端连接,需要将每个客户端放入单独的线程处理,通常我们使用多线程实现这个功能,但Go语言提供的 goroutine, 可以非常方便的实现并行(goroutine并不是多线程) 将接收数据的相关代码放入单独的方法中: func handleClient ( conn net . Conn ) { //获取连接地址 remoteAddr := conn . RemoteAddr ( ) fmt . Println ( "客户地址:" , remoteAddr ) //定义一个数据接收Buffer var buf [ 1024 ] byte for { fmt . Println ( "等待接收数据..." ) //读取数据 n , err := conn . Read ( buf [ 0 : ] ) if err != nil { fmt . Println ( "数据接收错误, " , err ) return } //将bytes转为字符串 result := string ( buf [ 0 : n ] ) //输出结果 fmt .

nginx和php-fpm调用方式

喜你入骨 提交于 2020-02-13 14:35:34
nginx和php-fpm调用方式 一.背景: 在开发中碰到一个问题,项目以nginx+php-fpm形式访问交互,结果访问项目时报错如下图: 二.分析: 提示很明确嘛,去看error.log(在nginx.conf或者vhost里头配置的,找到你对应路径即可) 错误信息如下: 1 2 3 2017/09/18 10:46:21 [error] 3880#0: *92 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.33.10, server: local.helios.com, request: "GET /v1/room/detail.json HTTP/1.1" , upstream: "fastcgi://127.0.0.1:9000" , host: "local.helios.com" 或 1 2 3 2017 /09/18 14:30:42 [crit] 5375 #0: *43 connect() to unix:/tmp/php-cgi.sock failed (2: No such file or directory) while connecting to upstream, client: 192.168.33.10,

Netty学习(1):IO模型之BIO

牧云@^-^@ 提交于 2020-02-13 09:38:44
概述 Netty其实就是一个异步的、基于事件驱动的框架,其作用是用来开发高性能、高可靠的IO程序。 因此下面就让我们从Java的IO模型来逐步深入学习Netty。 IO模型 IO模型简单来说,就是采用如何的方式来进行数据的接受和发送,因为存在着发送方和接收方两个角色,因此IO模型一般分为以下3类: BIO(同步阻塞)、NIO(同步非阻塞)、AIO(异步非阻塞) 。其3者的区别如下: BIO:是最传统的Java IO模型,采用的方式为服务器新接受到一个连接,就建立一个线程,但是如果这个连接不做任何事情,该线程也会被创建,闲置着,增加不必要的开销。 NIO:服务器用一个线程处理多个请求,将所有请求注册到一个线程管理的多路复用器(Selector)上。适用于连接数量多,但连接比较轻量的服务上,如聊天,弹幕等。 AIO:其特点是由OS完成后,才通知服务端程序启动程序来处理,使用场景为相册服务器等。因不是很清楚具体实现,因此在这不展开了。 BIO代码实现 使用BIO模型来实现一个服务器端和客户端,并采用线程池的概念,使其可以连接多个客户端。 服务端 首先,让我们来看建立一个服务端需要哪些步骤: // 创建线程池,如果有连接,就创建一个线程 ps:这里手动指定参数创建线程池会更好,但这里因为不是重点,因此就采用默认的线程池来实现。 ExecutorService executorService

Linux ss命令详解

喜夏-厌秋 提交于 2020-02-13 09:28:56
ss是Socket Statistics的缩写。顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。 当服务器的socket连接数量变得非常大时,无论是使用netstat命令还是直接cat /proc/net/tcp,执行速度都会很慢。 ss快的秘诀在于,它利用到了TCP协议栈中tcp_diag。tcp_diag是一个用于分析统计的模块,可以获得Linux 内核中第一手的信息,这就确保了ss的快捷高效 。 常用的命令展示 ss -t -a 【显示TCP连接】 ss -tunlpe (netstat -tunlpe) -t: tcp -u:udp -a: all -e, --extended show detailed socket information -l: listening 【ss -l列出所有打开的网络连接端口】 -s: summary 【显示 Sockets 摘要】 -p: progress -n: numeric 【不解析服务名称】 -r: resolve 【解析服务名称】 -m: memory 【显示内存情况】 查看进程使用的socket ss –pl 找出打开套接字/端口应用程序 ss -lp | grep 22 显示所有UDP

Python-网络编程之socket

*爱你&永不变心* 提交于 2020-02-13 07:50:53
Socket 一、代码逻辑图 2、socket方法 sk.bind(address)   s.bind(address) 将套接字绑定到地址。address地址的格式取决于地址族。在AF_INET下,以元组(host,port)的形式表示地址。 sk.listen(backlog)   开始监听传入连接。backlog指定在拒绝连接之前,可以挂起的最大连接数量。 backlog等于5,表示内核已经接到了连接请求,但服务器还没有调用accept进行处理的连接个数最大为5 这个值不能无限大,因为要在内核中维护连接队列 sk.setblocking(bool)   是否阻塞(默认True),如果设置False,那么accept和recv时一旦无数据,则报错。 sk.accept()   接受连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。   接收TCP 客户的连接(阻塞式)等待连接的到来 sk.connect(address)   连接到address处的套接字。一般,address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。 sk.connect_ex(address)   同上,只不过会有返回值,连接成功时返回 0 ,连接失败时候返回编码,例如:10061

c++socket编程(1)

放肆的年华 提交于 2020-02-13 07:50:31
sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);基于TCP的socket编程是采用的流式套接字。 服务器端编程的步骤: 1:加载套接字库,创建套接字(WSAStartup()/socket()); 2:绑定套接字到一个IP地址和一个端口上(bind()); 3:将套接字设置为监听模式等待连接请求(listen()); 4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept()); 5:用返回的套接字和客户端进行通信(send()/recv()); 6:返回,等待另一连接请求; 7:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。 客户端编程的步骤: 1:加载套接字库,创建套接字(WSAStartup()/socket()); 2:向服务器发出连接请求(connect()); 3:和服务器端进行通信(send()/recv()); 4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。 第一式: 加载/释放Winsock库: 1.加载方法: WSADATA wsa; /*初始化socket资源*/ if (WSAStartup(MAKEWORD(1,1),&wsa) != 0) {

Python协程

江枫思渺然 提交于 2020-02-13 05:32:49
一、一些基本概念: 协程(Coroutine),又称微线程,纤程,一种用户级的轻量级线程。 栈(Stack)是一个数据集合,可以理解为只能在一端进行插入或删除操作的列表。 协程拥有自己的寄存器上下文和栈,协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此:协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态。 在并发编程中,协程与线程类似,每个协程表示一个执行单元,有自己的本地数据,与其他协程共享全局数据和其他资源 协程需要用户自己来编写调度逻辑,对于CPU来说,协程其实是单线程,所以cpu不用去考虑怎么调度,切换上下文,这就省去了cpu的切换开销,所以协程一定程度上又好于多线程 协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续)。协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序。 协程的适用场景:当程序中存在大量不需要CPU的操作时(IO),适用于协程; 二、yield回顾: def f(): print('ok1') count=yield 5 print(count) print('ok2') yield 6 gen=f() # ret=next(gen) # print(ret) ret=gen