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