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 通信的更多相关文章

  1. 我看不下去鸟。。。。Java和C#的socket通信真的简单吗?

    这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...

  2. php简单实现socket通信

    socket通信的原理在这里就不说了,它的用途还是比较广泛的,我们可以使用socket来做一个API接口出来,也可以使用socket来实现两个程序之间的通信,我们来研究一下在php里面如何实现sock ...

  3. Socket通信类

    package com.imooc; import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt ...

  4. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  5. socket通信

    socket通信 一:socket基于Tcp连接,数据传输有保证 二:socket连接的建立过程: 1:服务器监听 2:客户端发出请求 3:建立连接 4:通信 三:一个简单的例子:服务器端每隔一段时间 ...

  6. Android之Socket通信、List加载更多、Spinner下拉列表

    Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务 ...

  7. .NET开源高性能Socket通信中间件Helios介绍及演示

    一:Helios是什么 Helios是一套高性能的Socket通信中间件,使用C#编写.Helios的开发受到Netty的启发,使用非阻塞的事件驱动模型架构来实现高并发高吞吐量.Helios为我们大大 ...

  8. iOS开发之Socket通信实战--Request请求数据包编码模块

    实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...

  9. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

  10. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-下载配置

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

随机推荐

  1. Unknown column 'a.root_id' in 'where clause'解决方法

    最近遇到一个问题, update  sy_user as a inner join sy_user_charge_log as b on b.username=a.username set recon ...

  2. java 截取url的参数

    /** * 去掉url中的路径,留下请求参数部分 * @param strURL url地址 * @return url请求参数部分 * @author lzf */ private static S ...

  3. navigator对象

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. gson基本使用

    http://www.jianshu.com/p/d62c2be60617 http://blog.csdn.net/lk_blog/article/details/7685169

  5. python之路——基础篇(2)模块

    模块:os.sys.time.logging.json/pickle.hashlib.random.re 模块分为三种: 自定义模块 第三方模块 内置模块 自定义模块 1.定义模块 将一系列功能函数或 ...

  6. SpringRMI远程方法调用

    Spring为各种远程访问技术的集成提供了工具类. 该小段引用自 http://www.open-open.com/lib/view/open1408957290478.html Spring远程支持 ...

  7. ios label上显示特殊字符 % "

    今天在label上显示一个拼接的百分比 label.text = [NSString stringWithFormater:@"%d%",i]; 结果后面的%就是报错,然后查半天也 ...

  8. 真正解决问题:maven eclipse tomcat java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

    在使用eclipse进行整合springmvc时经常会碰到这样的异常: java.lang.ClassNotFoundException:org.springframework.web.context ...

  9. Android学习---通过内容提供者(ContentProvider)操作另外一个应用私有数据库的内容

    一.什么是ContentProvider? ContentProvider直译过来就是内容提供者,主要作用就是A应用提供接口给B应用调用数据,和之前介绍的sharedPreference和直接开放文件 ...

  10. 3.jenkins 权限认证与密码设置

    1.前言 在用Jenkins过程中忘记管理员密码和开启权限认证后管理员帐号没有任何权限是经常遇到的情况,最近有好多群友被这个问题困扰.但Jenkins没有提供密码找回的功能,经过一翻探索找到了一种变相 ...