一、网络编程基础
- C/S架构C/S即:Client与Server ,中文意思:客户端与服务器端架构
- B/S即:Browser与Server,中文意思:浏览器端与服务器端架构,这种架构是从用户层面来划分的。
- ip:规定网络地址的协议叫ip协议,定义的地址称之为ip地址,广泛采用的v4版本即ipv4,
- mac地址:送端和接收端的地址便是指网卡的地址,即mac地址。
-
arp协议(地址解析协议) ——查询IP地址和MAC地址的对应关系
- "端口"是英文port的意译,可以认为是设备与外界通讯交流的出口。
-
子网掩码:判断任意两个IP地址是否处在同一个子网络
-
TCP协议:TCP 将在两个应用程序之间建立一个全双工 (full-duplex) 的通信。这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。(三次握手,四次挥手)
-
UDP协议:当应用程序希望通过UDP与一个应用程序通信时,传输数据之前源端和终端不建立连接。当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。
- osi七层模型
二、socket
2.1 基于TCP协议的socket
tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端
基础程序:
server端:
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8898)) 把地址绑定到套接字
sk.listen() 监听链接
conn,addr = sk.accept() 接受客户端链接
ret = conn.recv(1024) 接收客户端信息
print(ret) 打印客户端信息
conn.send(b'hi') 向客户端发送信息
conn.close() 关闭客户端套接字
sk.close() 关闭服务器套接字(可选)
client端:
import socket
sk = socket.socket() 创建客户套接字
sk.connect(('127.0.0.1',8898)) 尝试连接服务器
sk.send(b'hello!')
ret = sk.recv(1024) 对话(发送/接收)
print(ret)
sk.close() 关闭客户套接字
循环中文交流:
server端:
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8800))
sk.listen()
conn,addr = sk.accept()
while 1:
ret = conn.recv(1024).decode('utf-8')
if ret == 'q':
break
print(ret)
b = input('对她说的话:')
conn.send(bytes(b,encoding='utf-8'))
conn.close()
sk.close()
client端:
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',8800))
while True:
a = input('发给他的话:')
if a == 'q':
break
sk.send(bytes(a,encoding='utf-8'))
ret = sk.recv(1024).decode('utf-8')
print(ret)
sk.close()
问题:有的同学在重启服务端时可能会遇到
OSError: [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。
解决方法:
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) 在bind前加
加入一条socket配置,重用ip和端口
import socket
from socket import SOL_SOCKET,SO_REUSEADDR
sk = socket.socket()
sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) 就是它,在bind前加
sk.bind(('127.0.0.1',8898)) #把地址绑定到套接字
sk.listen() #监听链接
conn,addr = sk.accept() #接受客户端链接
ret = conn.recv(1024) #接收客户端信息
print(ret) #打印客户端信息
conn.send(b'hi') #向客户端发送信息
conn.close() #关闭客户端套接字
sk.close() #关闭服务器套接字(可选)