⽹络编程笔记(1)——CS架构和BS架构、TCPUDP协议、socket概念
⽹络编程:
内容⽬录
CS架构
BS架构
TCP/UDP协议
socket概念
1.C/S架构
C/S即:Client和Server,中⽂意思:客户端与服务器端架构,这种架构也是从⽤户层⾯(也可以是物理层⾯)来划分的。
这⾥的客户端⼀般泛指客户端应⽤程序EXE,程序需要先安装后,才能运⾏在⽤户的电脑上,对⽤户的电脑操作系统环境依赖⼤。
2.B/S架构
B/S即:Browser与Server,浏览器端与服务器端架构,这种架构是从⽤户层⾯来划分的。
Browser浏览器,其实也是⼀种Client客户端,只是这个客户端不需要⼤家去安装什么应⽤程序,只需在浏览器上通过HTTP请求服务器端相关的资源(⽹页资源),客户端
Browser浏览器就能进⾏增删改查。
3.两者关系
B/S和C/S架构是什么关系?
B/S架构是C/S架构的⼀种
4.端⼝
通过端⼝号到对应的程序
在计算机上,每⼀个需要⽹络通信的程序,都会开⼀个端⼝
在同⼀个时间只会有⼀个程序占⽤⼀个端⼝
端⼝范围:0-65535,⼀般情况下分配8000往后的端⼝号,避免占⽤系统端⼝
5.TCP/UDP协议
5.1两个协议的区别
TCP协议连接的三次握⼿,和断开的四次挥⼿,特点:
可靠的,⾯向连接的协议。
传输效率低,但是全双⼯通信(发送缓存&接收缓存)、⾯向字节流。
使⽤TCP的应⽤:WEB浏览器,电⼦邮件,⽂件传输程序。
UDP只传输,不应答,特点:
提供不可靠,⽆连接的服务。传输效率⾼(发送前时延迟⼩),⼀对⼀,⼀对多,多对⼀,多对多,⾯向报⽂,尽最⼤努⼒服务,⽆拥塞控制
使⽤UDP的应⽤:域名系统(DNS),视频流,IP语⾳(VoIP).
5.2 ⽹络传输流程图:
6.socket概念
什么是socket(套接字)
socket是应⽤层与TCP/IP协议族通信的中间软件抽象层,它是⼀组接⼝。在设计模式中,socket其实是⼀个门⾯模式:它把复杂的TCP/IP协议族隐藏在Socket接⼝后⾯,对⽤户来说,⼀组简单的接⼝就是全部,让socket去组织数据,以符合
其实站在你的⾓度上看,socket就是⼀个模块。我们通过调⽤模块中已经实现的⽅法建⽴两个进程之间的连接和通信。
也有⼈将socket说成ip+port,因为ip是⽤来标识互联⽹中的⼀台主机的位置,⽽port是⽤来标识这台机器上的⼀个应⽤程序。
所以我们只要确⽴了ip和port就能到⼀个应⽤程序,并且使⽤socket模块来与之通信。
两种类型的套接字家族
基于⽂件类型的套接字(不常⽤)
名称:AF_UNIX
unix⼀切皆⽂件,基于⽂件的套接字调⽤的就是底层的⽂件系统来取数据,两个套接字进程运⾏在同⼀机器,可以通过访问同⼀个⽂件系统间接完成通信。
基于⽹络类型的套接字(常⽤,关键)
名称:AF_INET
还有AF_INET6被⽤于ipv6,还有⼀些其他的地址家族,不过,他们要么是只⽤于某个平台,要么就是已经被废弃,或者是很少被使⽤,或者是根本没有实现,所有的地址家族中,AF_INET是应⽤最⼴泛的⼀个,python⽀持很多地址家socket基于TCP和UDP的连接图
对话应⽤
#Server端:
import socket
#此为TCP协议的连接
sk = socket.socket() #拿到socket的句柄
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)#避免服务器重启的时候报address already in use
# sk.bind('ip','port') #使⽤socket句柄绑定ip和端⼝(ip和端⼝必须为⼀个元组)
sk.bind(('127.0.0.1',8080))
sk.listen() #监听是否有通信
conn,addr = sk.accept() #接收到client:连接:connection,地址:address,获取⼀个客户端的连接,已经完成了三次握⼿建⽴起⼀个连接了。此时为阻塞状态
ret = v(1024) #接收到1024个字节,如果更改,必须为1024的倍数
print(ret)
conn.send(b'server-hi') #和client传信息,必须传⼀个byte类型
ret = v(1024)
print(ret.decode('utf-8'))
conn.send(bytes('黄焖鸡⽶饭',encoding='utf-8'))
conn.close() #连接断开
sk.close() #关闭socket
#Client端:
import socket
sk = socket.socket()
sk.send(b'Client-hi')
ret = sk.recv(1024)
print(ret)tcp ip协议中文名
sk.send(bytes('你吃饭了吗'.encode('utf-8')))
ret = sk.recv(1024)
print(ret.decode('utf-8'))
sk.close()
#⼀直对话:
#server端:
import socket
sk = socket.socket() #拿到socket的句柄
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #避免服务器重启的时候报address already in use
#sk.bind('ip','port') #使⽤socket句柄绑定ip和端⼝
sk.bind(('127.0.0.1',8080))
sk.listen() #监听是否有通信
conn,addr = sk.accept() #接收到client:连接:connection,地址:address
print(addr)
while True:
ret = v(1024).decode('utf-8') #接收到1024个字节,如果更改,必须为1024的倍数
if ret == 'bye':
break
print(ret)
info = input(">>>:")
conn.send(bytes(info,encoding='utf-8')) #和client传信息,必须传⼀个byte类型
conn.close() #连接断开
sk.close() #关闭socket
#Client端:
import socket
sk = socket.socket()
while True:
info = input('>>>:')
if info == 'bye':
sk.send(b'bye')
break
sk.send(de('utf-8')))
ret = sk.recv(1024).decode('utf-8')
print(ret)
if ret == 'bye':
sk.send(b'bye')
break
sk.close()
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论