Socket 基础/进阶-1

C/S 架构

  浏览器是客户端,淘宝网页是服务端

  C/S架构与socket的关系:

    完成C/S架构的开发

  

osi七层

  一个完整的计算机系统是由硬件、操作系统、应用软件三者组成   ,  互联网的核心就是由一堆协议组成,协议就是标准,比如全世界人通信的标准是英语 , 类似于国际通用的英语。

  C/S架构的软件(软件属于应用层)是基于网络进行通信的  , 想开发一款基于网络通信的软件,就必须遵循这些标准。

  

  WHAT IS SOCKET ?

   Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

  所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。

                                      套接字流程:

  NB 的一张图:    

  

   

 1 服务端:
 2 from socket import *
 3 phone=socket(AF_INET,SOCK_STREAM)
 4 phone.bind(('127.0.0.1',8080))
 5 phone.listen(5)
 6 
 7 conn,addr=phone.accept()
 8 
 9 while 1:
10     data=conn.recv(1024)
11     print(data)
12     conn.send(data.upper())
13 conn.close()
14 phone.close()
15 
16 客户端:
17 from socket import *
18 
19 phone=socket(AF_INET,SOCK_STREAM)
20 phone.connect(('127.0.0.1',8080))
21 
22 while 1:
23     msg=input(': ').strip()
24     phone.send(msg.encode('utf-8'))
25     data=phone.recv(1024)
26     print(data)
27 
28 说明卡的原因:缓冲区为空recv就卡住,重新启动
29 
30 
31 服务端
32 from socket import *
33 phone=socket(AF_INET,SOCK_DGRAM)
34 phone.bind(('127.0.0.1',8080))
35 while 1:
36     msg,addr=phone.recvfrom(1024)
37     phone.sendto(msg.upper(),addr)
38 客户端
39 from socket import *
40 phone=socket(AF_INET,SOCK_DGRAM)
41 while True:
42     msg=input(': ')
43     phone.sendto(msg.encode('utf-8'),('127.0.0.1',8080))
44     msg,addr=phone.recvfrom(1024)
45     print(msg)
View Code

TCP的套接字

注意:tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端

 tcp_server:

1 ss = socket() #创建服务器套接字
2 ss.bind()      #把地址绑定到套接字
3 ss.listen()      #监听链接
4 inf_loop:      #服务器无限循环
5     cs = ss.accept() #接受客户端链接
6     comm_loop:         #通讯循环
7         cs.recv()/cs.send() #对话(接收与发送)
8     cs.close()    #关闭客户端套接字
9 ss.close()        #关闭服务器套接字(可选)
View Code

 tcp_client:

1 cs = socket()    # 创建客户套接字
2 cs.connect()    # 尝试连接服务器
3 comm_loop:        # 通讯循环
4     cs.send()/cs.recv()    # 对话(发送/接收)
5 cs.close() 
View Code

UDP的套接字

注意:udp是无链接的,先启动哪一端都不会报错

udp_server

1 ss = socket()   #创建一个服务器的套接字
2 ss.bind()       #绑定服务器套接字
3 inf_loop:       #服务器无限循环
4      cs = ss.recvfrom()/ss.sendto() # 对话(接收与发送)
5 ss.close()                         # 关闭服务器套接字
View Code

udp_client

1 cs = socket()   # 创建客户套接字
2 comm_loop:      # 通讯循环
3     cs.sendto()/cs.recvfrom()   # 对话(发送/接收)
4 cs.close()                      # 关闭客户套接字
View Code

注意:udp 服务端可以跟多个客户端沟通!

原文地址:https://www.cnblogs.com/MR-allen/p/10467708.html