测试&网络编程

一、unittest

功能:


def one_equation(a,b):
   """
       :param a:
       :param b:
       :return:
       ax + b = 0 的解
       x = -(b/a)
   """
   if a == 0:
       raise ValueError("被除数不能为零")
   else:
       return -(b/a)

def two_equation(a,b,c):
   """
   求解一元二次方程a*x*x + b*x + c=0的解
   :param a: 方程中二元变量的系数
   :param b: 方程中一元变量的系数
   :param c: 方程中的常量
   :return:  返回方程的根
   """
   # (-b + (b**2 - 4ac)**1/2)/2a
   # (-b - (b ** 2 - 4ac) ** 1/2)/2a
   if a == 0:
       raise ValueError("参数错误a!=0")
   elif b*b - 4*a*c < 0:
       raise ValueError("方程无解")
   elif b*b - 4*a*c == 0:
       return -b/(2*a)
   else:
       r1 = (-b + (b*b - 4*a*c)**(1/2))/(2*a)
       r2 = (-b - (b*b - 4*a*c)**(1/2))/(2*a)
       return r1,r2

测试:

"""
.: 测试全通过      .:pass
F: 测试失败        F:fail
E:测试出错        E:error
s: 跳过 该测试     s:skip 
"""
class TestFkMath(unittest.TestCase):
   def test_one_equation(self):
       self.assertEqual(one_equation(5,9),-1.8)
       self.assertTrue(one_equation(4,10) == -2.5,.00001)
       self.assertTrue(one_equation(4,-27) == 27/4)
       # 错的测试用例
       self.assertTrue(one_equation(1, -27) == 27/1)
   # 求解一元二次方程
   def test_two_equation(self):
       r1,r2 = two_equation(1,-3,2)
       self.assertCountEqual((r1,r2),(1.0,2.0),"求解出错")
       r1, r2 = two_equation(2,-7,6)
       self.assertCountEqual((r1, r2), (1.5, 2.0), "求解出错")
       with self.assertRaises(ValueError):
           two_equation(9,4,3)
       with self.assertRaises(ValueError):
           two_equation(4, 2, 3)

if __name__ == "__main__":
   unittest.main()

二、TCP/UDP网络编程

2.1 TCP

客户端:

"""
AF_INET: IPV4协议
AF_INET6: IPV6协议
SOCK_STREAM (TCP链接)
SOCK_DGRAM  (UDP链接)
"""
# tcp ipv4链接
tcp_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# bind ip
# 共有65535个端口
# 1000以内都是系统预留的
tcp_client.connect(("127.0.0.1",8005))
# 发送数据到服务器
while True:
   data = input("内容: ")
   tcp_client.send(data.encode("utf-8"))
   data = tcp_client.recv(1024)
   print(data.decode("utf-8"))

服务端:

"""
AF_INET: IPV4协议
AF_INET6: IPV6协议
SOCK_STREAM (TCP链接)
SOCK_DGRAM  (UDP链接)
"""
# tcp ipv4链接
tcp_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

# bind ip
# 共有65535个端口
# 1000以内都是系统预留的
tcp_client.connect(("127.0.0.1",8005))
# 发送数据到服务器
while True:
   data = input("内容: ")
   tcp_client.send(data.encode("utf-8"))
   data = tcp_client.recv(1024)
   print(data.decode("utf-8"))

步骤:

​ step1: 先启动服务端

​ step2: 再启动客户端

​ 原则:保证端口一致

2.2 UDP
# 建立UDP
import socket
udp_cli = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
   data = input("请输入你要说的话")
   udp_cli.sendto(data.encode("utf-8"),("127.0.0.1",8858))
import socket
udp_serv = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
udp_serv.bind(("127.0.0.1",8858))
while True:
   data,addr = udp_serv.recvfrom(1024)
   print("msg:",data.decode("utf-8"),"addr:",addr)

三、多线程

服务端:

# -*- coding:utf-8 -*-
"""
# @project : xcenv
# @Time : 2019/12/21 21:57
# @FileName : multiThread.py
# @Author : 摩登老师
# @在线教育机构 : 扣丁学堂
# @个人学习公众号(bilibili) : 猫在大神旁的小C
"""

import socket  # 导入 socket 模块
from threading import Thread

ADDRESS = ('127.0.0.1', 8712)  # 绑定地址
g_socket_server = None  # 负责监听的socket
g_conn_pool = []  # 连接池



def init():
   """
   初始化服务端
   """
   global g_socket_server
   g_socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 创建 socket 对象
   g_socket_server.bind(ADDRESS)
   g_socket_server.listen(5)  # 最大等待数
   print("服务端已启动,等待客户端连接...")


def accept_client():
   """
   接收新连接
   """
   while True:
       client, _ = g_socket_server.accept()  # 阻塞 , 等待客户端连接
       # 加入连接池
       g_conn_pool.append(client)
       # 给每个客户端创建一个独立的线程进行管理
       thread = Thread(target=message_handle, args=(client,))
       # 设置成守护线程
       thread.setDaemon(True)
       thread.start()


def message_handle(client):
   """
   消息处理
   """
   client.sendall("连接服务器成功!".encode(encoding='utf8'))
   while True:
       bytes = client.recv(1024)
       print("客户端消息:", bytes.decode(encoding='utf8'))
       if len(bytes) == 0:
           client.close()
           # 删除连接
           g_conn_pool.remove(client)
           print("有一个客户端下线了。")
           break

if __name__ == '__main__':
   init()
   # 新开一个线程,用于接收新连接
   thread = Thread(target=accept_client)
   thread.setDaemon(True)
   thread.start()
   # 主线程逻辑
   while True:
       cmd = input("""--------------------------
输入1:查看当前在线人数
输入2:给指定客户端发送消息
输入3:关闭服务端
""")
       if cmd == '1':
           print("--------------------------")
           print("当前在线人数:", len(g_conn_pool))
       elif cmd == '2':
           print("--------------------------")
           index, msg = input("请输入“索引,消息”的形式:").split(",")
           g_conn_pool[int(index)].sendall(msg.encode(encoding='utf8'))
       elif cmd == '3':
           exit()

客户端:

import socket  # 导入 socket 模块

s = socket.socket()  # 创建 socket 对象
s.connect(('127.0.0.1', 8712))
print(s.recv(1024).decode(encoding='utf8'))
s.send("连接了".encode('utf8'))
print(s.recv(1024).decode(encoding='utf8'))
input(" ")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值