python之socket

理解概念

之前了解到了网络编程的基本层面,以及数据传输的形式,接下来我们来了解一下python socket。
先来看看socket的解释:

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。

那么我们来理解就是在网络编程时候别人把比较复杂的一些协议啊,规定啊写好成接口,咱们只需要调用这些接口,自己写一些逻辑代码来实现我们需要的功能就行了。

socket
socket在协议下它是IP+端口,ip是标识互联网中的一台主机的位置,端口来标识这台机器的一个应用程序,ip+port绑定就标识了互联网中独一无二的一个应用程序。

了解历史

Socket最初是加利福尼亚大学Berkeley分校为Unix系统开发的网络通信接口。后来随着TCP/IP网络的发展,Socket成为最为通用的应用程序接口,也是在Internet上进行应用开发最为通用的API。unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信

UDP协议

之前了解过TCP协议了,来看看UDP协议:
无连接协议,也称透明协议,也位于传输层。

看看它与TCP协议的区别:

1) TCP提供面向连接的传输,通信前要先建立连接(三次握手机制); UDP提供无连接的传输,通信前不需要建立连接。
2) TCP提供可靠的传输(有序,无差错,不丢失,不重复); UDP提供不可靠的传输。
3) TCP面向字节流的传输,因此它能将信息分割成组,并在接收端将其重组; UDP是面向数据报的传输,没有分组开销。
4) TCP提供拥塞控制和流量控制机制; UDP不提供拥塞控制和流量控制机制。

所以来说,打电话,聊天使用相对稳定连接的tcp协议,在看网络电影,电视时候用的是udp协议,所以有时会电影卡顿失帧。

那我们再看看看看具体socket工作流程:
TCP

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

具体实现一个本地聊天功能:

# 服务端
import socket
HostPort = ('127.0.0.1',9999) #
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(HostPort)
s.listen(1)
conn,addr = s.accept()
# print('Connecting by : %s ' % addr)
while True:
    data = conn.recv(1024).decode()
    print ('客户端的消息:',data)
    user_input = input('>>>')
    conn.send(user_input.encode('utf8'))
s.close()

服务端

# 客户端
import socket

hostport = ('127.0.0.1', 9999)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(hostport)

while True:
    user_input = input('>>> ').strip()
    s.send(user_input.encode('utf-8'))
    if len(user_input) == 0:
        continue
    if user_input == 'quit':
        s.close()
        break
    server_reply = s.recv(1024).decode()
    print('来自服务器的回复:',server_reply)

客户端

posted @ 2020-01-05 17:05  afly_8  阅读(34)  评论(0编辑  收藏  举报