socket 通信
type
TWinSocketStringStream = class(TWinSocketStream)
public
function ReadString(nMaxLength: Integer; var str, sErrMsg: string): Boolean;
function WriteString(const str: string; var sErrMsg: string): Boolean;
end;
对delphi中的类TWinSocketStream进行继承,封装socket传输信息以及提供直接输入字符串方式进行socket传输
unction TWinSocketStringStream.ReadString(nMaxLength: Integer;
var str, sErrMsg: string): Boolean;
var
Buffer: array[0..MAXDATALEN] of byte;
LenBuffer: array[0..10] of byte;
rcvLen, txLen, dataLen: Integer;
begin
Result := false;
str := '';
sErrMsg := '';
try
(*
第一个循环读str长度
*)
dataLen := -1;
txLen := 0;
while dataLen = -1 do
begin
rcvLen := sizeof(dataLen) - txLen;
rcvLen := Read(Buffer, rcvLen);
if rcvLen = 0 then
begin
sErrMsg := Format('只能读取字符串长度的%d/%d', [txLen, sizeof(dataLen)]);
Exit;
end;
Move(Buffer, LenBuffer[txLen], rcvLen);
Inc(txLen, rcvLen);
if txLen = sizeof(dataLen) then
begin
Move(LenBuffer, dataLen, sizeof(dataLen));
break;
end;
end;
nMaxLength := dataLen; //Dynamic Length
if (dataLen <= 0) or (dataLen > nMaxLength) then
begin
str := '';
Result := True;
Exit;
end;
str := StringOfChar(' ', dataLen);
(*
第二个循环读str
*)
txLen := 0;
while txLen < dataLen do
begin
rcvLen := dataLen - txLen;
if rcvLen > MAXDATALEN then rcvLen := MAXDATALEN;
rcvLen := Read(Buffer, rcvLen);
if rcvLen = 0 then
begin
sErrMsg := Format('只能读取字符串的%d/%d', [txLen, dataLen]);
Exit;
end;
Move(Buffer, str[txLen + 1], rcvLen);
Inc(txLen, rcvLen);
end;
Result := True;
except
on E: Exception do
begin
Result := false;
sErrMsg := E.Message;
end;
end;
end;
function TWinSocketStringStream.WriteString(const str: string;
var sErrMsg: string): Boolean;
var
LenBuffer: array[0..10] of byte;
sndLen, txLen, dataLen: Integer;
begin
Result := false;
sErrMsg := '';
try
(*
第一个循环写dataLen
*)
dataLen := Length(str);
Move(dataLen, LenBuffer, sizeof(dataLen));
txLen := 0;
while txLen < sizeof(dataLen) do
begin
sndLen := sizeof(dataLen) - txLen;
sndLen := Write(LenBuffer[txLen], sndLen);
if sndLen = 0 then
begin
sErrMsg := Format('只能写入字符串长度的%d/%d', [txLen, sizeof(dataLen)]);
Exit;
end;
Inc(txLen, sndLen);
end;
(*
第二个循环写str
*)
txLen := 0;
while txLen < dataLen do
begin
sndLen := dataLen - txLen;
if sndLen > MAXDATALEN then sndLen := MAXDATALEN;
sndLen := Write(str[txLen + 1], sndLen);
if sndLen = 0 then
begin
sErrMsg := Format('只能写入字符串的%d/%d', [txLen, dataLen]);
Exit;
end;
Inc(txLen, sndLen);
end;
Result := True;
except
on E: Exception do
begin
Result := false;
sErrMsg := E.Message;
end;
end;
end;
socket 通信的更多相关文章
- 我看不下去鸟。。。。Java和C#的socket通信真的简单吗?
这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...
- php简单实现socket通信
socket通信的原理在这里就不说了,它的用途还是比较广泛的,我们可以使用socket来做一个API接口出来,也可以使用socket来实现两个程序之间的通信,我们来研究一下在php里面如何实现sock ...
- Socket通信类
package com.imooc; import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- socket通信
socket通信 一:socket基于Tcp连接,数据传输有保证 二:socket连接的建立过程: 1:服务器监听 2:客户端发出请求 3:建立连接 4:通信 三:一个简单的例子:服务器端每隔一段时间 ...
- Android之Socket通信、List加载更多、Spinner下拉列表
Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务 ...
- .NET开源高性能Socket通信中间件Helios介绍及演示
一:Helios是什么 Helios是一套高性能的Socket通信中间件,使用C#编写.Helios的开发受到Netty的启发,使用非阻塞的事件驱动模型架构来实现高并发高吞吐量.Helios为我们大大 ...
- iOS开发之Socket通信实战--Request请求数据包编码模块
实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答
一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-下载配置
一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...
随机推荐
- sql时间查询的问题
今天在做一个时间查询的时候遇到一个问题,就是获取的时间是 数据库的存储是这样的2016-10-29 12:11:40 2016-10-31 15:00:05 ... $log=M('table' ...
- Setup Factory 关闭正在运行的程序
--在全局函数中增加 适用用Setup Factory 9 function FindAndCloseProcessByName(strName) local tblProcesses = Wind ...
- C语言学习笔记(一)_hello world程序中涉及的c语言元素
#include <stdio.h> //使用printf函数之前必须include<stdio.h> int main() { int i; //声明一个变量 printf( ...
- git 实用操作
查看某文件的某些行的变化历史: $ git log --pretty=short -u -L 2003,2005:Executor.cpp http://stackoverflow.com/quest ...
- 【摘】BPMN2.0-概要
BPMN2.0-概要 原文地址:http://www.uml.org.cn/workclass/201206272.asp 作者:AliKevin2011,发布于2012-6-27 一.BPM ...
- Firefox每次刷新时自动清空缓存的设置方法
当我们开发网页应用时候,为了保证每次看到的页面是最新的,需要在刷新页面时清除页面缓存. 如果每次都手动清除比较麻烦,好在多数浏览器都支持自动清除缓存的功能. IE下我们可以将缓存设置为"每次 ...
- 利用Maple推导向量方程的微分公式
在某些几何软件的开发中,会要求写出一个向量方程的微分公式.对我而言,手工推导繁琐.易出错.且需要反复校验. 早就听说Mathematica, Maple这样的软件可以自动进行符号公式的推导,一直没有时 ...
- MFC学习笔记
获取窗口句柄 FindWindow 根据窗口名获取 GetSafehWnd 取你程序所在窗口类的句柄 GetActiveWindow ...
- docke部署mysql
#1 docker pull mysql #2 docker run -v /data/var/mysql/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=k ...
- AngularJs自定义指令详解(9) - terminal
例子: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8 ...