Skip to content

Latest commit

 

History

History
137 lines (95 loc) · 3.84 KB

File metadata and controls

137 lines (95 loc) · 3.84 KB

Python-TCP

一.基本通信模型

创建一个基于tcp的网络发送程序流程很简单,具体步骤如下:

  1. 创建客户端套接字
  2. 连接服务器
  3. 发送/接收数据
  4. 关闭套接字

tcp模型

二.tcp网络程序-客户端程序

结构:

from socket import *

# 1.创建套接字
tcp_client = socket(AF_INET, SOCK_STREAM)

# 2.连接服务端
tcp_client.connect((ip, port))

# 4.发送数据
tcp_client.send('hello'.encode('utf-8'))  # str--->bytes

# 5.接受数据
data = tcp_client.recv(1024).decode('utf-8')
print(data)

# 6.关闭套接字
tcp_client.close()

demo:

import socket


class TCPClient(object):
    def __init__(self, dest_addr: tuple):
        self.ipv4_tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.ipv4_tcp_socket.connect(dest_addr)  # 连接服务器

    def send_msg(self, msg):
        self.ipv4_tcp_socket.send(msg.encode())

    def receive_msg(self):
        msg = self.ipv4_tcp_socket.recv(1024).decode()
        print(msg)

    def __del__(self):
        self.ipv4_tcp_socket.close()


if __name__ == '__main__':
    ip = "10.4.28.188"
    port = 8848
    tcp_client = TCPClient((ip, port))
    tcp_client.send_msg("发送信息")
    tcp_client.receive_msg()

三.tcp网络程序-服务端程序

结构:

from socket import *

# 1. socket创建一个套接字
server_socker = socket(AF_INET, SOCK_STREAM)

# 2. bind绑定ip和port
server_socker.bind((ip, port))

# 3. listen使套接字变为可以被动链接
server_socker.listen()

# 4. accept等待客户端的链接
client_socket, client_ip = server_socker.accept()

# 5.接收/发送对方发送过来的数据
recv_data = client_socket.recv(1024)  # 接收1024个字节
print('接收到的数据为:', recv_data.decode())
client_socket.send("thank you !".encode())

# 关闭套接字
client_socket.close()

demo:

from socket import *

# 1. socket创建一个套接字
server_socker = socket(AF_INET, SOCK_STREAM)

# 2. bind绑定ip和port
ip = '192.168.43.127'
port = 8848
server_socker.bind((ip, port))

# 3. listen使套接字变为可以被动链接
server_socker.listen(128)

# 4. accept等待客户端的链接
client_socket, client_ip = server_socker.accept()

# 5. recv/send接收发送数据
# 接收对方发送过来的数据
recv_data = client_socket.recv(1024)  # 接收1024个字节
print('接收到的数据为:', recv_data.decode())

# 发送一些数据到客户端
client_socket.send("thank you !".encode())

client_socket.close()

四.tcp注意点

  1. tcp服务器一般情况下都需要绑定,否则客户端找不到这个服务器
  2. tcp客户端一般不绑定,因为是主动链接服务器,所以只要确定好服务器的ip、port等信息就好,本地客户端可以随机
  3. tcp服务器中通过listen可以将socket创建出来的主动套接字变为被动的,这是做tcp服务器时必须要做的
  4. 当客户端需要链接服务器时,就需要使用connect进行链接,udp是不需要链接的而是直接发送,但是tcp必须先链接,只有链接成功才能通信
  5. 当一个tcp客户端连接服务器时,服务器端会有1个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务
  6. listen后的套接字是被动套接字,用来接收新的客户端的链接请求的,而accept返回的新套接字是标记这个新客户端的
  7. 关闭listen后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之前已经链接成功的客户端正常通信。
  8. 关闭accept返回的套接字意味着这个客户端已经服务完毕
  9. 当客户端的套接字调用close后,服务器端会recv解堵塞,并且返回的长度为0,因此服务器可以通过返回数据的长度来区别客户端是否已经下线