这是一篇散文

一、网络编程

1.1网络编程三要素

IP地址:设备在网络中的唯一标识。
​ Windows中查看IP地址:ipconfig
​ 在Linux或Mac系统中用:ifconfig

端口:传输数据的入口,类似于门。端口是程序在设备上的唯一标识。
​ Windows中用netstat -ano 查看,如果是Linux或者Mac系统用命令 netstat -anp查看。

协议:通信规则。有两种TCP和UDP。

1.2握手和挥手

这个点在面试题常出现,指的是客户端和服务器端建立连接和断开连接时的过程。

​ 三次握手(建立连接):

  • 客户端像服务器端发出请求, 申请建立连接。

  • 验客户端数据合法后, 给出客户端回执信息, 可以建立连接。

  • 客户端重新向服务器端发出请求, 建立连接。

四次挥手(断开连接):

A => B B => A 因为TCP协议是双向的, 需要两个方向都断开, 所以会交互4次。

1.3网络编程流程

格式如下:

# 在TCP服务器程序开发流程:

# 1.创建服务器端socket对象
# 2.绑定服务器IP和端口
# 3.设置监听数量
# 4.等待客户端的连接,如有返回与客户端交互的socket对象和客户端IP地址
# 5.给客户端发送数据
# 6.接收客户端发送的数据
# 7.释放与客户端交互的socket对象

# TCP客户端程序开发流程:

# 1. 创建客户端socket对象
# 2. 连接服务器端IP和端口
# 3.接收服务器端发送的数据
# 4.给服务器端发送数据
# 5.释放资源

代码如下:

# 需求:通过TCP客户端发送消息:Hello 文柏! 通过TCP服务器端接收消息,并打印出来。

# 导包
import socket

if __name__ == '__main__':
    # 客户端
    # 1. 创建客户端socket对象
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2. 连接服务器端IP和端口
    client_socket.connect(('192.168.*.*', 6666))
    # 3.给服务器端发送数据
    client_socket.send('Hello 文柏!'.encode('utf-8'))
    # 4.释放资源
    client_socket.close()

    # 服务器端
    # 1.创建服务器端socket对象
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2.绑定服务器IP和端口
    server_socket.bind(('192.168.*.*', 6666))
    # 3.设置监听数量
    server_socket.listen(3)
    # 4.等待客户端的连接,如有返回与客户端交互的socket对象和客户端IP地址
    accept_socket, client_info = server_socket.accept()
    # 5.接收客户端发送的数据
    recv_byt_data = accept_socket.recv(1024)
    recv_data = recv_byt_data.decode('utf-8')
    print(recv_data)
    # 7.释放与客户端交互的socket对象
    accept_socket.close()

案例:模拟客户端向服务器端发送文件。

# 客户端
# 导包
import socket

if __name__ == '__main__':
    # 创建客户端socket对象
    cli_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # 连接服务器端
    cli_socket.connect(("192.168.*.*",8888))
    # 读取数据源文件信息,并发送数据到服务器
    with open('d:/1.txt','rb') as src_f:
        # 分批次读取,一次读1024字节
        while True:
            # 具体读取的动作
            data = src_f.read(1024)
            # 将读取到的数据发给服务器端
            cli_socket.send(data)
            # 判断是否读取完毕
            if len(data) <= 0:
                break
    # 释放资源
    cli_socket.close()
    

# 服务器端
# 导包
import socket

if __name__ == '__main__':
    # 创建服务器端对象
    ser_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # 绑定服务器端IP和端口
    ser_socket.bind(("192.168.*.*",8888))
    # 设置监听数量
    ser_socket.listen(5)
    # 启动监听等待客户端连接 如有 则返回与客户端交互的对象和客户端信息
    accept_socket,  client_info = ser_socket.accept()
    # 接收客户端发送的文件
    # 关联目的地文件,用于把客户端发送的数据写到其中.
    with open('./data/client.txt','wb') as dest_f:
        #循环接收客户端发过来的文件数据
        while True:
            # 具体的接收动作
            recv_data = accept_socket.recv(1024)
            # 判断接收的文件是否为空 即是否接收完毕
            if len(recv_data) <= 0:
                break
            # 把接收到数据写入目的文件中
            dest_f.write(recv_data)
    # 释放资源
    accept_socket.close()

二、进程和线程

进程: 指的是可执行程序(例如: *.exe), 也是CPU分配资源的最小单位。

线程: 指的是进程的执行路径, 也是CPU调度的最小执行单元。

案例:

# 请使用多任务形式完成:一边编程、一边听音乐、一边跟同事聊天。要求如下:
#a.使用多进程完成;

# 导包
import multiprocessing,time
# 定义写代码函数
def coding():
    for i in range(33):
        # 加入睡眠,增强效果
        time.sleep(0.01)
        print('编写代码中请勿打扰...')

# 定义听音乐函数
def music():
    for i in range(20):
        # 加入睡眠
        time.sleep(0.01)
        print('听着小曲儿,哼着歌******')

# 定义聊天函数
def spk():
    for i in range(30):
        # 加入睡眠
        time.sleep(0.01)
        print('Hello World$$$$$$$')

if __name__ == '__main__':
    # 创建进程对象
    c1 = multiprocessing.Process(target=coding)
    m1 = multiprocessing.Process(target=music)
    s1 = multiprocessing.Process(target=spk)

    # 启动进程
    c1.start()
    m1.start()
    s1.start()
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值