c/s架构搭建

1.socket(套接字)

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

2.套接字有两种,分别是基于文件型的和基于网络型的。 

基于文件类型的套接字家族:AF_UNIX  AF_INET

3.套接字的工作流程

先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

4.基于TCP的套接字

服务端

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

客户端

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

 

 

下面模仿手机通讯来说明下套接字的流程

服务端

import socket

#1、买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #tcp称为流式协议,udp称为数据报协议SOCK_DGRAM
# print(phone)

#2、插入/绑定手机卡
# phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
phone.bind(('127.0.0.1',8080)) # 绑定的里面放的是元组!元组!元组!!!

#3、开机
phone.listen(5) # 半连接池,限制的是请求数

#4、等待电话连接
print('start....')
while True: # 连接循环
    conn,client_addr=phone.accept() #(三次握手建立的双向连接,(客户端的ip,端口))
    # print(conn)
    print('已经有一个连接建立成功',client_addr)

    #5、通信:收\发消息
    while True: # 通信循环
        try:
            print('服务端正在收数据...')
            data=conn.recv(1024) #最大接收的字节数,没有数据会在原地一直等待收,即发送者发送的数据量必须>0bytes
            # print('===>')
            if len(data) == 0:break #在客户端单方面断开连接,服务端才会出现收空数据的情况
            print('来自客户端的数据',data)
            conn.send(data.upper())
        except ConnectionResetError:
            break
    #6、挂掉电话连接
    conn.close()

#7、关机
phone.close()

客户端

import socket

#1、买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# print(phone)
#2、拨电话
phone.connect(('127.0.0.1',8080)) # 指定服务端ip和端口

#3、通信:发\收消息
while True: # 通信循环
    msg=input('>>: ').strip() #msg=''
    if len(msg) == 0:continue
    phone.send(msg.encode('utf-8'))
    # print('has send----->')
    data=phone.recv(1024)
    # print('has recv----->')
    print(data)

#4、关闭
phone.close()

  

posted @ 2018-07-07 13:16  Roc_Atlantis  阅读(1021)  评论(0编辑  收藏  举报