python socket学习笔记
socket介绍:
分类:
流式套接字: SOCK_STREAM 传输层基于TCP协议进行通信
数据报套接字: SOCK_DGRAM 传输层基于UDP协议进行通信
原始套接字: SOCK_RAW 访问底层协议的套接字
套接字使用的流程
socket --> bind --> listen --> accept --> send/receive --> close
socket编程步骤
import socket
1, 创建套接字
socket(socket_family=AF_INET,
socket_type = SOCK_STREAM,
proto = 0)
socket_family 选择协议族种类: AF_INET: IPV4
socket_type: 套接字种类, SOCK_STREAM/ SOCK_DGRAM
proto 子协议,通常为0
2,绑定IP和port
sock.bind(('ip_address',port))
功能:绑定IP和端口
参数是一个元组;
3, 让其具有监听功能
sock.listen(n)
功能: 使套接字变为监听套接字,同时创建监听队列;
参数:n监听队列大小
4, 等待客户端连接
sock.accept()
功能:阻塞等待客户端连接;
返回值: 第一个,返回一个 新的套接字,用来和客户端通信
第二个, 返回连接的客户端的地址
5, 消息的收发
recv(buffer):
功能:接收消息;
buffer: 单次接收消息的大小
返回值: 返回接收到的内容
send(data):
功能:发送消息
data: 发送内容, byte格式;
返回值: 发送了多少字节
6, 关闭套接字
sock.close()
关闭套接字
server端程序:
from socket import *
#create socket
sock = socket(AF_INET,SOCK_STREAM,0)
#BIND 绑定本机地址和端口号;
sock.bind(('192.168.10.1',8888))
#listen
sock.listen(5)
#使用外层循环可以让server 多次接受连接
while True:
print('waitting for connect...')
#accept
sock_c, addr_c = sock.accept()
print('{} has connect.'.format(addr_c))
#rec,send
#内存循环,可以和client多次交互发送消息
while True:
data = sock_c.recv(1024)
if not data:
break
print(data.decode())
msg = input('>>>')
sock_c.send(msg.encode())
if not msg:
break
#close
sock_c.close()
sock.close()
Client端程序:
from socket import *
#create
sock_client = socket(AF_INET, SOCK_STREAM, 0)
#connect
#填写server的地址和端口
sock_client.connect(('192.168.10.1',8888))
#send
while True:
msg = input('>>>')
sock_client.send(msg.encode())
if not msg:
break
#receive
data = sock_client.recv(1024)
if not data:
break
print(data.decode())
#close
sock_client.close()