IP地址:标识网络设备的地址,区分不同的网络设备
发送数据:应用程序发送数据,先把数据写入到发送缓冲(内存中的一片空间),再由操作系统控制网卡把缓冲区的数据发送给服务端的网卡
接收数据:操作系统通过网卡接收数据,把数据写入到接收缓冲区,应用程序再从接收缓冲区接收客户端发送的数据
端口号:操作系统为了统一管理很多的端口,对端口进行编号,端口号有65536,知名端口号:0~1023,动态端口:1023 ~65536
tcp协议(传输控制协议):面向连接、可靠的、基于字节流的传输通讯协议
socket(套接字):进行网络通讯的一个工具,好比现实中的插座,网络传输数据要经过socket,好比数据的搬运工
tcp网络应用程序的开发:分为客服端应用程序和服务端应用程序,客户端跟服务端建立连接,经过三次握手
网络程序通讯流程
1.通过ip地址找到网络中的设备
2.通过端口号找到对应的进程端口
3.传输数据是还需要使用传输协议(tcp),保证数据的可靠性
4.socket完成进程之间的网络数据传输
客户端开发:
1.创建客户端套接字对象
2.和服务端套接字建立连接
3.发送数据
4.接收数据
5.关闭客户端套接字
import socket
#创建套接字对象
#AF_INET: ipv4地址类型,AF_INET6:ipv6类型
#socket.SOCKET_STREAM表示tcp协议类型
tcp_client_socket=socket.socket(socke.AF_INET,socket.SOCKET_STREAM)
#和服务端套接字建立连接
tcp_client_socket.connnect(('192.168.0.103',88))
send_str='你好'
# 网络传输数据对二进制的数据进行传输,将字符串转换成二进制
send_data=send_str.encode()
#发送数据给服务端
tcp_client_socket.send(send_data)
#接收服务端的数据
#1024表示每次接收的最大字节数
recv_data=tcp_client_socket.recv(1024)
#对服务端接收的二进制数据进行解码
recv_content=recv_data.decode()
print('服务端结束的数据为:',recv_content)
#关闭套接字
tcp_client_socket.close()
服务端开发流程:
1.创建服务端套接字对象
2.绑定端口号
3.设置监听
4.等待接受客户端的链接请求
5.接收数据
6.发送数据
7.关闭套接字
import socket
import threading
def recive_client(new_socket,client_addr):
print('客户端IP地址和端口号:', client_addr)
#接收消息
while True:
recive_data = new_socket.recv(1024)
if recive_data:
print(recive_data.decode('gbk'))
# 发送的字符串转化成二进制
send_str =input("请回复{}:".format(client_addr))
send_content = send_str.encode('gbk')
# 向客户端发送消息
new_socket.send(send_content)
else:
print("{}退出".format(client_addr))
break
new_socket.close()
if __name__ == '__main__':
#创建套接字对象
#AF_INET: ipv4地址类型,AF_INET6:ipv6类型
tcp_service_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#解决端口号复用问题:服务器程序退出端口立即释放
#1.SOL_SOCKET:表示当前套接字
#2.SO_REUSEADDR:表示复用端口选线
#True表示确定复用
tcp_service_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
#绑定端口号
tcp_service_socket.bind(('',6666))
#设置监听,120表示监听最大客户端的链接数
tcp_service_socket.listen(120)
# 循环接收客户端的连接请求
while True:
new_socket,client_addr = tcp_service_socket.accept()
t = threading.Thread(target=recive_client, args=(new_socket,client_addr))
# 守护主线程,主线程运行结束,子线程销毁,写法相当于t.daemon=True
t.setDaemon(True)
t.start()
#服务器程序一直运行不关闭,这行代码可以省略
# tcp_service_socket.close()
tcp应用程序的注意点介绍
1.当tcp客户端程序想要和tcp服务端程序进行通信的时候必须要先建立连接
2.tcp客户端程序一般不需要绑定端口号,因为客户端是主动发起建立连接的
3.tcp服务端程序必须绑定端口号,否则客户端找不到tcp服务端的程序
4.listen后的套接字是被动套接字,只负责接收新的客户端的链接请求,不能发送消息
5.当tcp客户端程序和tcp服务端程序连接成功后,tcp服务器端的程序会产生一个新的套接字,收发客户端消息使用该套接字
6.关闭accept返回的套接字意味着和这个客户端通信完毕
7.关闭listen后的套接字意味着服务端的套接字关闭了,会导致新的客服端不能连接服务端,但是之前连接成功的客户端还能正常的进行通信
8.当客户端的套接字调用close后,服务器端的recv会解阻塞,返回的数据长度为0,服务器端可以通过返回的数据长度判断客户端是否已经下线,反之服务端关闭套接字,客服端的recv也会解阻塞,返回的数据长度也为0
http(超文本传输协议):http协议格式是基于tcp传输协议的,发送数据需要建立连接
**http协议的作用:**它规定了浏览器和web服务器的通信数据的格式,也就是说浏览器和web服务器进行通信需要使用http协议
http请求报文:浏览器发送给web服务器程序的数据
url的组成部分
1.协议部分:https:// https:// ftp://
2.域名部分:比如www.baidu.com
3.资源路径部分
4.查询参数部分