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 ...
随机推荐
- Ubuntu 16.10下的eclipse
下载后解压,放到文件下,打开此文件左边齿轮状的东西,即可指引安装:
- [Docker] docker 基础学习笔记2(共6篇)
febootstrap 是一个自制image的一个第三方的工具,好像他们现在都要用这个. 安装还是挺方便的. yum -y install febootstrap febootstrap -i ...
- Mysql Communication link failure :1153 Got a packet bigger than 'max_allowed_packet' bytes
出现这种情况: 临时解决方法是: 登录mysql: 执行: set global max_allowed_packet=1000000000; set global net_buffer_ ...
- Qt之QMutex
概述 QMutex 类使得线程之间可序列化,文档中的描述为provides access serialization between threads 它被设计的初衷是用来保护一个对象.数据结构.代码段 ...
- thinkphp ajax分页
临时更改后的page类(很多地方没修改...因为笔者PHP没学好..)如下: 复制代码 <?php namespace Fenye\libs; /** file: page.class.php ...
- linux crontab
概念: Linux 工作排程的种类:at, cron at 是个可以处理仅执行一次就结束排程的指令,不过要执行 at 时, 必须要有 atd 这个服务支持. crontab 这个指令所设定的工作将会循 ...
- img
public BitmapImage BitmapToImage(System.Drawing.Bitmap bitmap) { System.Drawing.Bitmap bitmapSource ...
- [题解]noip2016普及组题解和心得
[前言] 感觉稍微有些滑稽吧,毕竟每次练的题都是提高组难度的,结果最后的主要任务是普及组抱一个一等奖回来.至于我的分数嘛..还是在你看完题解后写在[后记]里面.废话不多说,开始题解. 第一题可以说的内 ...
- redis cluster java client jedisCluster spring集成方法
1.使用jedis的原生JedisCluster spring的applicationContext.xml配置redis的连接.连接池.jedisCluster Bean <bean id=& ...
- android 异步加载框架 原理完全解析
一.手写异步加载框架MyAsycnTask(核心原理) 1.我为大家手写了一个异步加载框架,涵盖了异步加载框架核心原理. MyAsycnTask.java import android.os.Hand ...