advPython-2

网络编程(基于TCP协议)

基础(1)

文件名: myprofile.py

iaap = ("127.0.0.1", 8002)

文件名: server.py

"""
CS架构(client\server)最基本知识
"""
import socket
from myprofile_1 import iaap

# 1.创建socket对象(下面两个参数不写默认也是它俩)
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # socket.SOCK_STREAM 流式协议

# 2.绑定地址
server.bind(iaap)

# 3.监听连接请求
server.listen(5)  # 5 --> 半连接池大小

# 4.取出连接请求,开始服务
conn, addr = server.accept()

# 5.数据传输
date = conn.recv(1024)
date = date.decode("utf-8")
print(date)

# 6.结束服务
conn.close()

# 7.关闭服务器(可选)
server.close()

文件名: client.py

"""
CS架构(client\server)最基本知识
"""
import socket
from myprofile_1 import iaap

# 1.创建socket对象
client = socket.socket()

# 2.建立连接
client.connect(iaap)

# 3.传输数据
msg = input("请输入>>>")
client.send(msg.encode("utf-8"))

# 4.关闭连接(客户端的最后必须是关闭连接,从而释放客户端设备的资源)
client.close()  # 所以必须要写,这行代码对应的是服务端的conn.close()

基础(2)

文件名: myprofile.py

iaap = ("127.0.0.1", 8004)

文件名: server.py

"""
CS架构升级--连接循环
"""
import socket
import time

from myprofile_2 import iaap

# 基本步骤
sk = socket.socket()
sk.bind(iaap)
sk.listen(5)  # 半连接池
print("正在等待客户端连接...")

# 连接循环
while True:

    # 获取池中对象
    conn, addr = sk.accept()
    print("成功连接客户端")

    # 信息传输
    while True:

        # 客户端非正常断开,windows报错,而mac和Linux不会报错但收到的date为空
        try:
            date = conn.recv(1024)
        except:
            break
        if not date:
            break

        conn.send(date.upper())

    # 连接断开提醒
    print("正在关闭连接...")
    time.sleep(1.1)
    conn.close()
    print("连接已关闭")

# sk.close()

文件名: client.py

"""
CS架构升级--连接循环
"""
import socket
from myprofile_2 import iaap

# 基本步骤
sk = socket.socket()
sk.connect(iaap)

# 信息传输
while True:

    # 用户输入
    msg = input("请输入>>>").strip()
    if not msg:  # 防止输入为空,造成"卡空"
        continue
    if msg == "Q" or msg == "q":  # 正常退出操作
        break

    # 发送数据
    sk.send(msg.encode("utf-8"))

    # 接收数据
    date = sk.recv(1024)
    print(date.decode("utf-8"))

# 关闭连接,释放资源
sk.close()

并发(1)

文件名: myprofile.py

iaap = ("127.0.0.1", 8010)

文件名: server.py

"""
利用 socketserver 实现并发
"""
import socketserver
from myprofile_1 import iaap


class RequestHandle(socketserver.BaseRequestHandler):

    def handle(self):

        # 打印查看它们是什么
        print(self.request)  # 相当于coon
        print(self.client_address)

        # 数据传输部分
        while True:

            # -> 客户端非正常断开,windows报错,而mac和Linux不会报错但收到的date为空
            try:
                date = self.request.recv(1024)
            except:
                break
            if not date:
                break

            # -> 发送信息
            self.request.send(date.upper())
            print()

        # 结束服务
        self.request.close()


# 实例化??
sk = socketserver.ThreadingTCPServer(iaap, RequestHandle)
# 调用??
sk.serve_forever()

文件名: client.py

"""
利用 socketserver 实现并发
"""
import socket
from myprofile_1 import iaap

# 基本步骤
sk = socket.socket()
sk.connect(iaap)

# 信息传输
while True:
    # 信息输入
    msg = input("请输入>>>").strip()
    if not msg:
        continue
    if msg == "Q" or msg == "q":
        break

    # 发送数据
    sk.send(msg.encode("utf-8"))

    # 接收数据
    date = sk.recv(1024)
    print(date.decode("utf-8"))

# 关闭连接,释放资源
sk.close()

并发(2)

文件名: myprofile.py

iaap = ("127.0.0.1", 8033)

文件名: server.py

"""使用"进程"实现并发效果"""
import socket
from multiprocessing import Process
from myprofile_2 import iaap


def task(conn, addr):
    # 连接信息提示
    ip, port = addr
    print(f"成功连接客户端>>>\nIP>>>{ip}\n端口>>>{port}")

    # 通讯循环
    while True:
        # 防"bug"
        try:
            date = conn.recv(1024)
        except:
            break
        if not date:
            break

        # 发送消息
        conn.send(date.upper())

    # 关闭连接
    conn.close()


if __name__ == '__main__':
    # 基本部分
    sk = socket.socket()
    sk.bind(iaap)
    sk.listen(5)
    while True:
        # 获取连接对象
        conn, addr = sk.accept()

        # 将连接对象交给子进程操作
        # 先创建进程对象
        p = Process(target=task, args=(conn, addr))
        # 开始进程
        p.start()

文件名: client.py

"""使用"进程"实现并发效果"""
import socket
from myprofile_2 import iaap

sk = socket.socket()
sk.connect(iaap)

# 通讯循环
while True:

    # 信息输入
    msg = input("请输入>>>").strip()
    if not msg:
        break
    if msg == "q" or msg == "Q":
        break

    # 发送信息
    sk.send(msg.encode("utf-8"))

    # 接收信息
    date = sk.recv(1024)
    print(date.decode("utf-8"))

# 断开连接,释放资源
sk.close()

并发(3)

文件名: myprofile.py

iaap = ("127.0.0.1", 8001)

文件名: server.py

"""
使用线程实现并发效果
"""
import socket
from threading import Thread
from myprofile import iaap


def task(conn, addr):
    # 连接提示
    ip, port = addr
    print(f"客户端>>>IP:{ip}<<< >>>端口:{port}<<<\n连接成功\n")

    # 通讯循环
    while True:
        # 接收信息
        try:
            date = conn.recv(1024)
        except:
            break
        if not date:
            break

        # 发送信息
        conn.send(date.upper())

    # 关闭客户端连接
    print(f"客户端>>>IP:{ip}<<< >>>端口:{port}<<<正在关闭连接...")
    conn.close()
    print("连接已断开")


if __name__ == '__main__':
    # 基本步骤
    sk = socket.socket()
    sk.bind(iaap)
    sk.listen(5)

    # 获取连接对象
    while True:
        coon, addr = sk.accept()
        # 创建线程,将对象交给线程进行服务
        t = Thread(target=task, args=(coon, addr))
        # 开始线程
        t.start()

文件名: client.py

"""
使用线程实现并发效果
"""

import socket
from myprofile import iaap

# 基本步骤
sk = socket.socket()
sk.connect(iaap)

# 通讯循环
while True:
    # 信息输入
    msg = input("请输入>>>").strip()
    if not msg:
        continue
    if msg == "Q" or msg == "q":
        break

    # 发送消息
    sk.send(msg.encode("utf-8"))

    # 接收并打印消息
    date = sk.recv(1024)
    print(date.decode("utf-8"))

# 关闭连接,释放资源
print("正在关闭连接...")
sk.close()
print("连接已断开")

网络编程(基于UDP协议)

基础

文件名: myprofile

iaap = ("127.0.0.1", 8002)

文件名: server

"""
udp协议下的套接字

udp特点:
1.udp传输不可靠
2.udp不需要连接
"""
import socket
from myprofile import iaap

# 1.创建socket对象
sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # socket.SOCK_DGRAM 数据报协议

# 2.绑定地址
sk.bind(iaap)

# 3.通讯循环
while True:
    # 接收信息
    date, addr = sk.recvfrom(1024)

    # 发送信息
    sk.sendto(date.upper(), addr)

# # 4.关闭服务器(可选)
# sk.close()

文件名: client

"""
udp协议下的套接字

udp特点:
1.udp传输不可靠
2.udp不需要连接
"""
import socket
from myprofile import iaap

# 1.创建socket对象
sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 2.通讯循环
while True:
    # 输入数据
    msg = input("请输入>>>").strip()  # 发送不了"空"
    if not msg:
        continue
    if msg == "q" or msg == "Q":
        break

    # 发送数据
    sk.sendto(msg.encode("utf-8"), iaap)

    # 接收数据
    date, addr = sk.recvfrom(1024)
    print(date.decode("utf-8"))

# 3.关闭连接,释放资源
print("正在断开连接...")
sk.close()
print("已断开")

并发

文件名: myprofile

iaap = ("127.0.0.1", 8000)

文件名: server

"""
利用 socketserver 实现并发
"""
import socketserver
import time

from myprofile import iaap


class RequestHandle(socketserver.BaseRequestHandler):
    def handle(self):
        print(f"客户端发来的数据>>>{self.request[0]}")
        time.sleep(3)
        self.request[1].sendto(self.request[0].upper(), self.client_address)


# 实例化对象???
sk = socketserver.ThreadingUDPServer(iaap, RequestHandle)
# 调用??
sk.serve_forever()

文件名: client

"""
利用 socketserver 实现并发
"""

import socket
from myprofile import iaap

# 基本部分
sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 通讯循环
while True:

    # 输入信息
    msg = input("请输入>>>").strip()
    if not msg:
        continue
    if msg == "q" or msg == "Q":
        break

    # 发送信息
    sk.sendto(msg.encode("utf-8"), iaap)

    # 接收信息
    date, addr = sk.recvfrom(1024)
    print(date.decode("utf-8"))

# 关闭连接,释放资源
sk.close()

你可能感兴趣的:(Python进阶,python)