socket-tcp的数据传输

Zss 发表于:

UDP不同的是在传输数据之前,TCP一定需要建立客户端和服务端的连接,这样保证了数据的可靠性,而UDP只管发送,不过这个地址是否可达,全部都会发送出去

但是TCP若没有发送数据前的连接建立,那么是无法发送数据的,一种典型的C/S模式

首先需要理清楚客户端和服务端是怎么运作的,如下图:

我的理解是发送数据是建立在一条已经建立完成的数据通道上来传输的,而这个通道的建立也就是TCP的三次握手,所以没有通道的建立那么无法发送数据

再者底层协议为高层协议服务,也就是HTTP封装好的数据包需要发送,那得需要在TCP的三次握手建立好后,在这个通道上来传输

对于服务端来说:

1.创建一个tcp类型的socket的对象

2.将其自身的端口ip来绑定在此socket对象上,服务端一定需要绑定一个ip和端口,以供客户端来发起请求

3.监听请求,listen()

4.accept()在此时程序处于阻塞状态,直到监听到客户端发送来的请求,返回此时的状态,和ip-port

5.当连接成功建立后,可以开始在建立在此连接上的读写操作,知道主动方发起断开将会进行四次挥手的断开连接

 

对于客户端来说:

1.创建的一个tcpsoket的对象

2.使用此对象来连接服务端的,connect(),连接成功

3.在建立的此连接上进行读写操作数据的交互

4.直到主动方发起的断开连接

 

运行程序抓包发现其中的三次握手了四次握手,及其中间数据的传输,很清晰

之后试着使用TCP在局域网中来传输大文件与UDP对比一下

服务端:

#coding:utf-8
from socket import *


server = ('192.168.16.104',6666)
tcp_socket = socket(AF_INET,SOCK_STREAM)
tcp_socket.bind(server)
tcp_socket.listen(3)
connet,ip_port = tcp_socket.accept()
print 'from by',ip_port

while 1:
    data = connet.recv(1024)
    if not data:break
    print 'data is',data
    connet.send(data)

客户端:

from socket import *

server = ('192.168.16.104',6666)
tcp_socket = socket(AF_INET,SOCK_STREAM)
tcp_socket.connect(server)

tcp_socket.send('hello')
data = tcp_socket.recv(1024)
print('echo %s'%(data))