精华内容
下载资源
问答
  • 现在要求,用php如何将这些记录进行累加,最后显示为一个总长为秒钟的结果? 复制代码 代码如下: //连接数据库… 略 $total = 0; //总秒数 $sql = “select duration from test”; $rs = mysql_query($sql); ...
  • 使用socket进行网络通信踩过的坑 我们现在先简单实现跟一个人来回通话过程。 客户端: 通过循环来输入多次命令,若代码如下: import socket client = socket.socket() #声明socket类型,同时生成socket连接...

    使用socket进行网络通信时踩过的坑

    我们现在先简单实现跟一个人来回通话过程。

    客户端:

    通过循环来输入多次命令,若代码如下:

    import socket
    client = socket.socket() #声明socket类型,同时生成socket连接对象
    client.connect(('localhost',6969))
    
    while True:
        msg = input(">>:").strip()
        client.send(msg.encode("utf-8"))
        data = client.recv(10240)
        print("recv:",data.decode())
    
    client.close()

    client.recv(1024): 1024换算一下表示每次只接收1K的内容

    服务器端:

    使用多次接收,如果代码如下:

    import socket
    client = socket.socket() #声明socket类型,同时生成socket连接对象
    server.bind(('localhost',6969)) #绑定要监听端口
    server.listen(5) #监听 
    
    print("我要开始等电话了")
    
    while True:
        conn, addr = server.accept()  # 等电话打进来
        # conn就是客户端连过来而在服务器端为其生成的一个连接实例
        print(conn, addr)
        print("电话来了")
        data = conn.recv(1024)
        print("recv:",data)
        conn.send(data.upper())
       
    server.close()
    
    

    如果是上述代码,那么造成的结果,就是嘻嘻嘻:
    很多人连上来,但是每次只能跟服务端说一句话,然后第二句话卡住。

    在这里插入图片描述

    第二个客户端一样,每次只能跟服务端说一句话,然后第二句话卡住:
    在这里插入图片描述
    也说明服务端写成这种代码是不行的,会造成代码卡住。
    我们现在先来实现跟一个人可以来来往往的说话:(暂时无法实现跟多个人)

    import socket
    client = socket.socket() #声明socket类型,同时生成socket连接对象
    server.bind(('localhost',6969)) #绑定要监听端口
    server.listen(5) #监听 
    
    print("我要开始等电话了")
    conn, addr = server.accept()  # 等电话打进来
    # conn就是客户端连过来而在服务器端为其生成的一个连接实例
    print(conn, addr)
    print("电话来了")
    
    while True:
         data = conn.recv(1024)
         print("recv:",data)
    

    以上的服务端代码已经可以跟客户端实现完美的交换式通讯,但是你会发现产生一个新的问题:
    当客户端断开的时候,服务端提示报错,然后也断开连接,结束代码了。
    其实这个是win上的一个BUG,其中一个连接断开的时候,server也断开了,这个是不对的。
    但是在linux上是可以正常执行的,客户端断开,服务端不会停止代码,也不会停止服务。

    运行结果图如下:
    在这里插入图片描述
    下面我们放入Linux下运行:
    但是现在运行在linux依旧还是有BUG,我们发现当客户端断开的时候,服务端会进入一个死循环。
    在这里插入图片描述
    表示服务端不停的接收到了空字符的,造成了死循环。所以我们要修改服务端的代码,当接收到空字符串的时候,不要进入死循环,而重新接收状态:

    修正后的服务端代码如下:

    print("我要开始等电话了")
    
    while True:
        conn, addr = server.accept()  # 等电话打进来
        # conn就是客户端连过来而在服务器端为其生成的一个连接实例
        print(conn, addr)
        print("电话来了")
        while True:
            data = conn.recv(1024)
            print("recv:",data)
            if not data:
               print("client has lost...")
               break
            conn.send(data.upper())
            
    server.close()

    这样实现了,第一个人可以跟服务端不停的通讯,这个时候如果第二个人进来想通话,会卡住;直到第一个人跟服务端断开以后,第二个人可以立即接入进行跟服务端进行通讯~!

    在这里插入图片描述

    这边有个要注意的地方server.listen(5),这里的5表示最多允许有5个client挂起,等待中,排队中。。。不过这个必须在异步的情况下,才可以测试出来。
    在这里插入图片描述
    然后,我们又发现了一个bug,如果客户端client发送一个空,会造成程序卡死。

    在这里插入图片描述
    client.send不能发送空!不能发送空!所以我们客户端的代码要改进下:

    import socket
    client = socket.socket() #声明socket类型,同时生成socket连接对象
    client.connect(('localhost',6969))
    
    while True:
        msg = input(">>:").strip()
        if len(msg) == 0:continue
        client.send(msg.encode("utf-8"))
        data = client.recv(10240)
        print("recv:",data.decode())
    
    client.close()

    我们现在来模拟客户端是ssh:
    先来看看服务端的代码的修改:
    在这里插入图片描述
    在这里插入图片描述
    客户端执行代码,可以正常返回。
    在这里插入图片描述
    但是现在有几个新问题:
    不能执行top命令,因为top命令会一直执行刷新,不停变化:
    在这里插入图片描述

    但是我们可以执行top -bn 1,让top执行一次。但是由于top -bn 1返回的结果超过了1024字节,你后面再输入命令df依旧返回的是top -bn 1的命令结果,继续执行新命令还是返回top -bn 1的返回值:如下图
    在这里插入图片描述
    在这里插入图片描述
    这个时候我们需要修改客户端接收信息的大小,我们原来是1024字节,修改为102K,如下图:

    在这里插入图片描述
    这个时候,我们再执行top -bn 1,就 可以返回正常的所有值了。
    如果我们这个时候发送一个超大文件,比如60M的文件:
    我们来看看服务端的代码:(注意这里是py2的代码,到py3,必须先转换为二进制)
    在这里插入图片描述
    来看看客户端的代码修改:

    在这里插入图片描述
    执行上诉代码以后,我们发现服务端的conn.send也是有大小限制的,我们发现每次最多值发送32K大小的文件:
    在这里插入图片描述

    所以我们要修改服务端的代码,进行循环send,发送文件直到把文件发送出去。 我们需要用到conn.sendall方法:

    在这里插入图片描述
    虽然我们使用了sendall的方法,但是我们要注意服务端第一次只发送32K的文件(第2,第3次依次增加,但是最大不超过客户端的recv(xxxx),xxxx设置的数值,上诉例子设置的是10M),所以你客户端需要多次send命令,让服务端不停的往客户端发送文件。

    我们用f.flush的方法,来强制客户端写入文件,让我们可以看到文件的增加的大小。

    在这里插入图片描述
    下面我们来看看文件的传输过程:
    第一次:
    在这里插入图片描述
    在这里插入图片描述
    第二次:

    在这里插入图片描述
    在这里插入图片描述
    第三次:
    在这里插入图片描述
    在这里插入图片描述
    文件的传输最大不超过10M/次,客户端的recv的参数设置

    展开全文
  • 现在就来总结下while与break、continue、return以及goto一起使用的案例 注意 1.break语句用于do-while、for、while循环语句中,可使程序终止循环 2.break语句对if-else的条件语句不起作用 3.在多层循环中,一个...

    原创:https://blog.csdn.net/liebecl/article/details/76167106

    由于程序的复杂性需要 我们在一个程序中建立许许多多的嵌套语句进行程序的搭建 这就导致了如何跳出循环成为了一个重要的环节

    现在就来总结下while与break、continue、return以及goto一起使用的案例


    注意

    1.break语句用于do-while、for、while循环语句中时,可使程序终止循环
    2.break语句对if-else的条件语句不起作用
    3.在多层循环中,一个break语句只向外跳一层
    4.在 C语言 的 switch(开关语句)中,break 语句还可用来在执行完一个 case(分支)后立即跳出当前 switch 结构


    (1)while与break:直接跳出整个循环体

    break语句的使用场合主要是switch语句和循环结构 在循环结构中使用break语句,如果执行了break语句,那么就退出循环,接着执行循环结构下面的第一条语句。如果在多重嵌套循环中使用break语句,当执行break语句的时候,退出的是它所在的循环结构,对外层循环没有任何影响。如果循环结构里有switch语句,并且在switch语句中使用了break语句,当执行switch语句中的break语句时,仅退出switch语句,不会退出外面的循环结构

    while(flag<5)
    {
    	flag++;
    	if(flag == 4)
    	{
    		break;
    	}
    	printf("flag = %d.\n",flag)
    }
    

    当flag=4,直接跳出while循环


    (2)while与continue:直接跳出本次循环,继续执行下次循环

    continue语句是这5种结束循环的方式中最特殊的,因为它并没有真的退出循环,而是只结束本次循环体的执行,所以在使用continue的时候要注意这一点

    while(flag<5)
    {
    	flag++;
    	if(flag == 4)
    	{
    		continue;
    	}	
    	printf("flag = %d.\n",flag);
    }
    

    当flag=4,直接跳出本次循环,接着判断while循环的条件


    (3)while与return:直接跳出整个函数

    如果在程序中遇到return语句,那么代码就退出该函数的执行,返回到函数的调用处,如果是main()函数,那么结束整个程序的运行

    void func(void)
    {
    	while(flag<5)
    	{
    		if(flag == 4)
    		{
    			flag++;
    			return;
    		}
    	printf("flag = %d.\n",flag);
    	}
    }
    

    当flag=4,直接跳出循环和函数func()


    (4)while和goto:直接goto到某个地方继续执行

    void func(void)
    {
    	while(flag<5)
    	{
    		if(flag == 4)
    		{
    			goto EXIT;
    		}
    		printf("flag = %d.\n",flag);
    	}
    	EXIT:return;//EXIT:可以指向任何执行语句 例如EXIT:cout<<"程序结束";
    }
    

    goto到EXIT的地方继续执行函数


    exit()函数

    exit()函数与return语句的最大区别在于,调用exit()函数将会结束当前进程,同时删除子进程所占用的内存空间,把返回信息传给父进程。当exit()中的参数为0时,表示正常退出,其他返回值表示非正常退出,执行exit()函数意味着进程结束;而return仅表示调用堆栈的返回,其作用是返回函数值,并且退出当前执行的函数体,返回到函数的调用处,在main()函数中, return n和exit(n)是等价的


    exit函数和return的主要区别

    1.exit(); 是整个程序的结束 return();是某个函数的结束,并返回结果
    2.exit 是一个函数 return返回函数值,是关键字
    3.exit是系统调用级别的,它表示了一个进程的结束 return是语言级别的,它表示了调用堆栈的返回
    4.exit是操作系统提供的(或者函数库中给出的) return是C语言提供的

    非主函数中调用return和exit效果很明显,但是在main函数中调用return和exit的现象就很模糊,多数情况下现象都是一致的


    void func(void) 
    {
    	while (flag < 5) 
    	{
    		flag++;
    		if (flag == 4)
    		{
    			exit(1);
    		}
    		printf("flag = %d.\n", flag);
    	}
    }
    

    当flag=4,跳出循环并结束程序进程 返回值为非正常值

    源自-C++类和对象项目

    展开全文
  • 现在我可以进入主函数等进行单步仿真等操作,但是不知道应该怎么进入外部中断的函数,请大神指点~ 主函数: ``` #include "stm32f4xx.h" #include "led.h" #include "bit_operation.h" #include "Systick.h...
  • 游标循环loop,while和for的性能比较

    千次阅读 2017-03-28 17:01:05
    利用游标循环取大量数据,性能显得十分重要,现在对三种循环进行一下性能的比较: 一、测试环境配置: 硬件 : HP笔记本 intel core(TM)2 主频2.0GHz 3G内存 win7操作系统 工具 : PL/SQL 数据库...

    利用游标循环取大量数据时,性能显得十分重要,现在对三种循环进行一下性能的比较:

    一、测试环境配置:

    硬件 :   HP笔记本 intel core(TM)2  主频2.0GHz  3G内存   win7操作系统

    工具  :   PL/SQL

    数据库 :  oracle   

    -----------------------------------------------------------------------------

    我的数据库中sb_kpxx表中含有103,521,479条数据,已经到达了亿的级别,所以可以拿来测试。测试时通过设置rownum参数,可以进行不同数量级的性能测试,由于时间关系,这里仅进行万,十万,百万级的测试。

    二、测试代码如下:

    --测试代码仅对取数据进行测试,并未进行数据操作!

    --loop方式

    set serveroutput on;
    declare
              v_num  varchar2(100);
              cursor c_num  is  select sb_num from super.sb_kpxx where rownum < 60000;
        begin
          DBMS_OUTPUT.enable(800000);
            Open  c_num;
            Loop
                Fetch c_num into v_num;
                exit when c_num%notfound;--未找到数据时退出(即到达记录末尾)。
            End Loop;
            Close c_num;
        end;
    /

     --while方式

     declare
              v_num    varchar2(100);
              cursor c_num  is  select sb_num from super.sb_kpxx where rownum < 60000;
        begin
            Open  c_num;
             Fetch c_num into v_num;
              While c_num%Found--能找到数据则执行循环内语句。
              Loop
              Fetch  c_num  into v_num;
              End Loop;
            Close c_num;
        end;
    /     

    --for方式

    set serveroutput on;
     declare
             v_num varchar2(100);
            cursor c_num is select sb_num from super.sb_kpxx where rownum < 60000;
        begin
              DBMS_OUTPUT.ENABLE (800000);
             for cur in c_num--cur是固定自带的。
             loop
             v_num := cur.sb_num;
             end loop;
        end;
    /

    三、测试结果

    这里各个级别均进行了5次测试,取平均值后填入下表:

    级别

    loop

    while 

    for 

    万级  (6万)

    0.59

    0.646

    0.059

    十万级  (60万)

    5.519

    5.8

    0.443

    百万级  (600万)

    55.047

    55.817

    4.348

    千万级  (6000万)

    未测

    未测

    71.729

    单位:秒

    四、结论:

    从表中可以看出无论哪个级别,for循环的效率都是远远高出loop和while方式的,而loop和while则相差不大:

    1.从消耗时间的数量级来看,loop和while均在同一个数据量级上,而for则比它们要第一个数量级。

    2.当数据量到达百万级别时,loop和while已经快接近分的级别了,for仍在秒一级,直到千万级时才到达分的级别。

    展开全文
  • 利用游标循环取大量数据,性能显得十分重要,现在对三种循环进行一下性能的比较: 一、测试环境配置: 硬件 :  HP笔记本 intel core(TM)2  主频2.0GHz 3G内存 win7操作系统 工具 :   PL/SQL 数据库 :  ...

    利用游标循环取大量数据时,性能显得十分重要,现在对三种循环进行一下性能的比较:

    一、测试环境配置:

    硬件 :   HP笔记本 intel core(TM)2  主频2.0GHz  3G内存   win7操作系统

    工具  :   PL/SQL

    数据库 :  oracle   

    -----------------------------------------------------------------------------

    我的数据库中sb_kpxx表中含有103,521,479条数据,已经到达了亿的级别,所以可以拿来测试。测试时通过设置rownum参数,可以进行不同数量级的性能测试,由于时间关系,这里仅进行万,十万,百万级的测试。

    二、测试代码如下:

    --测试代码仅对取数据进行测试,并未进行数据操作!

    --loop方式

    set serveroutput on;
    declare
              v_num  varchar2(100);
              cursor c_num  is  select sb_num from super.sb_kpxx where rownum < 60000;
        begin
          DBMS_OUTPUT.enable(800000);
            Open  c_num;
            Loop
                Fetch c_num into v_num;
                exit when c_num%notfound;--未找到数据时退出(即到达记录末尾)。
            End Loop;
            Close c_num;
        end;
    /

     --while方式

     declare
              v_num    varchar2(100);
              cursor c_num  is  select sb_num from super.sb_kpxx where rownum < 60000;
        begin
            Open  c_num;
             Fetch c_num into v_num;
              While c_num%Found--能找到数据则执行循环内语句。
              Loop
              Fetch  c_num  into v_num;
              End Loop;
            Close c_num;
        end;
    /     

    --for方式

    set serveroutput on;
     declare
             v_num varchar2(100);
            cursor c_num is select sb_num from super.sb_kpxx where rownum < 60000;
        begin
              DBMS_OUTPUT.ENABLE (800000);
             for cur in c_num--cur是固定自带的。
             loop
             v_num := cur.sb_num;
             end loop;
        end;
    /

    三、测试结果

    这里各个级别均进行了5次测试,取平均值后填入下表:

    级别

    loop

    while 

    for 

    万级  (6万)

    0.59

    0.646

    0.059

    十万级  (60万)

    5.519

    5.8

    0.443

    百万级  (600万)

    55.047

    55.817

    4.348

    千万级  (6000万)

    未测

    未测

    71.729

    单位:秒

    四、结论:

    从表中可以看出无论哪个级别,for循环的效率都是远远高出loop和while方式的,而loop和while则相差不大:

    1.从消耗时间的数量级来看,loop和while均在同一个数据量级上,而for则比它们要第一个数量级。

    2.当数据量到达百万级别时,loop和while已经快接近分的级别了,for仍在秒一级,直到千万级时才到达分的级别。

    展开全文
  • 比如表A中有两个字段a,b,现在需要对符合条件的记录,对a进行计数,并存在a中。 ab0y0n0n0y 更改后需要达到的效果ab1y0n0n2y 当然,可以用游标实现,也许游标的效率比我下边的写法效率更高,但是游标...
  • 关于list,vector这类stl在for或者是while循环如果不做处理直接用erase(it)这种是会导致迭代器失效的事,想必已有很多人遇到了。不多解释,现在说一下我遇到的问题。 我的代码一般是写两个版本的,跨windows和...
  • //服务器一直等待客户端的连接,当与客户端建立连接,服务器分出一个线程建立新的Socket进行处理,原有Socket继续等待 //此处为了简便省略线程 while(true){ Socket socket = server.accept(); //...
  • An unknown server-side error occurred while processing the command. Original error: unknown error: Chrome version must be >= 55.0.2883.0 </code></pre> 解决办法可以参考官方文档</a></p> 我使用的...
  • jsp页面通过超链标签下载文件,文件名包含中文,下载乱码,英文和数字可以正常下载,根据网上的方法试了很多次还是解决不了,困扰一天了,现在是凌晨1点这个问题搞得我睡不着,各位老哥帮小弟看看是 哪里错了![图片说明]...
  • 项目中有一个文件下载功能,在页面上点击“下载”按钮,会到struts的action中,在action中进行查询工作,查到要下载文件的路径及文件名,然后跳转到jsp页面。 jsp内容: String filename = URLEncoder....
  • cout 账目不存在,请进行初始化操作!" ; return; } while (1) { fdat.seekg(0, ios::beg); cout 请选择需要查询的信息:" ; cout 按月查询\t" 按日查询\t"按订单查询\t"按银行账号查询\t"按现金查询\t...
  • # 通过zip操作将两个Dataset合并为一个Dataset,现在每个Dataset中每一项数据ds由4个张量组成 # ds[0][0]是源句子 # ds[0][1]是源句子长度 # ds[1][0]是目标句子 # ds[1][1]是目标句子长度 #...
  • public void run() { ...现在第一次没问题。第二次在放如监控目录下一个文件就提示这个异常。但是我如果在inStream = new FileInputStream(filePath); 这行打个断点停顿下就没这个问题了。在线求解。
  • 想实现的功能是建立一堆文本文件的索引,但是现在已经成功创建了一个索引表,但把索引表存入文件的时候就会进行到一半然后崩溃 需要在目录下创建一个book文件夹储存信息 现在的问题 信息太多时候写入最后save_...
  • 现在就是差一个先序遍历的要求没有做到 ``` #include #include #include //树结点定义 typedef struct { int weight; int parent; int lchild; int rchild; }HTNode,*HuffmanTree; static ...
  • 我写的是快速排序,现在的问题是1.无法运行到100万个数,到10万有时候就会出错了;2. 想要在生成随机数之后将随机数保存在一个TXT文件中,在将数据全部排序之后将排序后的数据也保存在同一个TXT文件中,但是我写出来...
  • 当异步写操作结束,调用HandleIOResult函数进行处理。 现在的问题是:在捕获信号的过程中,会出现捕获的信号个数少于发送的信号个数。 而当我在每一次异步写之前添加usleep以后,则不会出现这种情况,即所有的信号...
  • //运行自动将io流异常初始化,并打印出程序的异常信息 } } public void paint(Graphics g){ BufferedImage bi = new BufferedImage(500,500,BufferedImage.TYPE_INT_ARGB); Graphics g2 = bi....
  • //设置输入多项式字符串长度最大限,也可以根据需求任意设置 int order;//设置多项式显示方式0代表降幂显示,1代表升幂显示 class node//定义一个node类,处理多项式中的<项>:如3x^(-2)、4x^3、6x或者常数5...
  • 这是前提,现在我运行程序,但是当我每当创建一个客户端,Server.num都不会改变,不知道怎么回事,急求大神解答,感激不尽! 以下是源代码,这里我讲Server.num抽离出去单独做成一个类NUM,每次Handler创建后,...
  • =-1){ //这个方法是先规定一个数组长度,将这个流中的字节缓冲到数组byteBuffer中,返回的是这个数组中的字节个数,这个缓冲区没有满的话,则返回真实的字节个数,到未尾都返回-1 outsocket.write(byteBuffer,0,...
  • 比如操作一个变量:number初始是0,线程A对number进行+1,线程B对number进行-1,现在没有问题。但是,再有线程C对number进行+1和线程D对number进行-1,就会出现不只是0和1的结果了。 明明加了锁,为什么还会产生...
  • 有时候,我们调用第三方或者心跳检查需要进行失败的重试机制,现在我就举例: private static final int retryLimit = 5; while (true) try { //调用其他的接口 break; } catch (Exception e) {//根据...
  • 单周期CPU设计(二)

    2020-05-25 19:07:26
    1.用integer整型变量做while循环,要注意对变量的赋初值的位置:以下是标准格式: 2.在实例化每个模块,注意对应位置上的变量应是一一对应的。比如二路选择器中的0、1端口的对应位置输入易出错。 3.在CPU设计...
  • 自定义view运动

    2017-11-08 18:45:42
    前面已经自定义好了view现在让这个定义的控件动起来,所以在这个继承了View的类中重新写了个方法,同时利用线程进行操作,在里面有一个while循环();小于400会一直动,同时不断向主线程发handler进行修改这个,...
  • 自我回顾

    2018-08-05 18:53:16
    对自己这一个月进行个小结把! 从开始到现在总共学习了25天左右把,一个月过去了,自己学习到了那些东西呢?主要谈谈疑问和问题有! 从开始的Java基础开始说起把。 基本的数据类型 流程控制:if...else,for,...
  • - -如果执行现在的处理会出现问题,那么就让执行处理的线程进行等待 1、守护条件(前置条件)是什么? 在执行目标处理前必须满足的条件称之为守护(前置)条件 2、该模式登场的角色 GuardedObject:被守护的...
  • stm32f1xx i2c通讯故障可能原因

    千次阅读 2017-06-26 10:42:13
    我在做i2c通讯,总出现一些故障,现在对故障进行总结: 1.程序停在while (I2C_GetFlagStatus(PLATFORM_I2C_USE, I2C_FLAG_BUSY)) ,是i2c总线忙碌。当我们 要是用i2c总线,i2c的时钟线和数据线都应该为高电平...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 174
精华内容 69
关键字:

while现在进行时