一个简单的自定义通信协议(socket)
来源:互联网 发布:房屋设计三维渲染软件 编辑:程序博客网 时间:2024/05/16 10:59
一直不知道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 ,有机会试试。
- 一个简单的自定义通信协议(socket)
- 一个简单的自定义通信协议(socket)
- 一个简单的自定义通信协议(socket)
- 一个简单的自定义通信协议(socket)
- 一个简单的自定义通信协议(socket)
- 一个简单的自定义通信协议(socket)
- 一个简单的自定义通信协议(socket)
- 一个简单的自定义通信协议(socket)
- 一个简单的自定义通信协议(socket)
- 一个简单的自定义通信协议(socket)
- 一个简单的自定义通信协议(socket)
- 设计一个简单的socket通信协议
- 一个简单的TCP自定义通信协议
- 自定义Socket通信协议
- 简单高效可靠的自定义通信协议(传输协议)
- socket编程里,如何设计自定义通信协议的包头?
- socket编程里,如何设计自定义通信协议的包头?
- 基于socket简单通信协议实现
- 开发管理 CheckLists系列文章
- cocos2d-x播放flash序列帧的粗浅实现
- Socket开发之通讯协议及处理
- WinDbg之Page Heap实践
- JeeCMS 2012 Maven构建+Eclipse完整开发版
- 一个简单的自定义通信协议(socket)
- JEECMS学习资料之一
- UVa150题O(∩_∩)O~
- Rvalue引用声明:&&
- 基于SOCKET机制的TCP协议通讯
- win7上SQL 2008 EXPRESS(免费版)的安装
- 探索C++0x: 3. 右值引用(rvalue reference)
- 基于socket简单通信协议实现
- 国内开源CMS系统