网络编程:通常来说就是基于网络通信的软件or程序
几个重要的概念:
1.IP:网络设备的唯一标识,用于在网络中找到要传输/接收数据的特定对象
2.端口(端口号):网络设备上运行着多个软件/程序,每个程序都有一个对应的端口,找到对应的的端口可以和对应的程序进行交互
流程:在网络中通过IP找到特定的网络设备,再通过特定的端口号找到特定的软件/程序,进行连接/网络通信
补充内容:
IP地址一共有4位,第1位,1~223,第234位,0~255
注意事项:
① IP地址分为两类 : IPv4和IPv6
② IPv4是目前使用的IP地址
③ IPv6是未来使用的IP地址
端口号扩展
① 知名端口号:范围从0到1023,这些端口号一般固定分配给一些服务(21端口:FTP(文件传输协议)服务,22端口:SSH(安全外壳协议,主要用于远程连接与文件传输),25端口:SMTP(简单邮件传输协议)服务,80端口:HTTP服务,443端口:HTTPS服务)
② 动态端口号:一般开发应用程序使用端口号称为动态端口号。
范围:从1024到65535,如果开发的程序没有设置端口号,操作系统会在动态端口号这个范围内随机生成一个给开发的应用程序使用。
注意:当运行一个程序默认会有一个端口号,当程序退出时,所占用的这个端口号就会被释放。(相关概念:端口复用/地址复用)
设置端口建议8000以后
TCP
TCP,Transmission Control Protocol,传输控制协议
流程:创建连接→传输数据→关闭连接
几个重要概念:
三次握手:客户端发出连接申请→服务器接收申请并返回确认信息→客户端接收确认信息并再次发送确认信息给服务器→服务器确认,正常建立连接(客户端主动,服务器被动)
第1次握手: client发送请求(随机数x)
第2次握手: server回消息(x+1,y),client确认x
第3次握手:client回复消息(y+1),B确认y,建立连接
四次挥手:client向server发出请求,关闭client_to_server的TCP连接→server收到client的请求后关闭连接并返回响应→server向client发出请求,关闭server_to_client的TCP连接→client收到server的请求,确认关闭连接并返回响应
第1次挥手: client发送请求( 随机数u)
第2次挥手: server回消息(U+1)client确认U;关闭client到server的连接
第3次挥手: server发送消息(U+1,w)
第4次挥手:client回复消息(U+1, w+1)server确认w;关闭server到client的连接
socket网络编程
socket,网络编程中用来通信的重要通信方式/介质,类比:双方知道对方的电话号码,需要有手机/电话(充当介质)才能正常进行通信
TCP_client流程:
1.创建socket实例
2.尝试连接服务器
3.发送信息
4.接收信息
5.重复3-4步骤
5.关闭socket
代码示例
import socket
client = socket.socket(fileno=None)#创建socke实例
"""
if fileno is None:
if family == -1:
family = AF_INET
if type == -1:
type = SOCK_STREAM
if proto == -1:
proto = 0
默认使用IPV4 和TCP传输协议
"""
client.connect(('127.0.0.1',7788))#尝试和服务器连接
while True:
data = input("输入:")
if not data or data=='exit':
print("end")
break
client.send(data.encode())#传输信息
recv_msg = client.recv(1024)#接收信息
print(recv_msg.decode())
client.close()#关闭socket
TCP_server流程:
1.创建socke示例
2.设置bind(),包含(IP,port),告知访问的IP以及暴露端口
3.这是listen()限制队列个数,开始监听
4.准备accept()请求,(接收成功后)此处有两个返回值,(conn_socket,ip_port),拿到一个新的socket(和client成功连接的)以及client的ip和端口号
5.接收信息
6.发送信息
7.重复5-6步骤
8.关闭socket
代码示例:
import socket
if __name__ == "__main__":
server_socket = socket.socket(fileno=None)
#设置端口复用 允许频繁访问;场景:服务重启、开发调试
server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
server_socket.bind(('',7788))
server_socket.listen(128)
conn_socket, ip_port = server_socket.accept() # 接收socket对象 以及对象的ip和端口
print(type(conn_socket), ip_port)
while True:
recv_msg = conn_socket.recv(1024)
if not recv_msg:
print("end")
break
print(recv_msg.decode())
data = input("shuru:")
if not data:
break
conn_socket.send(data.encode())
conn_socket.close()
server_socket.close()
TCP_server多客户端代码示例(每一轮次中需要等待client主动断开连接):
# 导入模块
import socket
# 1、创建套接字对象
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2、绑定IP与端口
tcp_server_socket.bind(("", 8090))
# 3、设置监听
tcp_server_socket.listen(128)
# 4、等待客户端连接
while True:
# 使用try...except捕获连接异常
try:
new_socket, ip_port = tcp_server_socket.accept()
while True:
try:
# 5、接收客户端发送过来的消息
recv_data = new_socket.recv(1024)
recv_data = recv_data.decode('gbk')
print(f'{ip_port}:{recv_data}')
content = input('服务器端消息:').encode('gbk')
new_socket.send(content)
except ConnectionResetError:
print(f'{ip_port}客户端连接已经断开')
break
except:
print('出错,退出服务器监听')
break
# 关闭套接字对象
tcp_server_socket.close()

1121

被折叠的 条评论
为什么被折叠?



