服务器开发—Socket通信实例(二)
来源:互联网 发布:人工智能要那些专业 编辑:程序博客网 时间:2024/04/28 13:03
客户端的例子过程比较简单
1、先建立Socket
2、建立connect
3、接收/发送
注意是接收是阻塞模式
客户端代码:
ChatClient.cpp
/* * ChatClient.cpp * * Created on: 2012-9-29 * Author: root */#include "ClientSocket.h"#include "SocketException.h"#include <string>#include <iostream>#include "Encoder.h"#include "Decoder.h"using namespace std;int main() {cout << "====Running Client...====" << endl;try{std::string strValue = "{\"action\":\"Test\"}";ClientSocket clientSocket("127.0.0.1",888000);//string massage=Encoder::encoder(strValue);//cout << Decoder::decoder(massage) << endl;while(1){//clientSocket.Recevie(massage);//cout << "Response from server:" << massage << endl;//massage.clear();clientSocket.Send(Encoder::encoder(strValue));sleep(5);}}catch (SocketException& e) {cout << "Exception was caught:" << e.DisplayMsg() << endl;}return 0;}
解析数据是必需的,因为Socket机制会优先发送的机制,从而导致粘包现在(将两次小数据当作一次来),其中有两种解决方法,一种是设置setsocketopt,不支持nagle算法,第二就是进行对包封装,一般是计算数据长度,并加入到包头,解析时就先解析包头的长度,接下来就一直接收到该 长度就可得到“刚好”的数据
/* * Decoder.h * * Created on: 2012-10-18 * Author: root */#ifndef DECODER_H_#define DECODER_H_#include <string>class Decoder {public:Decoder();virtual ~Decoder();static std::string decoder(std::string message);};#endif /* DECODER_H_ */
Decoder.cpp 解析数据实现类
/* * Decoder.cpp * * Created on: 2012-10-18 * Author: root */#include "Decoder.h"#include "TypeConvert.h"Decoder::Decoder() {}Decoder::~Decoder() {}std::string Decoder::decoder(std::string message) {int length = message.length();if (length <= 4) {return ""; // waite}std::string datalengstr = message.substr(0, 4);int dataleng = TypeConvert::Strint2Int(datalengstr);if (dataleng > length - 4) {return "";}return message.substr(4, length - 4);}
Encoder.h 加密数据
/* * Encoder.h * * Created on: 2012-10-18 * Author: root */#ifndef ENCODER_H_#define ENCODER_H_#include <string>class Encoder {public:Encoder();virtual ~Encoder();static std::string encoder(std::string message);};#endif /* ENCODER_H_ */
Encoder.cpp 加密数据类
/* * Encoder.cpp * * Created on: 2012-10-18 * Author: root */#include "Encoder.h"#include "TypeConvert.h"#include <iostream>Encoder::Encoder() {// TODO Auto-generated constructor stub}Encoder::~Encoder() {// TODO Auto-generated destructor stub}std::string Encoder::encoder(std::string message) {int length = message.length();std::string lenstr = TypeConvert::Int2String(length);if (length < 10) {lenstr = "000" + lenstr;} else if (length < 100) {lenstr = "00" + lenstr;} else if (length < 1000) {lenstr = "0" + lenstr;}return (lenstr + message);}
- 服务器开发—Socket通信实例(二)
- 服务器开发—Socket通信实例(一)
- Socket通信实例(二)——单线程实例
- Socket通信实例二
- Socket通信(二)-- 多线程服务器实现
- Lua 服务器Socket通信实例
- 基于Socket通信的小实例(二)
- Linux socket编程(二) 服务器与客户端的通信
- Linux socket编程(二) 服务器与客户端的通信
- Linux socket编程(二) 服务器与客户端的通信
- Linux socket编程(二) 服务器与客户端的通信
- android客户端与服务器socket通信实例
- C#和PHP Socket通信实例代码(服务器与客户端通信)
- C#和PHP Socket通信实例代码(服务器与客户端通信)
- Socket通信实例(三)——多线程实例
- [Java开发] Java服务器使用socket通信
- Socket通信学习实例二之即时通信
- java Socket通信(二)
- 开源新篇章,红帽已前行。你跟上了么?
- 嵌入式操作系统内核原理和开发(优先级的修改)
- 由”构造函数“引发的一系列的。。
- Servlet入门(2)
- 阿里巴巴六年码农自白
- 服务器开发—Socket通信实例(二)
- 从根本上改变我们开发Java程序的方式:Lambda
- 函数的递归调用与栈
- iPhone开发教程之保存当前view到相册(截屏)的方法
- 历史性时刻!ARM首次成功模拟运行x86
- 汉字转拼音缩写
- OpenFlight API调用之一--编译自己的程序
- 2012年基于ARM架构的服务器发展势头十分强劲
- COM原理(一)