一:什么是c\s架构
1.c\s即client\server 客户端\服务端架构.
客户端因特定的请求而联系服务器并发送必要的数据等待服务器的回应最后完成请求
服务端:存在的意义就是等待客户端的请求,服务器无限的运行下去,并不断的处理请求
2.硬件客户端\服务器架构也是c\S架构
客户端\打印机,客户端\存储服务器.......
3.B\S架构即浏览器(browser)\服务端>>>统一接口
二.网络通信:
待续
三.socket网络编程
1.socket中文是指套接字,
1.套接字是计算机网络数据结构它体现的是通信端点的概念,在任何类型的通信之前网络应用程序必须创建套接字
可以将它比作电话插孔,没有它将无法进行通信
2.套接字起源于20世纪70年代加利福尼亚大学伯克利版本UNIX的一部分
套接字最初是为同一主机上的应用程序所创建,使得主机上运行的一个程序与另一个运行的程序进行通信,这就是
所谓的进程间的通信,
3.有两种套接字,
一基于文件的.
AF_UNIX地址家族,又称协议家族
二有面向网络的
AF_INET指因特网,AF_INET6
三socket地址:
1.主机-端口对 ,用于定位服务端主机与应用程序没有它就无法找到服务端的IP,和服务端的应用程序
例子:一个套接字就像一个电话机孔--允许通信一些基础设施,主机与端口号就像区号与电话号码的组合
2.有效端口号:65535(小于1024的端口预留给了系统)
3.python中套接字socket模块的应用'
在socket模块中socket()函数,用于创建socket对象,这些方法都能实现套接字的网络通信
在socket类中socket函数默认是TCP/IP面向连接的AF_INET,类型是SOCK_STREAM数据流的形式.
udpsocket=socket.socket(socket.AF_INET,type=socket.SOCK_STREAM)
在socket类中socket函数默认是UDP/IP面向连接的AF_INET,类型是SOCK_DGRAM数据包的形式.
udpsocket=socket.socket(socket.AF_INET,type=socket.SOCK_DGRAM)
4.socket案例:
服务端
import socket #实例化socket对象 server = socket.socket() #创建了一部手机 ip_port = ('192.168.15.46',8001) #买个电话卡 #绑定IP地址和端口 server.bind(ip_port) #插卡 #监听, server.listen() #开机 #等待客户端连接 print(111111) conn,addr = server.accept() #等别人的电话,阻塞 print(222222) print(conn) print(addr) #发送消息 # conn.send(b'leihao') #必须是bytes类型的数据 server_msg = input('服务端说>>>>') conn.send(server_msg.encode('utf-8')) #必须是bytes类型的数据 #接受消息 from_client_msg = conn.recv(1024) #1024,一次性能够接受的消息大小1024B print('来自客户端的消息',from_client_msg) conn.send(b'gun') #挂电话,关闭通道 conn.close() #关机,关闭socket server.close()
客户端
import socket client = socket.socket() # #服务端的ip地址和端口 server_ip_port = ('192.168.15.46',8001) #连接服务端的应用程序 client.connect(server_ip_port) print('ssss') from_server_msg1 = client.recv(1024) #阻塞 print('mmmm') print('服务端第一条消息:',from_server_msg1.decode('utf-8')) client.send(b'yuema') from_server_msg = client.recv(1024) print('来自服务端的消息:',from_server_msg) client.close()
加强版的服务端
import socket #实例化socket对象 server = socket.socket() #创建了一部手机 ip_port = ('192.168.15.46',8001) #买个电话卡 #绑定IP地址和端口 server.bind(ip_port) #插卡 #监听, server.listen() #开机 #等待客户端连接 print(111111) conn,addr = server.accept() #等别人的电话,阻塞 print(222222) print(conn) print(addr) #发送消息 # conn.send(b'leihao') #必须是bytes类型的数据 while 1: server_msg = input('王斌>>>>') conn.send(server_msg.encode('utf-8')) #必须是bytes类型的数据 #接受消息 from_client_msg = conn.recv(1024) #1024,一次性能够接受的消息大小1024B print('来自俊豪妹的消息',from_client_msg.decode('utf-8')) # conn.send(b'gun') #挂电话,关闭通道 conn.close() #关机,关闭socket server.close()
加强版客户端
import socket client = socket.socket() # #服务端的ip地址和端口 server_ip_port = ('192.168.15.46',8001) #连接服务端的应用程序 client.connect(server_ip_port) while 1: from_server_msg1 = client.recv(1024) #阻塞 print('来自王斌消息:',from_server_msg1.decode('utf-8')) client_msg = input('俊豪妹>>>') client.send(client_msg.encode('utf-8')) from_server_msg = client.recv(1024) print('来自服务端的消息:',from_server_msg) client.close()
四.面向连接的套接字,与无连接的套接字
1面向连接的套接字必须建立连接,实现这种连接类型的协议是传输控制协议即TCP协议
面向连接的优点:提供序列化,可靠的和不重复的数据交互
缺点,传输效率低
2无连接套接字即是实现这种连接类型的协议是用户数据报协议即UDP
优点:传输效率高
缺点无法保证数据的可靠性