客户端/服务器架构
1、即C/S架构
客户端/服务器架构就是C/S架构,包括两种:
(1)硬件C/S架构(打印机)
(2)软件C/S架构(web服务)
2、C/S架构与socket的关系
学习socket就是为了完成C/S架构的开发
3、两机交互的原理
![82892393ca42c7c2ae55b66bd4644bd5.png](https://i-blog.csdnimg.cn/blog_migrate/401cdca1088c8a6e0a9114d90d622830.jpeg)
Socket编程
1、socket编程的概念
Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。(其实就是两个程序通信用的。)
套接字是一种通信机制,凭借这种机制,客户/服务器系统的开发工作既可以在本地单机上进行,也可以跨网络进行,Linux所提供的功能(如打印服 务,ftp等)通常都是通过套接字来进行通信的,套接字的创建和使用与管道是有区别的,因为套接字明确地将客户和服务器区分出来,套接字可以实现将多个客 户连接到一个服务器。
socket在网络传输中的位置:
![2c60c456c84b311ddd325db1f18c1220.png](https://i-blog.csdnimg.cn/blog_migrate/e9dc7dce01885f9ee80e249d09a15926.jpeg)
2、socket的两种类型
它们都遵循两种协议: tcp协议和udp协议
流式Socket(STREAM): 是一种面向连接的Socekt,针对面向连接的TCP服务应用,安全,但是效率低数据报式Socket(DATAGAM): 是一种无连接的Socket,对应于无连接的UDP服务应用。不安全(易丢失,顺序混乱,在接受端要分析重排及要求重发),但效率高
3、socket的运行流程
![e1900393350f75a85f4771bcd80a0223.png](https://i-blog.csdnimg.cn/blog_migrate/3218f4bcac3fae9eaa70bc0824f7aee8.jpeg)
解释:
在传输层与应用层之间有一个socket抽象层
我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循scoket的规定去编程,写出的程序自然就是遵循tcp/udp标准的程序
4、socket = ip + port
IP是用来表示互联网中一台主机的位置,而port是用来表示这台机器上的一个应用程序;
IP地址是配置到网卡上的,而port是应用程序开启的;
所以IP与port的绑定就标识了互联网中独一无二的一个应用程序
5、socket实现的交流
服务端代码:
import socket #服务端导入socket模块phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #用socket实例化一个对象phone#AF_TNET代表是基于网络传输;SOCK_STREAM代表遵循tcp协议phone.bind(('192.168.43.247',8000)) #表明绑定一个端口,ip地址为本机ip地址phone.listen(5) #监听;5表示最大可以挂起5个链接,多余的会在后面排队print('-------->line1') #直接运行服务端会卡在这里等对方的链接conn,addr = phone.accept() #获取对方的链接和号码print('-------->line2')#收消息msg = conn.recv(1024) #接收对方的链接,接收1024字节的信息print('客户端发来的消息是:',msg)#发消息conn.send(msg.upper()) #把发来的消息以大写的方式返回给客户端#conn.send(msg) #把消息发送出去conn.close() #发送完了就关闭链接phone.close() #再关闭整个phone,即整个socker对象1234567891011121314151617181920212223
客户端代码:
import socket #客户端也要导入socket模块phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #基于网络;遵循tcp协议phone.connect(('192.168.43.247',8000)) #接通服务端,接通的就是对方绑定的元组;这里使用的IP地址便为你自己电脑的IP地址#发消息phone.send('Hello'.encode('utf-8')) #网络传输是二进制形式,所以要编码成二进制进行传输#127.0.0.1#conn,addr = phone.accept()#客户端不需要再获取对方的链接和号码#收消息msg = phone.recv(1024) #直接用phone.recv来接收消息print('服务端传回来的消息是:',msg)12345678910111213141516
运行服务端:
![8b072306120fcdb65b153bebe376471e.png](https://i-blog.csdnimg.cn/blog_migrate/21e57dc1cdbba3ecf14b09e11fd178cb.jpeg)
可以看到光标在跳动,等待客户端发送的消息…所以我们接下运行客户端:
![766a3459c065362c09641c80d2fd220c.png](https://i-blog.csdnimg.cn/blog_migrate/caa94bc996fd07e5d9bb6c1c50a6e4c2.jpeg)
发现服务端成功接收到了消息…同时客户端也接收到了服务端加工过的消息:
![751fe415a91c5ddfbb64321560f6c1c4.png](https://i-blog.csdnimg.cn/blog_migrate/09fea32753515ace139707c6ee1f019a.jpeg)