本文不涉及线程以及相关的死锁、互斥、共源等问题的解决
首先先搞清楚IP、端口号、TCP的概念:
IP地址就是标识网络中设备的一个地址,IP 地址分为两类:IPv4 和 IPv6
查看IP地址的方法:Linux和mac使用ifconfig这个命令,Windows使用ipconfig这个命令
判断本地网络设备是否损坏:输入如下指令,出现如下界面证明没有问题
端口(Port)大致有两种意思:一是物理意义上的端口,如:ADSL Modem、集线器、交换机、路由器用于连接其他网络设备的接口;二是逻辑意义上的端口,一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。
注意:软件层面的端口不得使用0到1024、3306、8080、13306
TCP是传输控制协议,它是一种面向连接的、可靠的、基于字节流的传输层通信协议
记忆的方法:
假设快递员送快递。IP地址相当于小区位置,端口号相当于门牌号,TCP相当于快递的箱子,socket相当于快递本身。
服务器"七步诗":(用给妹子电话记忆)
1 创建服务端socket 对象(买手机)
2 绑定ip和端口(注册手机号)
3 监听(这一步没想出来)
4 等待客户端的连接 accept()(拨打电话中)
5 接受数据(妹子说:喂)
6 回送响应(你说:是我)
7 释放资源(挂了电话)
简易服务器实现代码:
# 客户端
import socket
class WebTest(object):
def __init__(self):
"""
服务器准备工作
"""
# 创建socket对象
# socket.AF_INET IPV4 socket.SOCK_STREAM TCP协议
self.tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定ip和端口号
self.tcp_socket.bind(("127.0.0.1", 8888))
# 监听请求
self.tcp_socket.listen(127)
def connect_serve(self, ip_port, socket_name):
recieve_data = socket_name.recv(1024)
recieve_data = recieve_data.decode("utf8")
print(f"服务端接受客户端{ip_port}数据: ", recieve_data)
content = "你还可以继续发送数据".encode(encoding="gbk")
socket_name.send(content)
def start(self):
while True:
socket_name, ip_port = self.tcp_socket.accept()
self.connect_serve(ip_port, socket_name)
def main():
web_test = WebTest()
web_test.start()
return 0
if __name__ == '__main__':
main()