Skip to content

网络编程

一、网络编程三要素

1. ip地址

这是网络环境下每一台计算机的唯一标识,通过IP地址来找到指定的计算机

  • ipv4

    xxx.xxx.xxx.xxx (0~255)

  • ipv6

2. 端口

用于标识进程的逻辑地址,通过端口来找到指定的进程(0~65535)

知名端口号(windows系统):0~1023

动态端口号:1024~65535

3. 协议

定义通信规则,符合协议则可以通信,否则无法正常通信

tcp协议:它是一种面向连接的、可靠的、基于字节流的传输层通信协议

  • 建立连接:三次握手
  • 传输数据
  • 关闭连接:四次挥手

udp协议:它是一种无连接传输层协议

二、socket套接字

而进程之间想要进行网络通信需要基于 socket

python
# 导入socket模块
import socket

# 内容转换为字节encode
内容.encode(encoding = 'utf-8'
# 字节转换为内容decode
字节.decode(encoding = 'utf-8')

三、TCP

1. 客户端

python
客户端
1.创建客户端
2.连接服务端
3.发送消息(字节)
4.等待服务器响应(阻塞)
5.停止客户端
import socket

# 1.实例化socket([ipv4/ipv6],[tcp/udp]) - 创建客户端
# tcp_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#传参的写法
tcp_client = socket.socket()  # 省略参数的写法

# 2.连接服务器connect(ip,端口)
tcp_client.connect(('192.168.14.21',10086))

# 3.发送消息send(字节)
message = input('请输入你的聊天内容')
tcp_client.send(message.encode(encoding='utf-8'))

# 4.接收服务端消息(可选 - 阻塞代码)
server_message = tcp_client.recv(1024)
print(server_message.decode(encoding='utf-8'))

# 5.断开连接close
tcp_client.close()

2. 服务端

python
1.创建服务端
2.绑定ip地址,端口号
3.设置最大连接数的监听
4.开始接入客户端,产生一个【新的聊天客户端】(阻塞)
5.给客户端发消息
6.接收客户端消息
7.停止【新的聊天客户端】
8.停止服务端
import socket

# 1.创建服务端
server_client = socket.socket()
# 2.绑定ip和端口号
server_client.bind(('192.168.14.21', 10086))
# 设置端口复用(当前的套接字,端口服用选项,布尔值)
server_client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 3.监听客户端的接入(数量)
server_client.listen(10)
# 排队和每一个人聊天---------------------------------
while True:
    # 4.开始接入客户端(阻塞),返回(用于聊天的服务端)
    client, address = server_client.accept()
    # 5.服务端发给客户端送消息send
    server_message = "欢迎加入聊天室~"
    client.send(server_message.encode(encoding='utf-8'))
    # 6.接收客户端发送的消息recv(内容大小)
    client_message = client.recv(1024)
    print(address, client_message.decode(encoding='utf-8'))
    # 7.关闭与客户端的通道
    client.close()

# 所有人聊天结束---------------------------------------
# 8.关闭服务端(符合业务严谨程度)
server_client.close()

四、拓展

1. UDP

客户端

python
import socket

# udp 连接
# 创建udp客户端 - SOCK - DGRAM
udp_client = socket.socket(type=socket.SOCK_DGRAM)
# udp发送消息(message.decode(),(IP,端口))sendto
# udp(飞秋特有格式)
message = input('请输入要发送的消息:')
# 点对点(要发送的ip)
# udp_client.sendto(f'1:134871264:兵马俑:2号坑位5排14位:32:{message}'.encode('gbk'), ('192.168.14.21', 2425))
# 广播模式(ip最后一位255)
udp_client.sendto(f'1:134871264:兵马俑:2号坑位5排14位:32:{message}'.encode('gbk'), ('192.168.14.255', 2425))

服务端:飞秋

2. TCP + ollama

服务端

python
# 1. 客户端发送tcp消息 - 用户询问了一个问题
# 2. 服务端接收tcp消息 - ollama处理这个问题

# 客户端发消息(tcp) --------->  服务端 ---中转---> ollama
#                                                   ↓
# 客户端发消息(tcp) <---------  服务端 <--中转---- ollama
import socket
import ollama

# 创建服务端
server_client = socket.socket()
# 绑定ip+端口号
server_client.bind(('127.0.0.1', 10087))
# 设置监听那个数量
server_client.listen(10)
# 等待客户端接入,chat_client 是接入的子服务端
chat_client, address = server_client.accept()
print(f'新用户{address}接入客户端')
# 接收消息
client_message = chat_client.recv(1024)
print(f'用户{address}发来的消息是:{client_message.decode(encoding="utf-8")}')

# 建立ollama客户端
ollama_client = ollama.Client(host='127.0.0.1:11434')
ollama_massage = ollama_client.chat(
    model='deepseek-r1:1.5b',
    messages=[{'role': 'user', 'content': client_message.decode(encoding="utf-8")}]
)
print(f'ollama返回的消息是:{ollama_massage.message.content}')

# 响应消息给客户端
chat_client.send(ollama_massage.message.content.encode(encoding="utf-8"))
# 关闭聊天
chat_client.close()
# 关闭服务端
server_client.close()

3. TCP图片服务器

需求:写一个服务器,可以用来接收别人上传的图片,把别人上传的图片保存在本地

客户端

python
import socket

# 创建客户端
client = socket.socket()
# ip+端口
client.connect(('127.0.0.1', 10087))
with open(file='img.png', mode='rb+') as f:
    # 读取图片内容
    img_content = f.read()
    # 发送图片给服务端
    client.send(img_content)
    # 接受服务端返回的消息
    server_message = client.recv(1024)
    print(server_message.decode(encoding='utf-8'))
    client.close()

服务端

python
import socket
import time

# 创建服务器
server = socket.socket()
# 绑定ip和端口号
server.bind(('127.0.0.1', 10087))
# 设置监听数量
server.listen(10)
while True:
    # 建立与客户端通信
    img_client, address = server.accept()
    # 接收客户端内容
    img_content = img_client.recv(10 * 1024 * 1024)
    # 把图片写入文件中,存在文件夹中
    with open(file=f'img_info/{time.time()}.png', mode='wb+') as f:
        f.write(img_content)
        print(f'{address}图片保存成功:{time.time()}')
        # 响应给客户端
        img_client.send('图片保存成功'.encode(encoding='utf-8'))
        # 关闭通道
        img_client.close()
# 关闭服务端
server.close()