PythonTCP

2017-12-19  本文已影响0人  等哈光圈

TCP

TCP通信面向连接需要经过创建连接、数据传送、终止连接三个步骤。

TCP可靠传输

TCP与UDP的不同点

TCP与UDP通信模型应用

TCP客户端及服务端构建

所谓的服务器端:就是提供服务的一方,⽽客⼾端,就是需要被服务的一方
# 客户端
1.创建socket套接字
2.使用connect连接到服务器
3.使用send/recv发送和接收信息
4.关闭socket套接字
# 服务器
1.创建socket套接字
2.bind绑定ip和端口
3.使用listen使套接字变为可以被动套接字
4.accept取出一个客户端连接用以服务
5.recv/send接收发送数据
6.关闭客户端套接字client
7.关闭server套接字(服务器一般不关闭)

tcp注意点

三次握手和四次挥手

三次握手原理
 客户端(client)                                                    服务器(server)

                                          SYN seq=x
SYN_SENT(connect())   ------------------------------------->   LISTEN(listen())
                                   SYN seq=y,ACK=x+1   
    ESTABLISHED   <--------------------------------------------  SYN_RCVD  
                                    ACK=y+1     
                        -------------------------------------------------> ESTABLISHED              
四次挥手原理
 客户端(client)                                                                服务器(server)

                                  FIN seq=x+2,ACK=y+1
FIN_WAIT_1(close())------------------------------------------------->   CLOSE_WAIT
                                 ACK x+3   
FIN_WAIT_2   <----------------------------------------------------------  CLOSE_WAIT
                                FIN seq= y+1
TIME_WAIT   <-----------------------------------------------------------LAST_ACK(close())
                                ACK=y+2    
TIME_WAIT  --------------------------------------------------------------> 
地址重用问题
server_socket.setsockopt(socket.SOl_SOCKET, socket.SO_REUSEADDR,1)(1.代表设置, 0.代表取消)

协议

TCP实现客户端和服务端文件下载器

# 客户端
import socket
import os
# 创建tcp套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 创建和服务器的连接
ip = input("文件下载服务器ip:")
port = int(input("输入文件下载服务器对应端口:"))
tcp_socket.connect((ip, port))

# 发送下载文件名
file_name = input("请输入需要下载的文件名:")
tcp_socket.send(file_name.encode("gbk"))
# 结合文件数据 --> 保存在本地写入文件-->二进制模式就是原封不动的写入
file = open("new"+file_name, "wb")
write_len = 0
while True:
    data = tcp_socket.recv(4096)
    if data:
        file.write(data)
        write_len += len(data)
    else:
        file.close()
        # 关闭套接字
        tcp_socket.close()
        if write_len > 0:
            print("文件传输完成")
        else:
            # 空文件
            os.remove("new"+file_name)
            print("文件不存在")
        break
# 服务端
import socket


def read_data(file_name):
    """获取文件内容"""
    try:
        f = open(file_name, "rb")
    except Exception as e:
        print("%s文件不存在" % file_name)
    else:
        # 文件太大回报错
        ret = f.read()
        return ret


# 创建一个服务器套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#     设置套接字选项 地址重用                   # 重用地址 1.代表设置 0.代表取消设置
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 绑定端口
server_socket.bind(("", 8888))
# 将套接字设置为被动套接字 监听
server_socket.listen(128)
while True:
    # 接收一个客户端 开始对他进行服务
    client_socket, client_address = server_socket.accept()
    print("接收到%s的请求" % str(client_address))
    # 取出文件名
    file_name = client_socket.recv(4096)
    # 根据文件名读取文件数据-->通过客户端关联的套接字发送文件数据
    file_ct = read_data(file_name.decode("gbk"))
    # 发送完成  应该主动断开客户端关联套接字
    if file_ct:
        client_socket.send(file_ct)
    # 关闭套接字
    client_socket.close()
# server_socket.close()
上一篇下一篇

猜你喜欢

热点阅读