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)的形式表示地址。address(host 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)
连接指定地址的socket。address用元组表示。如果连接出错,返回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()
1 import socket 2 3 client = socket.socket() 4 5 client.connect(("localhost",9998)) 6 7 client.send(b"hey") 8 9 client.close()
一个连接建立起来后,多次的数据交互
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()
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()
客户端一断开,服务器端就收不到数据了,但是不会报错,就进入了死循环模式
加个判断服务器接到的数据是否为空
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()
以上是关于socket的主要内容,如果未能解决你的问题,请参考以下文章