非阻塞方式下Socket读取数据的一个例子

原创 2001年08月19日 16:17:00

 

标题:非阻塞方式下Socket读取数据的一个例子
作者:DreamTiger 发表时间:2000-1-15 下午 05:59:13
发信人: lBlade (刀锋), 信区: Delphi       
标  题: Re: 斑竹帮忙看看偶这段Socket程序!救救我! (转载)
发信站: BBS 水木清华站 (Tue Jan 11 14:22:56 2000)

【 在 windlike (风花雪月) 的大作中提到: 】
: 多谢指教!
: 我去大富翁看了。其中有这么一端:
: 阻塞方式可以产生OnClientRead(Write)事件
: 而非阻塞方式,需要自己去读。不会产生这些事件
: 请问,是这样的吗?如果是,那么如何知道有数据
: 到达呢?
: 偶的Server肯定要用stThreadBlocking
: 谢谢

的确如此。在Block方式下,可以通过Windows消息机制进行事件处理,
但在NonBlock方式下,读写操作都必须自己手动处理。
可以看看下面的示例程序。
(一个简单的文件服务器,客户端发送文件名到Server上,Server读取
文件名后把Server上的该文件内容发送到客户端)
定义一个TFileServerThread线程类,重载其ClientExecute方法。
在ServerSocket的GetThread事件中创建出一个新线程进行处理。
procedure TForm1.ServerSocketGetThread(Sender: TObject;
  ServerSocket: TServerClientWinSocket;
  var SocketThread: TServerClientThread);
begin
  // Create a new thread for connection
  SocketThread := TFileServerThread.Create(False, ServerSocket);
end;
有关TFileServerThread的定义和ServerExecute过程实现如下:
(可以通过SocketStream.WaitForData(时间长度)进行数据等待)
  TFileServerThread = class(TServerClientThread)
  public
    procedure ServerExecute; override;
  end;
procedure TFileServerThread.ServerExecute;
var
  Data: array[0..1023] of char;
  FileName: String;
  SocketStream: TWinSocketStream;
begin
  while not Terminated and ServerSocket.Connected do
  try
    SocketStream := TWinSocketStream.Create(ServerSocket, 60000);
    try
      FillChar(Data, SizeOf(Data), 0);
      if SocketStream.Read(Data, SizeOf(Data)) = 0 then
      begin
        // If we didn't get any data after 60 seconds then close the connect
ion
        ServerSocket.Close;
        Terminate;
      end;
      FileName := Data;
      if Length(FileName) > 2 then
        Delete(FileName, Pos(#13#10, FileName), 2);  // Delete #13#10
      if FileExists(FileName) and ServerSocket.Connected then
      begin
        ServerSocket.SendStream(TFileStream.Create(FileName, fmOpenRead or
          fmShareCompat or fmShareDenyNone));
        // Need to use SendMessage here otherwise S could change
        SendMessage(Form1.Listbox1.Handle, LB_ADDSTRING, 0, Integer(PChar(Fi
leName)));
        // PostMessage here is OK because we are not relying on any data
        PostMessage(Form1.Handle, CM_INCCOUNT, 0, 0);
      end;
    finally
      SocketStream.Free;
    end;
  except
    HandleException;
  end;
end;


Java Socket 读取服务器端返回数据

//客户端 //1、创建客户端Socket,指定服务器地址和端口 Socket socket =newSocket("localhost",10086); //2、获取输出流,向服务器端发送信息 Ou...
  • deng529828
  • deng529828
  • 2016年12月02日 14:52
  • 5761

使用socket读取服务器发送的数据问题

刚刚项目使用到socket进行数据的传送,其中数据的读取问题着实 费了老大的劲,以此分享希望能让有缘人少走弯路。new Thread() { @Override ...
  • sky2016_w
  • sky2016_w
  • 2017年04月14日 11:27
  • 628

socket数据传输过程中如何准确的接收消息

想了半天,也没想出个合适的标题,还是描述问题吧 (1)客户端向服务端发送指令,期望获得回答         (2)服务端响应客户端请求,并返回答案 这看起来是一个非常简单的过程,比如客户端发送一条...
  • KWSY2008
  • KWSY2008
  • 2015年10月15日 20:13
  • 9477

JAVA代码:通过Socket读取返回的数据

JAVA代码:通过Socket读取返回的数据            JavaSocket.netJavaScriptSUN        package net.java2000.ne...
  • yuanyuan_186
  • yuanyuan_186
  • 2013年11月14日 15:33
  • 2425

采用Java阻塞IO对已经到达的socket流实现非阻塞完整读取(一个简单的java http server实现)

最近写服务器时想到一个问题:用Java Bio(即Socket)写服务器,怎么一次性完整读取已经到达的Socket流。 对这个需求有很多角度的设定,也有很多解法。我们来一一具化这个需求: (1) ...
  • qq_27680317
  • qq_27680317
  • 2017年06月07日 14:28
  • 1453

linux网络编程:设置非阻塞socket收发数据

非阻塞式I/O包括非阻塞输入操作,非阻塞输出操作,非阻塞接收外来连接,非阻塞发起外出连接。包括的函数有:read, readv, recv, recvfrom, recvmsg, write, wri...
  • bian1029
  • bian1029
  • 2017年06月10日 09:23
  • 997

socket编程 —— 非阻塞socket

在上一篇文章 《socket编程——一个简单的例子》 http://blog.csdn.net/wind19/archive/2011/01/21/6156339.aspx 中写了一个简单的tcp ...
  • wind19
  • wind19
  • 2011年01月21日 15:15
  • 27431

从缓冲上看阻塞与非阻塞socket在发送接收上的区别

最近在网络上看到一些帖子以及回复,同时又搜索了一些网络上关于阻塞非阻塞区别的描述,发现很多人在描述两者的发送接收时操作返回以及缓冲区处理的区别时有不同程度的误解。所以我想写一篇文章来纠正错误,并作为记...
  • qq_14821541
  • qq_14821541
  • 2016年09月05日 12:05
  • 784

比isConnected()更靠谱的的获取socket实时连接状态!

估计很多人会说用socket.isConnected()或者socket.isClosed()等方法来判断就行了,但事实上这些方法都是访问socket在内存驻留的状态,当socket和服务器端建立链接...
  • android_drawing
  • android_drawing
  • 2015年07月21日 15:16
  • 2937

我的c++服务器记录----非阻塞下的socket读取操作

服务器端的基本的一个操作就是从socket的fd上进行数据读取,也就是我们经常用到的read函数。 欢迎关注我的服务器代码:http://code.taobao.org/p/fastServer/s...
  • wallwind
  • wallwind
  • 2015年07月24日 23:52
  • 2067
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:非阻塞方式下Socket读取数据的一个例子
举报原因:
原因补充:

(最多只允许输入30个字)