首先要理解基本的原理,2台电脑间实现TCP通讯,首先要建立起连接,在这里要提到服务器端与客户端,两个的区别通俗讲就是主动与被动的关系,两个人对话,肯定是先有人先发起会话,要不然谁都不讲,谈什么话题,呵呵!一样,TCPIP下建立连接首先要有一个服务器,它是被动的,它只能等待别人跟它建立连接,自己不会去主动连接,那客户端如何去连接它呢,这里提到2个东西,IP地址和端口号,通俗来讲就是你去拜访某人,知道了他的地址是一号大街2号楼,这个是IP地址,那么1号楼这么多门牌号怎么区分,嗯!门牌号就是端口(这里提到一点,我们访问网页的时候也是IP地址和端口号,IE默认的端口号是80),一个服务器可以接受多个客户端的连接,但是一个客户端只能连接一台服务器,在连接后,服务器自动划分内存区域以分配各个客户端的通讯,那么,那么多的客户端服务器如何区分,你可能会说,根据IP么,不是很完整,很简单的例子,你一台计算机开3个QQ,服务器怎么区分?所以准确的说是IP和端口号,但是客户端的端口号不是由你自己定的,是由计算机自动分配的,要不然就出现端口冲突了,说的这么多,看下面的这张图就简单明了了。
在上面这张图中,你可以理解为程序A和程序B是2个SOCKET程序,服务器端程序A设置端口为81,已接遭到3个客户端的连接,计算机C开了2个程序,分别连接到E和D,而他的端口是计算机自动分配的,连接到E的端口为789,连接到D的为790。
了解了TCPIP通讯的基本结构后,接下来讲解建立的流程,首先声明一下我用的开发环境是VisualStudio2008版的,语言C#,组件System.Net.Sockets,流程的建立包括服务器端的建立和客户端的建立,如图所示:二、实现:1.客户端:第一步,要创建一个客户端对象TcpClient(命名空间在System.Net.Sockets),接着,调用对象下的方法BeginConnect进行尝试连接,入口参数有4个,address(目标IP地址),port(目标端口号),requestCallback(连接成功后的返调函数),state(传递参数,是一个对象,随便什么都行,我建议是将TcpClient自己传递过去),调用完毕这个函数,系统将进行尝试连接服务器。
第二步,在第一步讲过一个入口参数requestCallback(连接成功后的返调函数),比如我们定义一个函数voidConnected(IAsyncResultresult),在连接服务器成功后,系统会调用此函数,在函数里,我们要获取到系统分配的数据流传输对象(NetworkStream),这个对象是用来处理客户端与服务器端数据传输的,此对象由TcpClient获得,在第一步讲过入口参数state,如果我们传递了TcpClient进去,那么,在函数里我们可以根据入口参数state获得,将其进行强制转换TcpClienttcpclt=(TcpClient)result.AsyncState,接着获取数据流传输对象NetworkStreamns=tcpclt.GetStream(),此对象我建议弄成全局变量,以便于其他函数调用,接着我们将挂起数据接收等待,调用ns下的方法BeginRead,入口参数有5个,buff(数据缓冲),offset(缓冲起始序号),size(缓冲长度),callback(接收到数据后的返调函数),state(传递参数,一样,随便什么都可以,建议将buff传递过去),调用完毕函数后,就可以进行数据接收等待了,在这里因为已经创建了NetworkStream对象,所以也可以进行向服务器发送数据的操作了,调用ns下的方法Write就可以向服务器发送数据了,入口参数3个,buff(数据缓冲),offset(缓冲起始序号),size(缓冲长度)。
第三步,在第二步讲过调用了BeginRead函数时的一个入口参数callback(接收到数据后的返调函数),比如我们定义了一个函数voidDataRec(IAsyncResultresult),在服务器向客户端发送数据后,系统会调用此函数,在函数里我们要获得数据流(byte数组),在上一步讲解BeginRead函数的时候还有一个入口参数state,如果我们传递了buff进去,那么,在这里我们要强制转换成byte[]类型byte[]data=(byte[])result.AsyncState,转换完毕后,我们还要获取缓冲区的大小intlength=ns.EndRead(result),ns为上一步创建的NetworkStream全局对象,接着我们就可以对数据进行处理了,如果获取的length为0表示客户端已经断开连接。
具体实现代码,在这里我建立了一个名称为Test的类:2.服务
2023/2/17 5:19:13 297KB TCP/IP C++ 协议
1
Kettle完整的开发手册,多个控件说明,有流程实例,在国内缺少kettle学习材料值得一看
2023/2/16 8:27:20 7.91MB etl BI kettle ettl
1
c#版《植物大战僵尸》源码,与另一个c#植物大战僵尸示例源码不同完成了植物大战僵尸的战斗功能包括3种植物,两种僵尸,一关卡,整个战斗流程可以在此基础上增加关卡和植物和僵尸品种
2023/2/15 18:26:08 9.88MB C#
1
火力发电主流程,火电行业工艺过程,火电厂公用辅助控制系统火电工艺引见-锅炉,汽轮机的调速系统和保护装置
2023/2/14 1:24:27 6.79MB 火电厂
1
在使用本系统时,请按照以下流程进行操作:(1)在“系统维护”菜单中的“数据清理”模块中清空原始数据。
(2)在“系统维护”菜单中的“系统管理设置”模块设置本单位的操作员。
(3)在“系统维护”菜单中的“本单位信息”模块中设置本单位信息。
(4)在“基础数据”菜单中设置基本信息。
(5)在“库存管理”菜单中的“库存情况”模块中设置商品的库存上下限。
(6)在“进货管理”菜单中的“进货单”模块中添加商品的进货信息。
(7)在“进货管理”菜单中的“进货退货单”模块中可以添加进货退货信息。
(8)在“进货管理”菜单中的“进货分析”模块和“进货统计(含退货)”模块中可以查看到所有的进货信息和进货退货信息。
(9)在“销售管理”菜单中的“销售单”模块中添加销售信息。
(10)在“销售管理”菜单中的“销售退货单”模块中添加销售退货信息。
(11)在“销售管理”菜单中的“销售统计(不含退货)”模块和“月销售情况”模块中查看销售记录和销售退货记录。
(12)在“销售管理”菜单中的“商品销售排行”模块中可以查看某一时间段的销售排行榜。
(13)在“销售管理”菜单中的“销售成本表”模块中可以查看商品的成本及毛利。
(14)在“销售管理”菜单或“进货管理”菜单中的“往来对账”模块中查看与某单位间的账目情况。
(15)在“库存管理”菜单中的“库存上限报警”、“库存下限报警”模块中查看商品的库存数量。
(16)在“库存管理”菜单中的“库存盘点”模块中设置盘点数量。
(17)在“系统维护”菜单中可以对系统数据进行清理及备份。
(18)“辅助工具”和“系统信息”菜单中提供了一些辅助功能
2023/2/14 1:40:24 2.62MB c# 进销存源码
1
TP5框架后台的小程序支付完整流程demo,代码粘贴即可使用,支付回调流程皆有正文
2023/2/13 20:07:06 4KB PHP
1
光度立体视觉的代码,是运用MATLAB2016b软件编程的,流程是:读取图像----光源标定-----计算法向量和反射率----计算Depth
2023/2/13 17:11:21 1.28MB 光度立体视觉
1
摘要 IABSTRACT II目录 IV1前言 11.1课题背景 11.1.1办公自动化概述 11.1.2中小企业办公模式的现状 21.2研究意义 31.3设计技术及开发环境 51.3.1设计技术 51.3.2开发环境 72可行性分析 92.1组织和管理可行性 92.2经济可行性 92.3技术可行性 93需求分析 113.1现行业务分析 113.1.1业务流程 113.1.2功能分析 113.2系统建模 133.2.1用户身份验证用例图 133.2.2个人通讯录用例图 133.2.3职工信息管理用例图 143.2.4日程安排用例图 143.2.5日志管理用例图 153.2.6短消息管理用例图 153.2.7公告管理用例图 163.2.8文件管理用例图 163.2.9会议管理用例图 174系统设计 184.1系统设计 184.1.1用户身份验证模块流程图 194.1.2个人通讯录模块流程图 194.1.3职工信息管理模块流程图 214.1.4日程安排模块流程图 224.1.5工作日志模块流程图 234.1.6短消息管理模块流程图 244.1.7文件管理模块流程图 254.1.8公告管理模块流程图 264.1.9会议管理模块流程图 274.2数据库设计 294.2.1数据库概念设计 294.2.2数据库逻辑设计 315系统实现 355.1系统架构 355.1.1系统架构图 355.1.2程序结构图 365.2持久层Hibernate实现 375.2.1创建并配置Hibernate映射文件 375.2.2开发并配置HibernateDAO层 385.3控制层Struts实现 385.3.1开发Struts核心流程代码 385.3.2开发JSP页面原型 405.3.3增加表单校验功能 405.3.4调用DAO组件操作数据库 415.4业务层Spring实现 415.4.1数据源配置 425.4.2配置SessionFactory 435.4.3配置事务 435.4.4配置DAO组件 435.4.5配置DAO事务 436系统测试 446.1测试计划 446.2测试用例 446.2.1对身份验证功能进行测试 446.2.2对职工信息管理功能进行测试 456.3测试结果 467系统开发总结 478结束语 48参考文献 49致谢 50附录 51A次要源程序 51B用户手册 55B.1系统功能简介 55B.2系统的支持平台 56B.3安装说明 56B.4使用说明 59B.5系统维护方法 72C软件光盘 73C.1光盘的树形目录 73C.2光盘文件一览表 73D科技译文 74JavaLearningPathprocess 74JAVA学习过程 81
2023/2/13 15:13:47 1.11MB OA系统 毕业 设计 论文
1
贴标机Github上的标签管理(创建/重命名/更新/删除)作为代码。
使用GitHub?能否要提交/复制/共享标签配置?使用labeler!对于FOSS维护者,使您的用户能够提交PR并改善流程/标签系统!标签。
将标签移出。
强制使用一种标签颜色方案,该方案应不会。
受启发,这些项目是诸如类的工具以及此类项目中的组织标签系统:安装从最新获取OSX/Linux/Windows的二进制文件。
或使用goget:goget-ugithub.com/tonglil/labeler用法首先,在环境中设置(可选,该令牌也可以设置为cli参数)。
exportGITHUB_TOKEN=xxx公共存储库的令牌需要public_repo范围。
专用存储库的令牌需要存储repo范围。
扫描标签要从存储库中扫描现有标签并将其保存到文件中:labelerscanlabels.yaml--repoowner/name当针对在GitHub上创建的“新”存储库运行时,它将:提取颜色为fc2929bug使用颜色ccc
2023/2/13 8:28:12 2.24MB github go cli golang
1
主要引见了程序流程控制方面的内容,了解如何控制程序的流程,使得程序员具有很好的判断能力。
2023/2/13 7:41:58 295KB python
1
在日常工作中,钉钉打卡成了我生活中不可或缺的一部分。然而,有时候这个看似简单的任务却给我带来了不少烦恼。 每天早晚,我总是得牢记打开钉钉应用,点击"工作台",再找到"考勤打卡"进行签到。有时候因为工作忙碌,会忘记打卡,导致考勤异常,影响当月的工作评价。而且,由于我使用的是苹果手机,有时候系统更新后,钉钉的某些功能会出现异常,使得打卡变得更加麻烦。 另外,我的家人使用的是安卓手机,他们也经常抱怨钉钉打卡的繁琐。尤其是对于那些不太熟悉手机操作的长辈来说,每次打卡都是一次挑战。他们总是担心自己会操作失误,导致打卡失败。 为了解决这些烦恼,我开始思考是否可以通过编写一个全自动化脚本来实现钉钉打卡。经过一段时间的摸索和学习,我终于成功编写出了一个适用于苹果和安卓系统的钉钉打卡脚本。
2024-04-09 15:03 15KB 钉钉 钉钉打卡