3 socket网络编程
什么是socket
Socket又称为套接字,它是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
客户端和服务器框架
c/s框架:客户端(client)/服务端(server)架构
b/s架构:浏览器(browser)/服务器(server)架构
硬件cs框架:打印机
软件cs框架:浏览器, qq, 微信等......
网络通信的流程
集线器:将所有电脑联通在一起
交换机:升级版本的集线器
网卡:接收处理电信号
Mac地址:物理地址: 68-F7-28-71-A4-9D 前三位厂商编号 后三位生产流水号,全球唯一
IP 地址: IPv4 地址: 192.168.12.16 划分广播域
ip地址段:192.168.12.0 ----192.168.12.255
ip地址段:192.168.0.0 ---- 192.168.255.255
判断是否是同一子网的方法
目标ip192.168.12.16
子网掩码:255.255.255.0
分别转换成二进制上下对齐两两配对从左到右进行''且''拼接,再转换成10进制
目标ip二进制: 11000000.10101000.00001100.00010000
子网掩码二进制: 11111111.11111111.11111111.00000000
拼接后的结果: 11000000.10101000.00001100.00000000 转换成10进制:192.168.12.0
DHCP协议:自动获取IP地址
DNS:域名解析
Arp协议:通过IP地址获取mac地址
路由器:转发消息,管理内网
路由协议:计算路由转发的最优路径
端口:表示电脑上的某个应用程序
ip + 端口 = 能够唯一锁定一台电脑和这个电脑上的某个应用程序
网关:把关用的,就是说对外的请求要经过网关
NAT技术:网络的地址转换,内网ip地址转换为公网或外网的IP地址
TCP客户端与TCP服务端的流程图
socket()模块函数用法
服务端套接字函数
bind():绑定地址(host,port) 得到套接字,在AF_INET下,以元组形式表示地址
listen():开始监听TCP,默认设置为5
accept():被动接受TCP客户端连接,等待连接的到来.
客户端套接字函数
connect():主动初识化TCP服务器连接,一般address的格式元组,如果连接出错就会放回socket.error错误
公共用途套接字函数
recv():接收TCP数据,数据以字符串形式返回
send(): 发送TCP数据,将string中的数据发送到连接的套接字
close():关闭套接字
单个客户端与服务端通信(low版)
服务端
# -*- coding:utf-8 -*- #导入socket模块 import socket #创建socket对象,创建一个手机 server = socket.socket() #给程序设置一个ip地址和端口号,买一个手机卡 ip_port = ('192.168.12.35',9000) #绑定ip地址和端口,插卡 server.bind(ip_port) #监听ip地址和端口,简称开机 server.listen() #等待建立连接,conn是连接通道,addr是客户端的地址 conn,addr = server.accept() #服务端通过conn连接通道来收消息,通过recv方法,rcv里面的参数是字节(B),1024的意思1024B = 1kb from_client_msg = conn.recv(1024) print("客服端说:",from_client_msg.decode("utf-8")) #回复消息,通过send方法,参数必须是字节形式的 conn.send("我是你的服务器".encode("utf-8")) #关闭通道,关闭电话,通过close方法 conn.close() #关闭socket对象,关机 server.close()
客户端
# -*- coding:utf-8 -*- #导入socket import socket #创建一个socket对象 client = socket.socket() #找到服务端的ip地址和端口 server_ip_port = ('192.168.12.35',9000) #连接服务端的应用程序,通过connect方法,参数是服务端的ip地址和端口,打电话 client.connect(server_ip_port) #发信息,用sed方法,但是调用者是client的socket对象 client.send("你好呀!".encode("utf-8")) from_server_msg = client.recv(1024) print('服务端说:',from_server_msg.decode("utf-8")) client.close()
循环打印的客户端与服务端
服务端
# -*- coding:utf-8 -*- #导入socket模块 import socket #创建socket对象,创建一个手机 server = socket.socket() #给程序设置一个ip地址和端口号,买一个手机卡 ip_port = ('192.168.12.35',9000) #绑定ip地址和端口,插卡 server.bind(ip_port) #监听ip地址和端口,简称开机 server.listen() #等待建立连接,conn是连接通道,addr是客户端的地址 conn,addr = server.accept() while True: #服务端通过conn连接通道来收消息,通过recv方法,rcv里面的参数是字节(B),1024的意思1024B = 1kb from_client_msg = conn.recv(1024) if from_client_msg.decode("utf-8").upper() == "Q": break print("客服端说:",from_client_msg.decode("utf-8")) to_client_msg = input('对客户端说') # 回复消息,通过send方法,参数必须是字节形式的 conn.send(to_client_msg.encode("utf-8")) if to_client_msg.upper() == "Q": break #关闭通道,关电话,通过close方法 conn.close() #关闭socket对象,关机 server.close()
客户端
# -*- coding:utf-8 -*- #导入socket import socket #创建一个socket对象 client = socket.socket() #找到服务端的ip地址和端口 server_ip_port = ('172.18.236.104',8080) #连接服务端的应用程序,通过connect方法,参数是服务端的ip地址和端口,打电话 client.connect(server_ip_port) while True: to_server_msg = input("对服务端说:") # 发信息,用sed方法,但是调用者是client的socket对象 client.send(to_server_msg.encode("utf-8")) if to_server_msg.upper() == "Q": # client.close() break from_server_msg = client.recv(1024) if from_server_msg.decode("utf-8").upper() == "Q": break print('服务端说:',from_server_msg.decode("utf-8")) client.close()