zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    top指令
    Trie
    最大公约数
    angular2 获取到的数据无法实时更新的问题
    npm install 的时候出现 write access 导致不能成功安装的问题
    angular 的 @Input、@Output 的一个用法
    windows 安装 apache 服务以及添加 php 解析
    php 性能优化之opcache
    intellij 插件结构(文件结构以及概念层面上的结构)
    jetBrains 插件开发第一课-- 在主菜单栏新增一个菜单
  • 原文地址:https://www.cnblogs.com/lodor/p/5128877.html
Copyright © 2011-2022 走看看