要编写tcp/ip的交互通信用什么?怎样用?

proshyrain 2000-08-07 10:37:00
...全文
128 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
netsong 2000-08-07
  • 打赏
  • 举报
回复
在borland/delphi5/demos/intenet/chat 下有一个例子可以参考,用TServerSocket/TClientSocket控件。

以下是一些小程序:
unit ServerUnit;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ScktComp, StdCtrls, ExtCtrls;

type
TServer = class(TForm)
ServerSocket1: TServerSocket;
lbMsg: TListBox;
lbLog: TListBox;
Label1: TLabel;
Label2: TLabel;
ShutOff: TButton;
SendMsg: TButton;
Edit1: TEdit;
Timer1: TTimer;
procedure ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure SendMsgClick(Sender: TObject);
procedure ShutOffClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Server: TServer;
clientsok: TServerClientWinSocket;

implementation
const
wm_refreshClients=wm_User;
{$R *.DFM}

procedure TServer.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
lbLog.Items.add(Socket.RemoteAddress);
showmessage('Connet: '+Socket.RemoteAddress);
PostMessage(Handle,wm_RefreshClients,0,0);
end;


procedure TServer.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
var
deleteip: string;
delnum: integer;
i: integer;
begin
deleteip:=Socket.RemoteAddress;
for i:=0 to lbLog.Items.Count-1 do
begin
if lbLog.Items[i]=deleteip then delnum:=i;
break;
end;
lbLog.Items.delete(delnum);
PostMessage(Handle,wm_RefreshClients,0,0);
end;


procedure TServer.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
lbMsg.Items.Add(Socket.RemoteAddress+': '+Socket.ReceiveText);
end;


procedure TServer.SendMsgClick(Sender: TObject);
var
i: integer;
clientselected: integer;
selectedip: string;
begin
clientselected:=-1;
for i := 0 to (lbLog.Items.Count - 1) do
if lbLog.Selected[i] then
begin
clientselected:= i;
selectedip:=lbLog.Items[clientselected];
break;
end;
if clientselected<0 then showmessage('Please select send object')
else
begin
ServerSocket1.Socket.Connections[clientselected].SendText('Server: '+edit1.text);
lbMsg.Items.Add('To '+selectedip+' : '+edit1.text);
end;
end;


procedure TServer.ShutOffClick(Sender: TObject);
var
i: integer;
clientselected: integer;
begin
clientselected:=-1;
for i := 0 to (lbLog.Items.Count - 1) do
begin
if lbLog.Selected[i] then clientselected:=i;
break;
end;
if clientselected<0 then showmessage('Please select an object')
else
begin
ServerSocket1.Socket.Connections[clientselected].Close;
lbLog.Items.Delete(clientselected);
end;
end;


procedure TServer.Timer1Timer(Sender: TObject);
begin
lbLog.Refresh;
end;

end.


unit ServerUnit;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ScktComp, StdCtrls, ExtCtrls;

type
TServer = class(TForm)
ServerSocket1: TServerSocket;
lbMsg: TListBox;
lbLog: TListBox;
Label1: TLabel;
Label2: TLabel;
ShutOff: TButton;
SendMsg: TButton;
Edit1: TEdit;
Timer1: TTimer;
procedure ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure SendMsgClick(Sender: TObject);
procedure ShutOffClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Server: TServer;
clientsok: TServerClientWinSocket;

implementation
const
wm_refreshClients=wm_User;
{$R *.DFM}

procedure TServer.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
lbLog.Items.add(Socket.RemoteAddress);
showmessage('Connet: '+Socket.RemoteAddress);
PostMessage(Handle,wm_RefreshClients,0,0);
end;


procedure TServer.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
var
deleteip: string;
delnum: integer;
i: integer;
begin
deleteip:=Socket.RemoteAddress;
for i:=0 to lbLog.Items.Count-1 do
begin
if lbLog.Items[i]=deleteip then delnum:=i;
break;
end;
lbLog.Items.delete(delnum);
PostMessage(Handle,wm_RefreshClients,0,0);
end;


procedure TServer.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
lbMsg.Items.Add(Socket.RemoteAddress+': '+Socket.ReceiveText);
end;


procedure TServer.SendMsgClick(Sender: TObject);
var
i: integer;
clientselected: integer;
selectedip: string;
begin
clientselected:=-1;
for i := 0 to (lbLog.Items.Count - 1) do
if lbLog.Selected[i] then
begin
clientselected:= i;
selectedip:=lbLog.Items[clientselected];
break;
end;
if clientselected<0 then showmessage('Please select send object')
else
begin
ServerSocket1.Socket.Connections[clientselected].SendText('Server: '+edit1.text);
lbMsg.Items.Add('To '+selectedip+' : '+edit1.text);
end;
end;


procedure TServer.ShutOffClick(Sender: TObject);
var
i: integer;
clientselected: integer;
begin
clientselected:=-1;
for i := 0 to (lbLog.Items.Count - 1) do
begin
if lbLog.Selected[i] then clientselected:=i;
break;
end;
if clientselected<0 then showmessage('Please select an object')
else
begin
ServerSocket1.Socket.Connections[clientselected].Close;
lbLog.Items.Delete(clientselected);
end;
end;


procedure TServer.Timer1Timer(Sender: TObject);
begin
lbLog.Refresh;
end;


end.

wsf 2000-08-07
  • 打赏
  • 举报
回复
用delphi自带的TServerSocket,TClientSocket控件
编辑推荐 本书同样采用了大量的实例和实现细节,并参考引用了卷2中的大量源程序。本书适用于希望理解TCP/IP如何工作的人,包括编写网络应用程序的程序员以及利用TCP/IP维护计算机网络的系统管理员。本书的特点是内容丰富,概念清楚且准确,讲解详细,例子很多。作者在书中举出的所有例子均在作者安装的计算机网络上经过实际验证。在本书的最后,作者给出了许多经典的参考文献,并一一写出评注。 内容简介 本书是“TCP/IP详解系列”的延续。主要内容包括:TCP事务协议,即T/TCP,这是对TCP的扩展,使客户-服务器事务更快、更高效和更可靠;TCP/IP应用,主要是HTTP和NNTP;UNIX域协议,这些协议提供了进程之间通信的一种手段。当客户与服务器进程在同一台主机上时,UNIX域协议通常要比TCP/IP快一倍。本书同样采用了大量的实例和实现细节,并参考引用了卷2中的大量源程序。适用于希望理解TCP/IP如何工作的人,包括编写网络应用程序的程序员以及利用TCP/IP维护计算机网络的系统管理员。 作者简介 目录 译者序 前言 第一部分 TCP事务协议 第1章 T/TCP概述 1.1 概述 1.2 UDP上的客户-服务器 1.3 TCP上的客户-服务器 1.4 T/TCP上的客户-服务器 1.5 测试网络 1.6 时间测量程序 1.7 应用 1.8 历史 1.9 实现 1.10 小结 第2章 T/TCP协议 2.1 概述 2.2 T/TCP中的新TCP选项 2.3 T/TCP实现所需变量 2.4 状态变迁图 2.5 T/TCP的扩展状态 2.6 小结 第3章 T/TCP使用举例 3.1 概述 3.2 客户重新启动 3.3 常规的T/TCP事务 3.4 服务器收到过时的重复SYN 3.5 服务器重启动 3.6 请求或应答超出报文段最大长度MSS 3.7 向后兼容性 3.8 小结 第4章 T/TCP协议(续) 4.1 概述 4.2 客户的端口号和TIME_WAIT状态 4.3 设置TIME_WAIT状态的目的 4.4 TIME_WAIT状态的截断 4.5 利用TAO跳过三次握手 4.6 小结 第5章 T/TCP协议的实现:插口层 5.1 概述 5.2 常量 5.3 sosend函数 5.4 小结 第6章 T/TCP的实现:路由表 6.1 概述 6.2 代码介绍 6.3 radix_node_head结构 6.4 rtentry结构 6.5 rt_metrics结构 6.6 in_inithead函数 6.7 in_addroute函数 6.8 in_matroute函数 6.9 in_clsroute函数 6.10 in_rtqtimo函数 6.11 in_rtqkill函数 6.12 小结 第7章 T/TCP实现:协议控制块 7.1 概述 7.2 in_pcbladdr函数 7.3 in_pcbconnect函数 7.4 小结 第8章 T/TCP实现: TCP概要 8.1 概述 8.2 代码介绍 8.3 TCP的protosw结构 8.4 TCP控制块 8.5 tcp_init函数 8.6 tcp_slowtimo函数 8.7 小结 第9章 T/TCP实现:TCP输出 9.1 概述 9.2 tcp_output函数 9.2.1 新的自动变量 9.2.2 增加隐藏的状态标志 9.2.3 在SYN_SENT状态不要重传SYN 9.2.4 发送器的糊涂窗口避免机制 9.2.5 有RST或SYN标志时强制发送报文段 9.2.6 发送MSS选项 9.2.7 是否发送时间戳选项 9.2.8 发送T/TCP的CC选项 9.2.9 根据TCP选项调整数据长度 9.3 小结 第10章 T/TCP实现:TCP函数 10.1 概述 10.2 tcp_newtcpcb函数 10.3 tcp_rtlookup函数 10.4 tcp_gettaocache函数 10.5 重传超时间隔的计算 10.6 tcp_close函数 10.7 tcp_msssend函数 10.8 tcp_mssrcvd函数 10.9 tcp_dooptions函数 10.10 tcp_reass函数 10.11 小结 第11章 T/TCP实现:TCP输入 11.1 概述 11.2 预处理 11.3 首部预测 11.4 被动打开的启动 11.5 主动打开的启动 11.6 PAWS:防止序号重复 11.7 ACK处理 11.8 完成被动打开和同时打开 11.9 ACK处理(续) 11.10 FIN处理 11.11 小结 第12章 T/TCP实现:TCP用户请求 12.1 概述 12.2 PRU_CONNECT请求 12.3 tcp_connect函数 12.4 PRU_SEND和PRU_SEND_EOF请求 12.5 tcp_usrclosed函数 12.6 tcp_sysctl函数 12.7 T/TCP的前景 12.8 小结 第二部分 TCP的其他应用 第13章 HTTP:超文本传送协议 13.1 概述 13.2 HTTP和HTML概述 13.3 HTTP 13.3.1 报文类型:请求与响应 13.3.2 首部字段 13.3.3 响应代码 13.3.4 各种报文头举例 13.3.5 例子:客户程序缓存 13.3.6 例子:服务器重定向 13.4 一个例子 13.5 HTTP的统计资料 13.6 性能问题 13.7 小结 第14章 在HTTP服务器上找到的分组 14.1 概述 14.2 多个HTTP服务器 14.3 客户端SYN的到达间隔时间 14.4 RTT的测量 14.5 用listen设置入连接队列的容量 14.6 客户端的SYN选项 14.7 客户端的SYN重传 14.8 域名 14.9 超时的持续探测 14.10 T/TCP路由表大小的模拟 14.11 mbuf的交互 14.12 TCP的PCB高速缓存和首部预测 14.13 小结 第15章 NNTP:网络新闻传送协议 15.1 概述 15.2 NNTP 15.3 一个简单的新闻客户 15.4 一个复杂的新闻客户 15.5 NNTP的统计资料 15.6 小结 第三部分 Unix域协议 第16章 Unix域协议:概述 16.1 概述 16.2 用途 16.3 性能 16.4 编码举例 16.5 小结 第17章 Unix域协议:实现 17.1 概述 17.2 代码介绍 17.3 Unix domain和protosw结构 17.4 Unix域插口地址结构 17.5 Unix域协议控制块 17.6 uipc_usrreq函数 17.7 PRU_ATTACH请求和unp_attach函数 17.8 PRU_DETACH请求和unp_detach函数 17.9 PRU_BIND请求和unp_bind函数 17.10 PRU_CONNECT请求和unp_connect函数 17.11 PRU_CONNECT2请求和unp_connect2函数 17.12 socketpair系统调用 17.13 pipe系统调用 17.14 PRU_ACCEPT请求 17.15 PRU_DISCONNECT请求和unp_disconnect函数 17.16 PRU_SHUTDOWN请求和unp_shutdown函数 17.17 PRU_ABORT请求和unp_drop函数 17.18 其他各种请求 17.19 小结 第18章 Unix域协议:I/O和描述符的传递 18.1 概述 18.2 PRU_SEND和PRU_RCVD请求 18.3 描述符的传递 18.4 unp_internalize函数 18.5 unp_externalize函数 18.6 unp_discard函数 18.7 unp_dispose函数 18.8 unp_scan函数 18.9 unp_gc函数 18.10 unp_mark函数 18.11 性能(再讨论) 18.12 小结 附录A 测量网络时间 附录B 编写T/TCP应用程序 参考文献 缩略语

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧