@开启博客之路
python3学习之socket
socket的创建
1,需要加载socket模块,import socket
2,创建套接字socket.socket(socket_family, socket_type, protocol=0),
socket_family:
AF_UNIX:用于本地进程间通信的套接字,发送的数据到达内核缓冲区,内核根据指定路径名将数据拷贝到接收端缓冲区,速度快,节省CPU
AF_INET(IPV4):既可用于本地进程间通信,又可用于不同主机间通信。发送的数据到达内核缓冲区,经过层层编码通过网卡发送到接收端,接收端又经过层层解码到达接收端应用进程。
AF_INET6(IPV4)。
socket_type:
SOCK_STREAM: 面向连接的套接字,TCP
SOCK_DGRAM:无连接的套接字,UDP
SOCK_RAW:原始套接字。
protocol:一般默认为0。
server
流程如下:
创建:创建套接字,
server = socket.socket(socket_family, socket_type, protocol=0)
绑定:将地址(host,port)元组绑定到套接字上,
server.bind((host,port))
监听:服务器在绑定的地址处监听,参数表示可以排队的最大连接数,一般设置为5,
server.listen(5)
连接:服务器监听到客户端请求之后,接收请求,建立起了连接,
client,add = server.accept()#阻塞式,返回元组
client
创建套接字,
client= socket.socket(socket_family, socket_type, protocol=0)
连接服务器,address为元组(host,port),
client.connect((ip_server,port))
公共
recv(buffersize),接收数据,数据以字符串形式返回,bufsize指定要接收的最大数据量,一般为1024,#阻塞式
send(string),发送数据,将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小
sendall(string),完整发送string数据到连接的套接字,成功返回None,失败则抛出异常。
close(),关闭套接字
代码示例
#server
#服务器添加多线程,接收多个客户端消息,当收到"finished",主动与客户端断开,正常通讯则自动发送当前时间。
import socket
from threading import Thread#多线程
import time
client_connect = []
def transThreadFunc(connec_of_client):#线程函数
while(1):
try:
message = connec_of_client.recv(1024)#接收消息
print("server recevice message:",message.decode())
except (ConnectionResetError,ConnectionAbortedError):
connec_of_client.close()
break
else:
if message.decode() == 'finished': #结束对话标志
try:
client_connect.remove(connec_of_client)
connec_of_client.close()
break
except Exception as e:
break
else:
try:
send_status = connec_of_client.sendall(show().encode())
except Exception as e:
break
def show():#
currentTime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
return currentTime
if __name__ == "__main__":
global server_socket
server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)#IPv4,TCP,协议自选
ip = "192.168.0.12"
port = 9999
server_socket.bind((ip,port))#绑定
server_socket.listen(5)#监听
while(1):
connect,add = server_socket.accept()#阻塞
if connect not in client_connect:
client_connect.append(connect)
print(client_connect)
trans_thread = Thread(target = transThreadFunc,args = (connect,))#多线程,接收多个客户端请求
trans_thread.start()
else:
pass
#client
#客户端与服务器通信,当发送"finished"则主动与服务器断开。
import socket
# import threading
import time
def show():
currentTime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
return currentTime
if __name__ == '__main__':
client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)#IPv4,TCP,协议自选,创建套接字
ip_server = "192.168.0.12"
port = 9999
client_socket.connect((ip_server,port))#连接服务器
print(client_socket)
while(1):
sendDatas = input("cilent send message:")
sendStatus = client_socket.sendall(sendDatas.encode())#发送信息
if sendDatas == "finished":
client_socket.close()
break
else:
message = client_socket.recv(1024)#接收信息
print("cilent recieve message = ",message.decode())
#执行结果
#server
[<socket.socket fd=820, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.0.12', 9999), raddr=('192.168.0.245', 60471)>]
server recevice message: hello
server recevice message: hello ha
server recevice message: finished
#client
<socket.socket fd=556, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.0.245', 60471), raddr=('192.168.0.12', 9999)>
cilent send message:hello
cilent recieve message = 2020-07-15 15:19:28
cilent send message:hello ha
cilent recieve message = 2020-07-15 15:19:45
cilent send message:finished