socket

Posted hmm1995

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了socket相关的知识,希望对你有一定的参考价值。

Socket

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket, 又称为套接字

socket模块是针对 服务器端 和 客户端Socket 进行【打开】【读写】【关闭】

技术分享图片

过程

1、服务器根据IP地址类型、socket类型、协议来创建socket对象。

2、为服务器socket对象绑定IP地址和端口号。

3、服务器socket监听端口号请求,随时准备接收来自客户端的请求,此时,socket并没有打开。

4、客户端创建socket对象。

5、客户端打开socket,根据IP地址和端口号试图连接服务器。

6、服务器监听到客户端的连接请求,被动打开socket

7、服务器socket通过Accept进入阻塞状态,等待客户端返回连接信息。

8、客户端连接成功,返回连接信息给服务器。

9、服务器连接成功。

10、服务器与客户端之间,根据一收一发原则发送和接收数据。

11、客户端socket关闭。

12、服务器socket关闭。

 方法  

 import socket

1. socket()

socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)

family = AF_INET 表示服务器之间的通信。AF_UNIX  表示Unix不同进程间的通信

type = SOCK_STREAM  表示TCP连接。SOCK_DGRAM  表示UDP连接。

2. bind()

sk.bind(address)

将套接字绑定到地址(将地址与socket绑定)address地址的格式取决于地址族。在AF_INET下,以元组(host,port)的形式表示地址。addresshost IP,端口号)。

3. listen()

sk.listen(backlog)

监听客户端的连接。backlog为可选参数。backlog指定在拒绝连接之前,可以挂起的最大连接数量,表示最大等待连接数量

backlog等于5,表示内核已经接到了连接请求,但服务器还没有调用

accept进行处理的连接个数最大为5,这个值不能无限大,因为要在内核中维护连接队列

4.accept()

sk.accept()

接受连接并返回(conn,address,其中conn是新的套接字对象,表示客户端的sk对象,,可以用来接收和发送数据。address是连接客户端的地址。

5.recv()

sk.recv(bufsize[,flag])

接受套接字的数据。数据以字符串形式返回,bufsize指定最多可以接收的数量。flag提供有关消息的其他信息,通常可以忽略。

6.connect()

sk.connect(address)

连接指定地址的socketaddress用元组表示。如果连接出错,返回socket.error错误。

7.send()

sk.send(data)data发送给连接的socket

sk.send(string[,flag])string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。即:可能未将指定内容全部发送。 

基本Socket实例

SocketServer.py运行起来后, 接收了一次客户端的data就退出

技术分享图片
 1 import socket
 2 
 3 server = socket.socket() #获得socket实例
 4 
 5 server.bind(("localhost",9998)) #绑定ip port
 6 server.listen()  #开始监听
 7 print("等待客户端的连接...")
 8 conn,addr = server.accept() #接受并建立与客户端的连接,程序在此处开始阻塞,只到有客户端连接进来...
 9 print("新连接:",addr )
10 
11 data = conn.recv(1024)
12 print("收到消息:",data)
13 
14 
15 server.close()
SocketServer.py
技术分享图片
1 import socket
2 
3 client = socket.socket()
4 
5 client.connect(("localhost",9998))
6 
7 client.send(b"hey")
8 
9 client.close()
SocketClient.py

 

一个连接建立起来后,多次的数据交互

技术分享图片
 1 import socket
 2 
 3 server = socket.socket() #获得socket实例
 4 
 5 server.bind(("localhost",9998)) #绑定ip port
 6 server.listen()  #开始监听
 7 print("等待客户端的连接...")
 8 conn,addr = server.accept() #接受并建立与客户端的连接,程序在此处开始阻塞,只到有客户端连接进来...
 9 print("新连接:",addr )
10 while True:
11 
12     data = conn.recv(1024)
13 
14     print("收到消息:",data)
15     conn.send(data.upper())
16 
17 server.close()
SocketServer.py
技术分享图片
 1 import socket
 2 
 3 client = socket.socket()
 4 
 5 client.connect(("localhost",9998))
 6 
 7 while True:
 8     msg = input(">>:").strip()
 9     if len(msg) == 0:continue
10     client.send( msg.encode("utf-8") )
11 
12     data = client.recv(1024)
13     print("来自服务器:",data)
14 
15 client.close()
SocketClient.py

 

客户端一断开,服务器端就收不到数据了,但是不会报错,就进入了死循环模式

 加个判断服务器接到的数据是否为空

技术分享图片
 1 import socket
 2 
 3 server = socket.socket() #获得socket实例
 4 
 5 server.bind(("localhost",9998)) #绑定ip port
 6 server.listen()  #开始监听
 7 print("等待客户端的连接...")
 8 conn,addr = server.accept() #接受并建立与客户端的连接,程序在此处开始阻塞,只到有客户端连接进来...
 9 print("新连接:",addr )
10 while True:
11 
12     data = conn.recv(1024)
13     if not data:
14         print("客户端断开了...")
15         break
16     print("收到消息:",data)
17     conn.send(data.upper())
18 
19 server.close()
SocketServer.py

 

以上是关于socket的主要内容,如果未能解决你的问题,请参考以下文章

Python干货socket中的listen()参数(数字)到底代表什么?

paper 78:sniff抓包程序片段

通过 c# 与 socket.io 服务器通信

微信小程序代码片段

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js