TCP异步通信初学者指导示例项目

版权申诉
0 下载量 57 浏览量 更新于2024-11-05 收藏 34KB ZIP 举报
资源摘要信息:"API_TP.zip_TP" ### 知识点概述 #### 网络编程入门 - **网络编程基础**:网络编程是计算机网络领域的一项重要技能,涉及使用网络协议(如TCP/IP)在不同计算机之间进行数据传输和通信的实现。 - **TCP模型**:传输控制协议(TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP协议确保了数据传输的顺序性、可靠性及流量控制,是网络编程中常用的传输层协议。 #### 异步选择概念 - **异步通信**:异步通信是指在不阻塞当前线程的情况下,完成通信任务。与同步通信相比,异步通信允许多个任务并行进行,提高了程序的效率和性能。 - **选择模式**:在异步通信中,选择模式允许程序等待多个异步操作完成,并在操作完成时获得通知。这种模式在处理网络通信时特别有用,因为它可以处理多个客户端请求而不需要阻塞主线程。 #### TCP模型中的异步选择实现 - **异步Socket编程**:异步Socket编程是指创建可以非阻塞地执行读取和写入操作的Socket。在TCP模型中,通过异步Socket编程可以实现高效的数据通信。 - **异步编程模型**:常见的异步编程模型有事件驱动模型和回调函数模型。在事件驱动模型中,程序会在特定事件发生时执行相应的处理代码。而在回调函数模型中,当异步操作完成时,会调用一个预先定义的函数进行处理。 #### 初学者的实践 - **TCP通信实现**:初学者在学习网络编程时,首先需要了解TCP的三次握手和四次挥手过程,这是建立和断开TCP连接的基础。 - **代码的完善与维护**:在初步实现网络通信功能时,代码往往会有很多不足之处,例如校验较少、异常处理不完善等。随着经验的积累,代码应该被不断地完善和优化。 #### 实际应用示例 - **服务端(Server)**:服务端通常运行在固定的位置,等待客户端的连接请求。服务端需要处理接收到的连接请求,并对客户端发来的数据进行处理和回应。 - **客户端(Client)**:客户端主动发起连接请求到服务端,并向服务端发送请求数据。客户端接收服务端的数据并作出相应的处理。 - **项目文件结构**:API_TP.zip_TP压缩包中包含的文件有API_TP.dsw、API_TP.ncb、API_TP.opt,这些文件通常与Visual Studio开发环境相关,用于存储工作空间设置、项目配置和解决方案信息。 - **代码完善**:初学者在实现基本的网络通信功能后,应当继续学习如何增加异常处理、提高代码的健壮性,并逐步完善网络通信的协议细节。 ### 总结 网络编程是计算机软件开发中的一个重要领域,涉及到计算机网络和操作系统知识。TCP模型作为网络编程的基础,为开发人员提供了可靠的数据传输方式。异步选择模式可以显著提高网络应用的性能和响应速度。对于初学者而言,通过实现简单的TCP通信程序,可以逐步理解网络编程的基本概念,并在实践中不断学习和进步。随着技术的深入学习,代码的健壮性和功能完整性将逐步提升。

修改这个函数,要实现防止连续点按 while (1) { tp_dev.scan(0); if (tp_dev.sta & TP_PRES_DOWN) { //触摸屏被按下 if (tp_dev.x[0] > 0 && tp_dev.x[0] < 130 && tp_dev.y[0] > 380 && tp_dev.y[0] < 480) { while(tp_dev.x[0] > 0 && tp_dev.x[0] < 130 && tp_dev.y[0] > 380 && tp_dev.y[0] < 480){ tp_dev.scan(0); } if (i < 5) { password[i++] = '1'; } } else if (tp_dev.x[0] > 130 && tp_dev.x[0] < 260 && tp_dev.y[0] > 380 && tp_dev.y[0] < 480) { while(tp_dev.x[0] > 130 && tp_dev.x[0] < 260 && tp_dev.y[0] > 380 && tp_dev.y[0] < 480){ tp_dev.scan(0); } if (i < 5) { password[i++] = '2'; } } else if (tp_dev.x[0] > 260 && tp_dev.x[0] < 390 && tp_dev.y[0] > 380 && tp_dev.y[0] < 480) { while(tp_dev.x[0] > 260 && tp_dev.x[0] < 390 && tp_dev.y[0] > 380 && tp_dev.y[0] < 480){ tp_dev.scan(0); } if (i < 5) { password[i++] ='3'; } } else if (tp_dev.x[0] > 390 && tp_dev.x[0] < 520 && tp_dev.y[0] > 380 && tp_dev.y[0] < 480) { while(tp_dev.x[0] > 390 && tp_dev.x[0] < 520 && tp_dev.y[0] > 380 && tp_dev.y[0] < 480){ tp_dev.scan(0); } if (i < 5) { password[i++] = '4'; } } else if (tp_dev.x[0] > 520 && tp_dev.x[0] < 650 && tp_dev.y[0] > 380 && tp_dev.y[0] < 480) { while(tp_dev.x[0] > 520 && tp_dev.x[0] < 650 && tp_dev.y[0] > 380 && tp_dev.y[0] < 480){ tp_dev.scan(0); } if (i > 0) { password[--i] = '\0'; } } else if (tp_dev.x[0] > 650 && tp_dev.x[0] < 800 && tp_dev.y[0] > 380 && tp_dev.y[0] < 480) { while(tp_dev.x[0] > 650 && tp_dev.x[0] < 800 && tp_dev.y[0] > 380 && tp_dev.y[0] < 480){ tp_dev.scan(0); } if (i == 4) { break; //退出密码输入循环 } else { Show_Hz16(300,250,"提示信息:用户名或密码错误",RED,WHITE); } } //显示部分 LCD_ShowString(400,150,400,24,24,password); } }

2023-05-22 上传

为什么下面的sql语句会输出重复的结果:SELECT tp.parent_production_orders AS parent_production_orders, tp.production_orders AS production_orders, tp.work_order AS work_order, tp.contract AS contract, tp.sbbh AS sbbh, tp.batch_num AS batch_num, tp.product_code AS product_code, tp.product_number AS product_number, tp.product_name AS product_name, to_char( middle.create_date, 'yyyy-mm-dd' ) AS issued_date, to_char( to_timestamp( tp.delivery_time / 1000 ), 'yyyy-mm-dd' ) AS delivery_time, middle.line_code AS work_area_code, middle.line_name AS work_area_name, tp.workorder_number AS workorder_number, tp.complete_number AS complete_number, tp.part_unit AS part_unit, middle.work_time_type AS work_time_type, middle.process_time AS process_time, CASE WHEN sc.totalSubmitHours IS NULL THEN 0 ELSE sc.totalSubmitHours END AS submit_work_hours, CASE WHEN middle.process_time > 0 AND sc.totalSubmitHours IS NOT NULL THEN round( ( sc.totalSubmitHours / middle.process_time ), 2 ) * 100 ELSE 0 END plan_achievement_rate, CASE WHEN sc.totalSubmitHours IS NULL THEN 0 ELSE round( CAST ( sc.totalSubmitHours AS NUMERIC ) / CAST ( 60 AS NUMERIC ), 1 ) END AS submit_work_hours_h, round( CAST ( middle.process_time AS NUMERIC ) / CAST ( 60 AS NUMERIC ), 1 ) AS process_time_h, pinfo.material_channel AS material_channel FROM hm_model_work_order_report_middle middle LEFT JOIN hm_model_trc_plan tp ON middle.work_order = tp.work_order LEFT JOIN ( SELECT oro.work_order AS orderNo, oro.work_area_code AS lineCode, SUM ( submit_work_hours ) AS totalSubmitHours, '自制' AS workHourType FROM hm_model_trc_order_report_operation_u orou LEFT JOIN hm_model_trc_order_report_operation oro ON orou.work_order_process_id = oro.ID WHERE orou.work_order_process_id IS NOT NULL AND oro.work_area_code IS NOT NULL GROUP BY oro.work_order, oro.work_area_code UNION all SELECT ohs.work_order_no AS orderNo, ohs.line_code AS lineCode, SUM ( receiving_hour ) AS totalSubmitHours, '外委' AS workHourType FROM hm_model_outsourcing_hour_statistics ohs GROUP BY ohs.work_order_no, ohs.line_code ) sc ON middle.work_order = sc.orderNo AND middle.line_code = sc.lineCode AND middle.work_time_type = sc.workHourType LEFT JOIN hm_model_part_info AS pinfo ON tp.product_number = pinfo.part_code WHERE middle.process_time > 0 AND tp.delivery_time IS NOT NULL AND tp.production_orders LIKE'FJ2023051100286' ORDER BY to_char( to_timestamp( tp.delivery_time / 1000 ), 'yyyy-mm-dd' ) DESC, tp.parent_production_orders DESC, tp.node_level ASC

2023-06-06 上传