一直不知道socket通信时候自定义数据包是什么样子的,偶然做了个小例子。
先来说说数据包的定义,我这里是包头+内容 组成的:其中包头内容分为包类型+包长度, 那就是 消息对象=包类型+包长度+消息体
包类型 byte 型
包长度 int 型
消息体 byte[]
包总长度为 1 + 4 + 消息体.getBytes().length
发包方法如下:
private void sendTextMsg(DataOutputStream out,String msg ) throws IOException {
byte[] bytes= msg.getBytes();
int totalLen = 1 + 4 + bytes.length;
out.writeByte(1);
out.writeInt(totalLen);
out.write(bytes);
out.flush();
}
客户端发送消息类为:
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class MsgClient {
private DataOutputStream outs;
public static void main(String[] args) {
try {
MsgClient client = new MsgClient();
client.connServer("127.0.0.1", 9292);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private void sendTextMsg(DataOutputStream out,String msg ) throws IOException {
byte[] bytes= msg.getBytes();
int totalLen = 1 + 4 + bytes.length;
out.writeByte(1);
out.writeInt(totalLen);
out.write(bytes);
out.flush();
}
public void connServer(String ip,int port) throws UnknownHostException, IOException {
Socket client = new Socket(ip,port);
InputStream in = client.getInputStream();
OutputStream out = client.getOutputStream();
outs = new DataOutputStream(out);
while(true) {
Scanner scaner = new Scanner(System.in);
sendTextMsg(outs, "测试消");
}
}
服务端接收类为:
import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class MsgServer {
public static void main(String[] args) {
try {
MsgServer server = new MsgServer();
server.setUpServer(9090);
} catch (IOException e) {
e.printStackTrace();
}
}
public void setUpServer(int port) throws IOException {
ServerSocket server = new ServerSocket(port);
while(true) {
Socket client = server.accept();
System.out.println("客户端IP:"+client.getRemoteSocketAddress());
processMesage(client);
}
}
private void processMesage(Socket client) throws IOException {
InputStream ins = client.getInputStream();
DataInputStream dins = new DataInputStream(ins);
//服务端解包过程
while(true) {
int totalLen = dins.readInt();
byte flag = dins.readByte();
System.out.println("接收消息类型"+flag);
byte[] data = new byte[totalLen - 4 - 1];
dins.readFully(data);
String msg = new String(data);
System.out.println("发来的内容是:"+msg);
}
}
}
这样就基本完成了,但实际还有好多问题,比如说服务端用如何用多线程服务来完成客户端的请求已提高效率,如果是NIO方式怎么来实现?多个消息类型时候怎么抽象?这些都没有考虑
另外有两个开源的框架不错,一个是apache mina 还有个是netty ,有机会试试。
分享到:
相关推荐
C#解决socket通信过程中粘包分包问题,本项目是一个只有6个C#代码文件的开源小工程,用来学习基于TCP的套接字通信包,可以自定义通信协议,处理分包和粘包,内置一个服务端和客户端的套接字程序,也有测试代码和对应...
在IT行业中,网络通信是至关重要的一个领域,而Socket编程是构建网络应用程序的基础。本教程主要聚焦于如何使用C语言实现基于Socket的自定义协议通信,涵盖了客户端和服务端的实现。我们将深入理解Socket编程的基本...
总的来说,Java Socket通信自定义消息协议涉及网络编程基础、数据结构设计以及异常处理等多方面知识。通过这个过程,我们可以灵活地构建满足特定需求的通信系统,实现客户端和服务器间的高效交互。
2. **SuperSocket库**:SuperSocket是一个强大的.NET Socket服务端开发框架,它提供了一种简单的方式来创建自定义的Socket服务。SuperSocket支持多种协议,允许开发者轻松实现TCP/IP通信,而无需深入理解网络编程的...
总之,MFC Socket通信协议实现是一个涉及网络连接建立、数据传输和错误处理的过程。通过利用CAsyncSocket类的异步特性,可以在等待网络操作完成的同时执行其他程序逻辑,提高了程序的响应性和效率。对于任何需要在...
本主题将深入探讨如何实现基于Socket的简单通信协议,主要包括以下几个方面: 一、Socket基本概念 Socket,通常称为套接字,是网络编程中的一个抽象概念,用于在网络上的两个进程间建立通信连接。在TCP/IP协议栈中...
在默认情况下,SuperSocket使用字节流进行通信,但我们可以根据需求定义自己的协议解析规则,这正是我们要做的——创建一个基于冒号和逗号分隔的命令行协议。 1. **自定义协议设计**: - 请求的键(Key)与参数...
Socket是网络编程中的一个接口,可以看作是网络上的两个程序进行双向通信的端点。在Delphi中,我们可以使用TClientSocket和TServerSocket组件来实现客户端和服务端的Socket通信。 1. **创建自定义类** 在发送和接收...
在Java编程中,自定义协议进行Socket连接的简单认证和消息传输是一种常见的网络通信方法,特别是在需要特定格式或逻辑的通信场景下。本文件描述了一个简单的三步认证过程,通过Socket连接实现客户端与服务器端之间的...
根据自定义的协议规范,使用 Socket 编程接口编写基本的网络应用软件。掌握 C 语言形式的 Socket 编程接口用法,能够正确发送和接收网络数据包。开发一个客户端,实现人机交互界面和与服务器的通信。开发一个服务端...
在IT领域,网络通信是应用程序之间...总之,"Qt上应用TcpSocket通信协议"这个项目为你提供了一个基础的TCP通信示例,通过学习和实践,你可以更好地理解和掌握Qt中的网络编程,为开发复杂的分布式系统打下坚实的基础。
总的来说,这个项目提供了一个完整的Android Socket通信示例,展示了如何在客户端和服务器端之间进行多张图片的实时传输,并通过自定义协议头实现了更灵活、可靠的通信机制。这对于开发者来说是一个很好的学习和参考...
unity和python通过自定义socket协议实现异步通信,具体详情请看https://blog.csdn.net/weixin_47232366/article/details/131536238描述的实现方法,如有错误欢迎交流。
Socket协议通信是网络编程中的一个基础概念,它允许两台计算机通过TCP/IP协议进行双向通信。在这个场景中,我们有客户端(Client)和服务器端(Server)两个角色,每个角色都由一个Java类来实现,即`Server.java`和`...
运输层协议采用 TCP 客户端采用交互菜单形式,用户可以选择以下功能: a) 连接:请求连接到指定地址和端口的服务端。 b) 断开连接:断开与服务端的连接。 获取时间: 请求服务端给出当前时间。 获取名字:请求服务端...
在IT领域,网络通信是不可或缺的一部分,而SuperSocket是一个强大且灵活的开源.NET TCP服务器框架。它为开发者提供了一个简单易用的平台,用于构建自己的网络应用服务。本篇文章将深入探讨SuperSocket中的...
设计自定义通信协议时,我们可以根据实际需求简化上述模型,例如对于简单的数据传输,可能只需要物理层、数据链路层和应用层。在数据链路层,可以根据实际情况选择适合的协议,如以太网协议,它定义了帧的结构和MAC...
掌握 C 语言形式的 Socket 编程接口用法,能够正确发送和接收网络数据包 开发一个客户端,实现人机交互界面和与服务器的通信 开发一个服务端,实现并发处理多个客户端的请求程序界面不做要求,使用命令行或最简单的...
当有客户端连接时,`accept`函数会返回一个新的Socket,用于处理客户端的连接。 3. **客户端编程** 客户端首先也需要创建Socket,然后通过`connect`函数向服务器发起连接请求。连接成功后,即可通过这个Socket与...
LED屏发布系统是一种用于在多个LED屏幕上同步显示信息的技术,...XML提供了数据结构化的便利,而自定义的通信协议保证了系统运行的稳定性和安全性。这样的系统设计对于大型信息发布的管理和控制具有很高的实用价值。