TCP
客户端:客户也就是你,客服端也就是你这一端可以接触到的程序,手机app,web网页等,我们可以在客户端的界面上向服务器发送请求以及数据,交给服务器处理
服务端:也就是提供为客户端提供“服务”,接收并储存客户端发送过来的数据或请求,并且对请求进行响应,发送数据给客户端
import socket
创建tcp套接字
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
链接需要通讯的ip和端口
tcp_socket.connect('192.168.1.1',7890)
发送数据
tcp_socket.send(b'qwer')
关闭tcp套接字
tcp_socket.close()
TCP服务端就是将TCP客户端改变成一个长时间接收请求的客户端
import socket
def main():
"""
1.创建TCP套接字 socket
2.绑定本地信息 bind
3.让默认的套接字由主动变为被动 listen
4.等待客户端链接 accept
5.接收数据
6.回复客户端
7.关闭服务器
:return:
"""
# 1 创建TCP服务端的套接字
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2 TCP服务端套接字绑定本地信息
tcp_server_socket.bind(('',7890))
# 3 listen(128)==>监听的请求数
tcp_server_socket.listen(128)
print("_______________1_______________")
# 4 等待客户端链接,拆包。client_socket是与客户端新建立的一个套接字,client_Addr保存的是客户端的信息。
client_socket,client_Addr = tcp_server_socket.accept()
print("_________________2_______________")
# 5 接收客户端发送的信息
recv_data = client_socket.recv(1024)
print(recv_data.decode('utf-8'))
# 6 向客户端回复成功接收
client_socket.send('OK'.encode('utf-8'))
# 7 关闭服务端
tcp_server_socket.close()
if __name__ == '__main__':
main()
注意:用到两个套接字,tcp_server_scoket是创建本地服务端的套接字用来监听和接收客服端请求
client_socket是接收到客户端发送的请求,新建立的一个套接字,用来和客户端交互
import socket
def main():
# 创建TCP套接字
tcp_scoket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定本地信息
tcp_scoket.bind(('',7890))
# 监听客户端请求
tcp_scoket.listen(128)
while True:
# 接收客户端请求
client_socket,client_Addr= tcp_scoket.accept()
print('接收到客户端请求')
while True:
# 接收客户端发送的内容
tcp_data = client_socket.recv(1024)
print(tcp_data.decode("utf-8"))
if tcp_data:
# 给客户端回复消息
client_socket.send("ok".encode('utf-8'))
else:
print("客户端结束")
break
client_socket.close()
# 关闭服务端
tcp_scoket.close()
if __name__ == '__main__':
main()
TCP客户端之间的通讯是基于TCP服务端完成的
TCP1客户端 connect(TCP服务端ip、端口) ===> TCP服务端 43.158.45.4:7788 accept()保存TCP客户端信息
TCP2客户端 connect(TCP服务端ip、端口) ===> TCP服务端 43.158.45.4:7788 accept()保存TCP客户端信息
TCP1客户端 connect(TCP服务端把TCP2的ip、端口给TCP1去链接) ==> TCP2客户端
下载文件的原理:客户端向服务端发送下载请求,服务端核对下载请求,找出文件读出内容,然后向客户端发送文件内容;客户端保存文件。
客户端:
import socket
# 创建TCP客户端
tcp_client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 链接服务端
tcp_client_socket.connect(('43.458.157.4',7788))
# 向服务端发送请求
tcp_client_socket.send(b'hello')
# 接收服务端发送回来的数据
recv_data = tcp_client_socket.recv(1024) 文件大小
# 创建本地文件
file_name = input('请输入文件名')
with open(file_name,'wb') as f:
f.write(recv_data)
# 关闭套接字
tcp_client_socket.close()
服务端:
import socket
# 创建套接字
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定本地信息
tcp_server_socket.bind(('',7788))
# 监听
tcp_server_socket.listen(128)
# 接收客户端请求
tcp_client_socket,tcp_client_Addr = tcp_server_socket.accept()
# 接收客户端信息
recv_data = tcp_client_socket.recv(1024)
print(recv_data)
# 返回内容
file_data = input('请输入文件内容')
tcp_client_socket.send(file_data.encode('utf-8'))
# 关闭套接字
tcp_client_socket.close()
tcp_server_socket.close()