TCP只是一个可靠传输的通信管道,上层协议要你自己定的,通俗来说就是发送方和接收方的约定

自定义协议的核心有两个:
1. 控制码
2. 流程控制

用Socket进行通信,发送的数据包一定是有结构的,类似于:数据头+数据长度+数据内容+校验码+数据尾。
这个你定义一个Struct包装起来即可。

控制码是协议的基础信息,主要用来解释数据包的基本信息,通信触发的动作等,以便告知收到数据包之后应该如何处理数据包。
例如,你传输文件的时候,一般会经过“传输开始 - 传输中 - 传输结束”三个阶段,那么Sender针对不同的阶段就要定义不同的命令控制码,以便让Receiver知道传输处于什么过程,这样Receiver收到数据包之后便可以知道下一步该做什么。
具体实现上类似于:
switch(iCmdType)
{
case CMD_BEGIN_TRANSFER:
    Begin();
    break;
case CMD_TRANSFERRING:
    Transfer();
    break;
case CMD_FINISH_TRANSFER:
    Finish();
    break;
......
}

而流程控制是协议的核心所在。以TCP/IP为例,Client和Server如何知道双方已经正确建立了连接?答案就是“三次握手”。三次握手就是流程控制。这个就需要对应用程序的通信流程把握的非常熟悉。

以你的问题为例,“把数据从工控机(wince)系统 发送到服务器中(xp)中”,XP如何判断已经完整而且无误地收到了一个来自于wince的数据包?答案就是靠自定义的协议控制码(数据长度)。收到的数据如果是正确的,回应什么给wince?是错误的,又该回什么给wince?这就要靠协议所定义的流程控制。

socket只管将数据从一个地方传递到另外一个地方,至于数据是什么,做什么用途的,socket不需要知道。这样的话,你就需要在应用层自己定一些协议,用来解析你自己的数据。
例如可以定一个协议头
typedef struct Header
{
   BYTE protocal;   // 协议号
   。。。
   。。。
}DataHeader, *LPDataHeader;
这样只要你的数据传到了应用层,直接取出这个结构体,确定里面的协议号,就可以知道你的是什么数据了。
以便处理数据!

协议的本质是定义各个实体对象之间的交互规则。

这个你拿到现实之中也是一样的,开个玩笑,像什么《中苏XXX同盟友好互助协议》之类的(你认为和Socket有关系吗?哈哈~~~)

我觉得你是卡在怎么实现一个协议上了,事实上你只要能编写传统的 C/S 通信程序,那么定义一个应用层协议真的不是很难的事,只不过差别在于协议定义的水平(经验丰富的人定义的协议移植性、可靠性、可扩充性等会好很多,而经验不是很丰富的人定义出来可能只能在某些机器上Work,在另外一些机器上就Bug了...不过这还好,因为水平是可以积累提高的)

给你个链接:http://download.csdn.net/source/2174418

这是我实现的一个精简的不能再精简的ftp协议(内网传输,一对一),我甚至连什么封包拆包的操作都简化到最低了。你看了就知道定义一个协议并不是你想的那么难。当然了,我这个协议定义的很烂,哈哈,因为我写这个程序的目的就是替代QQ在内网传大文件的功能(QQ在内网传几个G的文件经常是开始10M/S,很快,但逐渐逐渐的就慢下来,最后干脆卡在那不动,这让我们这些经常分享不良资源的童鞋情何以堪啊~~)。够用就好,所以没有加太多无谓的功能。

我觉得你应该把注意力转移到如何让程序Work起来,你一边做一边想 C 和 S 之间如何才能正确、可靠、高效地通信,这样等你把程序写完了,你也基本就知道协议应该怎么定义了。(虽然这样按软件工程来看有点本末倒置呵,不过实际就是这样,设计往往是和实现迭代进行的)

Socket上自定义协议总结的更多相关文章

  1. 移动开发首页业界资讯移动应用平台技术专题 输入您要搜索的内容 基于Java Socket的自定义协议,实现Android与服务器的长连接(二)

    在阅读本文前需要对socket以及自定义协议有一个基本的了解,可以先查看上一篇文章<基于Java Socket的自定义协议,实现Android与服务器的长连接(一)>学习相关的基础知识点. ...

  2. socket上http协议应用(使用socket进行http通信的例子,准备好报头以后,简单read/write就可以了)

    前几天看socket本有点晕, 好不容易弄明白了,才发现公司服务器用的是http的. 找了好久也没发现linux下直接用http的api, 不过今日偶然发现了使用socket进行http通信的例子, ...

  3. 网络编程之Socket的TCP协议实现客户端与客户端之间的通信

    我认为当你学完某个知识点后,最好是做一个实实在在的小案例.这样才能更好对知识的运用与掌握 如果你看了我前两篇关于socket通信原理的入门文章.我相信对于做出我这个小案列是完全没有问题的!! 既然是小 ...

  4. Socket层上的协议

    Socket层上的协议指的数据传输的格式 HTTP协议 传输格式:假设:这是假设,实际http的格式不是这样的. http1.1,content-type:multipart/form-data,co ...

  5. sanic官方文档解析之Custom Protocols(自定义协议)和Socket(网络套接字)

    1,Custom Protocol:自定义协议 温馨提示:自定义协议是一个高级用法,大多数的读者不需要用到此功能 通过特殊的自定义协议,你可以改变sanic的协议,自定义协议需要继承子类asyncio ...

  6. 利用Netty构建自定义协议的通信

    在复杂的网络世界中,各种应用之间通信需要依赖各种各样的协议,比如:HTTP,Telnet,FTP,SMTP等等. 在开发过程中,有时候我们需要构建一些适应自己业务的应用层协议,Netty作为一个非常优 ...

  7. Protobuf3 + Netty4: 在socket上传输多种类型的protobuf数据

    Protobuf序列化的字节流数据是不能自描述的,当我们通过socket把数据发送到Client时,Client必须知道发送的是什么类型的数据,才能正确的反序列化它.这严重影响限制了C/S功能的实现, ...

  8. Mina自定义协议简单实现

    因公司需要做个电子秤自动称重系统,需要自定义协议实现,所以就用Mina简单实现了一下,有时间改成Netty版 服务端 package net.heartma.server;import java.io ...

  9. Netty自定义协议解析原理与应用

    目前,大家都选择Netty做为游戏服务器框架网络通信的框架,而且目前也有很多优秀的产品是基于Netty开发的.它的稳定性,易用性和高效率性已得到广泛的认同.在游戏服务器开发中,选择netty一般就意味 ...

随机推荐

  1. 25、Nginx常见典型故障

    1.为什么nginx里面有的是浏览器渲染出的页面,有的时候就变成下载文件? 这个一个取决于服务端nginx,一个取决于你浏览器.在Nginx服务端的配置文件目录下,有一个mime.types 文件,内 ...

  2. 20199319《Linux内核原理与分析》第十二周作业

    SET-UID程序漏洞实验 一.实验简介 Set-UID是Unix系统中的一个重要的安全机制.当一个Set-UID程序运行的时候,它被假设为具有拥有者的权限.例如,如果程序的拥有者是root,那么任何 ...

  3. 最完美ThinkPHP Nginx 配置文件

    一个配置文件,完美支持普通,兼容,pathinfo,rewrite4种url模式,别怪我没提醒你收藏哦. 常见的静态文件404时也不会再去跑一遍fastcgi浪费资源. server { listen ...

  4. Foo, Bar的含义

    有些朋友问:foo, bar是什么意思, 为什么C++书籍中老见到这个词.我google了一下, 发现没有很好的中文答案.这个问题,在维基百科上有很好的回答.在这里翻译给大家. 译文: 术语fooba ...

  5. Centos安装nmap端口查看工具

    CentOS安装nmap端口查看工具 一.安装nmap yum install nmap    #输入y安装 二.使用nmap      nmap localhost    #查看主机当前开放的端口  ...

  6. 忘记mysql或mariadb数据库密码的解决方案

    主机环境 主机系统:

  7. python之ORM

    pymysql python操作数据库的基本步骤: 导入相应的python模块: 使用connect函数连接数据库,并返回一个connection对象: 通过connection对象的cursor方法 ...

  8. 21. ClustrixDB 识别平台限制

    本节描述集群性能上潜在的限制平台因素,如何度量集群是否接近或超过这些限制,以及纠正这些条件的可用选项.“平台因素”指的是硬件资源,如CPU.内存.磁盘和网络I/O子系统.有关潜在的软件相关因素,请参见 ...

  9. jquery password选择器 语法

    jquery password选择器 语法 作用::password 选择器选取类型为 password 的 <input> 元素.大理石平台精度等级 语法:$(":passwo ...

  10. CF 25 E 三个字符串 KMP模板

    Test Time Limit: 2000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit Status ...