设计一个自己的网络协议,设计一个自己的网络协议怎么弄

http://www.itjxue.com  2023-01-06 03:27  来源:未知  点击次数: 

关于java编程。设计一个基于TCP/IP协议的网络程序,实现如下功能:

写好了,有什么问题请追问。

客户端:

import java.net.*;

import java.io.*;

public class TestSocketClient {

public static void main(String[] args) {

try {

Socket socket = new Socket("127.0.0.1", 5566);

System.out.println("请输入计算式:");

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String s1 = br.readLine();

DataOutputStream dos = new DataOutputStream(socket.getOutputStream());

DataInputStream dis = new DataInputStream(socket.getInputStream());

dos.writeUTF(s1);

dos.flush();

double s = dis.readDouble();

System.out.println("计算结果:" + s);

dis.close();

dos.close();

socket.close();

} catch (IOException e) {

e.printStackTrace();

System.out.println("连接出错");

System.exit(-1);

}

}

}

服务器端:

import java.net.*;

import java.io.*;

public class TestSocketServer {

public static void main(String[] args) {

try {

ServerSocket ss = new ServerSocket(5566);

Socket socket = ss.accept();

DataOutputStream dos = new DataOutputStream(socket.getOutputStream());

DataInputStream dis = new DataInputStream(socket.getInputStream());

String s = null;

if ((s = dis.readUTF()) != null) {

System.out.println("接收到的算式:" + s);

double result = 0;

String[] sarr1 = s.split("[\\+\\-\\*\\/]");

double a = Double.parseDouble(sarr1[0].trim());

double b = Double.parseDouble(sarr1[1].trim());

String[] sarr2 = s.split("^(-?\\d+)(\\.\\d+)?");

char c = sarr2[1].trim().charAt(0);

switch (c) {

case '+':

result = a + b;

break;

case '-':

result = a - b;

break;

case '*':

result = a * b;

break;

case '/':

result = a / b;

break;

default:

break;

}

dos.writeDouble(result);

dos.flush();

}

dis.close();

dos.close();

socket.close();

} catch (IOException e) {

e.printStackTrace();

System.exit(-1);

}

}

}

基于 Kotlin + Netty 实现一个简单的 TCP 自定义协议

我们的项目需要开发一款智能硬件。它由 Web 后台发送指令到一款桌面端应用程序,再由桌面程序来控制不同的硬件设备实现业务上的操作。从 Web 后台到桌面端是通过一个 WebSocket 长链接来进行维护,而桌面程序到各个硬件设备也是一个 TCP 长链接来维护的。

本文讲述的,其实是从桌面程序到各个硬件之间的通讯。

首先,需要设计一个通用的 TCP 网络协议。

网络协议结构如下

根据上述所设计的网络协议,定义一个抽象类 Packet:

有多少个指令就需要定义多少个 Packet,下面以心跳的 Packet 为例,定义一个 HeartBeatPacket:

HeartBeatPacket 是由 TCP 客户端发起,由 TCP 服务端接收并返回给客户端。

每个 Packet 类都包含了该 Packet 所使用的序列化方式。

每个 Packet 也包含了其对应的 command。下面是 Commands 是指令集,支持256个指令。

由于使用自定义的协议,必须要有对报文的 encode、decode,PacketManager 负责这些事情。

encode 时按照协议的结构进行组装报文,同理 decode 是其逆向的过程。

启动 TCP 服务的方法

其中,ServerIdleHandler: 表示 5 分钟内没有收到心跳,则断开连接。

MagicNumValidator:用于 TCP 报文的魔数校验。

PacketCodecHandler: 解析报文的 Handler。

PacketCodecHandler 继承自 ByteToMessageCodec ,它是用来处理 byte-to-message 和message-to-byte,便于解码字节消息成 POJO 或编码 POJO 消息成字节。

HeartBeatHandler:心跳的 Handler,接收 TCP 客户端发来的"ping",然后给客户端返回"pong"。

ResponseHandler:通用的处理接收 TCP 客户端发来指令的 Handler,可以根据对应的指令去查询对应的 Handler 并处理其命令。

模拟一个客户端的实现

其中,PacketCodecHandler 跟服务端使用的解析报文的 Handler 是一样的。

ClientIdleHandler:客户端实现心跳,每隔 30 秒发送一次心跳。

ClientLogin:登录服务端的 Handler。

这次,我开发的桌面端程序其实逻辑并不复杂,只需接收 Web 后台的指令,然后跟各个设备进行交互。

接收到 Web 端的指令后,通过 Guava 的 EventBus 将指令通过 TCP 发送给各个设备,发送时需要转化成对应的 Packet。因此,核心的模块就是这个 TCP 自定义的协议。

制定一个新的网络协议,首先应该考虑(语法、语义、同步)中的哪个?

语义

计算机网络协议由三要素组成:语法、语义和时序。

语法:通信数据和控制信息的结构与格式。

语义:对具体事件应发出何种控制信息,完成何种动作,以及做出何种应答。

时序:对事件实现顺序的详细说明。

如何在ns2中实现一个简单的网络协议

如果我们要往NS2中添加自己的模块,那么我们至少要实现两个类:

一, 首先要有一个类继承自TclObject类或者其子类,例如这个Mac802_16类的继承关系为:TclObject/NsObject/Mac /Mac802_16.这个类里面实现了C++类里面的变量与Otcl类的变量的绑定关系,以及我们的模块要实现的一系列算法等等,这个类负责的就是协议 的实现。

这个类,一般需要有构造函数中执行变量的绑定,使用bind()函数,将Otcl变量与C++的成员变量绑定起来。

声 明为protected的command()函数:为Otcl类提供方法,对Otcl中的类的方法进行翻译并执行;对于没有考虑到的或者不能解析的命令, 调用该C++类的父类的command方法。当在Otcl类中调用某个方法时,首先去tcl类中查找并执行该方法;若查找失败,则在该Otcl类对应的 C++类的command方法中查找,若查找仍然失败,则沿着该类的父类一直往上找,尝试调用它们的command方法;若所有父类的command方法 都不能解析,则报告该命令无法执行。

其他的成员变量和成员函数,这是用于实现自己的算法模块的内容。

二,其次我们要定义一个声明为static的类,继承自TclClass类,这个类实现了C++环境里面的类与Otcl环境里面的类的关联,简单点来说,这个类负责与Otcl环境进行关联。取最开头的那段代码;

static class Mac802_16Class : public TclClass

{

public:

Mac802_16Class() : TclClass("Mac/802_16") {}

TclObject* create(int, const char*const*)

{

return (new Mac802_16());

}

} class_mac802_16;

这 一段代码里面,包含了一个将Otcl的类名作为参数传给其父类的构造函数;一个create方法:创建一个C++类的对象实例并返回;该方法的返回类定义 为TclObject*。C++类的类型包含在create方法中,Otcl类的类型包含在TclClass类的构造函数中,因此可以实现C++类和 Otcl类的连接。

接下来,如果我们要实现的类完成以后,将头文件和源文件放置于~ns目录下自己新建的一个子目录,然 后打开~ns/Makefile文件,将“类名.o”添加到该Makefile的OBJ_CC宏定义中,对ns进行编译的时候就能够能够找到该模块的源文 件并将其编译到ns中;如果类中定义了一些变量,打开~ns/tcl/lib/ns-default.tcl文件,为该类对应的Otcl类设置一些初始 值。最后,对Makefile执行指令:make clean,make,对整个ns重新编译,我们的模块就可以添加到ns2中了。

怎样自己写一个网络协议

你是要创造一个协议还是要使用一个协议?

设计协议的话最好对现在流行的网络协议先了解一下,会有很大帮助。

自己设计的最好是基于比较流行的协议之上比如TCP/UDP,通用性比较好

一个网络协议的设计是否需要考虑硬件的工作效率

一个网络协议的设计需要考虑硬件的工作效率。根据相关信息查询显示,一个网络协议的设计需要考虑硬件的工作效率,计算机网络的设计除了硬件,必须考虑软件,网络软件都是高度结构化的。为了降低网络设计的复杂性,网络都通过划分层次。

(责任编辑:IT教学网)

更多

推荐Flash教程文章