1 IP地址
1.1 说明
IP 地址分为两类: IPv4 和 IPv6
IPv4 是目前使用的ip地址
IPv6 是未来使用的ip地址
IPv4 是由点分十进制组成
IPv6 是由冒号十六进制组成
1.2 IP 地址的作用
IP 地址的作用是标识网络中唯一的一台设备的,也就是说通过IP地址能够找到网络中某台设备
1.3 查看 IP 地址
Linux 和 mac OS 使用 ifconfig 这个命令
Windows 使用 ipconfig 这个命令
1.4 检查网络是否正常
检查网络是否正常使用 ping 命令
ping www.baidu.com 检查是否能上公网
ping 当前局域网的ip地址 检查是否在同一个局域网内
ping 127.0.0.1 检查本地网卡是否正常
2 端口和端口号
2.1 端口
端口是传输数据的通道,是数据传输必经之路。
其实,每一个端口都会有一个对应的端口号,好比每个教室的门都有一个门牌号,想要找到端口通过端口号即可
2.2 端口号
操作系统为了统一管理这么多端口,就对端口进行了编号,这就是端口号,端口号其实就是一个数字,好比我们现实生活中的门牌号,
通过ip地址找到对应的设备,通过端口号找到对应的端口,然后通过端口把数据传输给应用程序
2.3 端口号的分类
知名端口号:众所周知的端口号,范围从0到1023。FTP(文件传输协议:21, SMTP(简单邮件传输协议):25 HTTP:80
动态端口号:一般程序员开发应用程序使用端口号称为动态端口号, 范围是从1024到65535。
如果程序员开发的程序没有设置端口号,操作系统会在动态端口号这个范围内随机生成一个给开发的应用程序使用。
当运行一个程序默认会有一个端口号,当这个程序退出时,所占用的这个端口号就会被释放。
3 TCP 和 socket
3.1 TCP 的概念
TCP 的英文全拼(Transmission Control Protocol)简称传输控制协议,它是一种面向连接的、可靠的、基于字节流的传输层通信协议。
3.2 TCP 的特点
面向连接
通信双方必须先建立好连接才能进行数据的传输,数据传输完成后,双方必须断开此连接,以释放系统资源。
可靠传输
TCP 采用发送应答机制
超时重传
错误校验
流量控制和阻塞管理
3.3 socket 的概念
socket (简称 套接字) 是进程之间通信一个工具,进程之间想要进行网络通信需要基于这个 socket
4 TCP 网络应用程序开发流程
4.1 TCP 网络应用程序开发分为
TCP 客户端程序开发
TCP 服务端程序开发
4.2 TCP 客户端程序开发流程的介绍
步骤说明:
创建客户端套接字对象 socket()
和服务端套接字建立连接 connect()
发送数据 send()
接收数据 recv()
关闭客户端套接字 close()
4.3 TCP 服务端程序开发流程的介绍
步骤说明:
创建服务端端套接字对象 socket()
绑定端口号 bind()
设置监听 listen()
等待接受客户端的连接请求 accept()
接收数据 recv()
发送数据 send()
关闭套接字 close()
5 TCP 客户端程序开发示例代码
import socket
if __name__ == '__main__':
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_client_socket.connect(("192.168.157.1", 8080))
content = "你好服务端,我是客户端小白!"
content_data = content.encode("gbk")
tcp_client_socket.send(content_data)
recv_data = tcp_client_socket.recv(1024)
recv_content = recv_data.decode("gbk")
print("接受服务端的数据为:", recv_content)
tcp_client_socket.close()
6 TCP服务端程序开发
import socket
if __name__ == '__main__':
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
tcp_server_socket.bind(("", 9090))
tcp_server_socket.listen(128)
server_client_socket, ip_port = tcp_server_socket.accept()
recv_data = server_client_socket.recv(1024)
recv_content = recv_data.decode("gbk")
print("接收到客户端的消息为:", recv_content)
send_content = "你好,我是服务端"
send_data = send_content.encode("gbk")
server_client_socket.send(send_data)
server_client_socket.close()
tcp_server_socket.close()
7 TCP服务端程序升级版
import socket
import threading
def handle_client_request(server_client_socket, ip_port):
while True:
recv_data = server_client_socket.recv(1024)
if recv_data:
recv_content = recv_data.decode("gbk")
print(f"接收到{ip_port}客户端的消息为:", recv_content)
send_content = input("服务端发送的消息:")
send_data = send_content.encode("gbk")
server_client_socket.send(send_data)
else:
print(f"客户端下线了,{ip_port}")
break
server_client_socket.close()
if __name__ == '__main__':
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
tcp_server_socket.bind(("", 9090))
tcp_server_socket.listen(128)
while True:
server_client_socket, ip_port = tcp_server_socket.accept()
sub_thread = threading.Thread(target=handle_client_request, args=(server_client_socket, ip_port))
sub_thread.setDaemon(True)
sub_thread.start()
|