计算机网络通信的分层架构:
Socket套接字是网络通讯中经常使用的一种方式,通过这种方式来指定对应的协议,比方说TCP/UDP,以供用户选择。
我们可以将Socket比作一个物流公司,而TCP、UDP就像不同的物流服务。
TCP就类似顺丰。
当你要寄东西出去的时候,TCP会和收件方说:你的朋友要寄东西给你,你要要收吗?
当收件方应许后,就会问TCP什么时候发,几时可以到
TCP就会说,现在就发,大概一天后到。
这就是TCP中很著名的三次握手,相比于UDP来说,TCP较为稳健,它需要获得收件方的应答,才开始进行通信。
当发送信息完成,需要断开通信时。就会大致进行一下的会话:
物流:你好,货物已发送,请注意查收
你朋友:好的。
货物送到,你朋友:OK,货物收到,你们可以结案
物流:好的,我结案了。
这以上四个步骤就是所谓的四次挥手。
创建TCP服务端需要五个步骤:
- 1.创建套接字并绑定到本地的IP和端口。
- 2.连接成功后,开始监听。
- 3.进入While Tue循环,不断接受客户端的请求。
- 4.接收客户端的数据,并将自身的数据发送过去。
- 5.传输完成后关闭套接字。
TCP是面向连接的通信,也就是发送之前要进行连接;此外,TCP是拥有拥塞机制的,如果当前的数据没有被完全接收完毕,那么后面的数据就会阻塞直到前面的数据传递结束。
通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;在数据完整性、安全性要求较高的场景需要使用TCP协议,比如你传送重要办公文件、图片等,这些东西丢包都是会影响数据品质的。
TCP的创建需要耗费很大的资源,并且由于它的拥塞机制的存在,如果出现拥塞,那么数据传输就会出现较大的延迟,比如视屏通话的时候会出现卡顿。而创建UDP客户端就比较简单,没有TCP那么耗费资源,以及创建的复杂。只需要三个步骤就可以与服务端进行交互:
- 1.创建套接字,连接远程的地址。
- 2.连接成功后,与服务端进行收发数据。
- 3.传输完成后关闭套接字。
因此,当我们传输少量数据或者传输要求实时性的数据时,就会使用UDP协议来传输。比如视频实时会议。
网络编程的Python实现:
import socket
import threading
import time
import random
def ServerThread(sock, addr):
print('Now is connecting from %s...%s' % addr)
sock.send(b'Hello world, i am server')
while True:
data = sock.recv(1024)
time.sleep(random.random())
if not data or data.decode('utf-8') == 'exit':
break
print('data -->>' % data.decode('utf-8').encode('utf-8'))
sock.send(data.decode('utf-8').encode('utf-8'))
sock.close()
print('connect from %s is closed' % addr)
if __name__ == '__main__':
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 8889))
s.listen(5)
print('waiting for connecting...')
while True:
sock, addr = s.accept()
t = threading.Thread(target = ServerThread, args = (sock, addr))
t.start()
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 8889))
for i in range(5):
print('---> %s' %s.recv(1024).decode('utf-8'))
s.send(b'hello wrold, i am client')
print('---> %s' %s.recv(1024).decode('utf-8'))
s.send(b'exit')
s.close()