- 计算机网络:是多台独立自主的计算机形成的一个系统。
连接起来的目的是计算机之间共享资源。
使用TCP(能做到数据不传丢、流量控制、拥塞控制)/ICP连接起来的叫互联网。
# 创建一个无功能的服务器
from socket import socket, AF_INET, SOCK_STREAM
# SOCK_STREAM使用tcp,SOCK_DGRAM使用udp
def main():
# 创建一个基于TCP协议的套接字对象
# 因为我们做的是应用级的服务/产品,所以可以利用现有的传输服务来实现数据传输
server = socket() # AF_INET, SOCK_STREAM IPv4联网,只能这么写
# 绑定IP地址(网络上主机的身份标识)和端口(用来区分不同服务的IP 地址的扩展,一个端口对应一个服务)(端口不是一个设备)
server.bind(('10.7.189.75', 6543)) # ip写成localhost表示本地,6543表示端口号
# 开始监听客户端的连接
server.listen(512) # 512表示队列大小
print('服务器已经启动正在监听...')
while True:
# 通过accept方法接收客户端的连接
# accept方法是一个阻塞式的方法,如果没有客户端连上来
# 那么accept方法就会让代码阻塞,知道有客户端连接成功才返回
# accept方法返回一个元组,元组中的第一个值代表客户端的对象
# 元组中的第二个值又是一个元组,其中有客户端的IP地址和客户端的端口
# client = server.accept()
# print(client)
client, addr = server.accept()
print(addr, '连接成功.')
client.send('hello789'.encode('utf-8'))
client.close()
if __name__ == '__main__':
main()
模拟一个聊天服务器
from socket import socket
from threading import Thread
# TCP - Transfer Control Protocol
# UDP - User Datagram Protocol
def main():
class ClientHandler(Thread):
def __init__(self, client):
super().__init__()
self._client = client
def run(self):
while True:
try:
data = self._client.recv(1024) # 返回的是二进制数据
for client in clients:
# if client != self._client 不给自己转发消息
client.send(data) # 转发消息
if data.decode('utf-8') == 'byebye':
clients.remove(self._client)
self._client.close() # 与说‘byebye’的客户端断开连接
break
except Exception as e: # 获取异常消息
print(e) # 打印异常消息
clients.remove(self._client) # 移除异常客户端
break
server = socket()
# 这里可以使用Python命令行参数 - sys.argv
server.bind(('10.7.189.75', 54321)) # 端口号不要跟敏感号重复,建议取1025-65536区间
# 开始监听
server.listen(512)
clients = []
while True:
# 接收用户请求
client, addr = server.accept()
clients.append(client)
ClientHandler(client).start()
if __name__ == '__main__':
main()