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;

  • 相关阅读:
    linux 鼠标中键粘帖功能?!!
    mysql 学习笔记(一)
    log4j的使用 与 父接口 slf4j 门面模式(外观模式)
    web.xml 配置 文章汇总
    2019.08.04 新建随笔
    spring-事务的七个传播行为,最近想出去面试,了解一下框架知识
    20190710 tomcat下的项目导入到eclipse中
    20190709 关于web.xml中webAppRootKey的解释
    20160624 策略模式
    20190616 IDEA-每次修改JS文件都需要重启Idea才能生效解决方法
  • 原文地址:https://www.cnblogs.com/lodor/p/5128877.html
Copyright © 2011-2022 走看看