高手请进``````````socket问题 ( 积分: 50 )

  • 主题发起人 xiang8410
  • 开始时间
X

xiang8410

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在想做一个局域网的Socket通讯,请问能给个例子参考一下吗,我的邮箱xiang_8410@163.com
要求如下:
ERP系统 局域网通讯 功能
功能目标 描述:
1:消息发送: 能自由对ERP系统的任何一个用户(不管是否登陆系统)发送消息
服务器端可以根据在DBGrid显示的用户中选择对哪几个用户进行发送信息
2:消息接收:
2.1 当接收对象在线时(即已登陆系统),需要弹出提示窗口;
2.2 当接收对象不在线时,需要在其登陆系统后,弹出提示窗口。
ERP系统的用户记录信息:
表名:Users
相应使用的字段:UserName nvarchar(16) 用户名称
Login bit 是否登陆
SelectYN bit 是否发送消息(根据在服务端选择判断是否给哪些客户端发送信息 )
 
50 分就想做这么多东西?
求代码的话不如出 RMB
 
現在人都很現實的,這可是人家的技術,做技術的就是靠技術吃飯的。
 
只要知道SOCKET的相关知识,这些功能不难实现.
 
我就是刚接触,不知从何下手,才想找到例子参考一下~~~~~~~~~~各位帮帮忙,做技术就是要互相交流帮助才会进步嘛````如果个个都只为自己,那我也没什么好说的了``````
 
只有負出沒有回報啊。。。。
 
我的理解,就是对所有的用户发送消息,如果在线,那么客户端就能收到,如果不在线就暂时存储到服务器端,在检测到客户端上线后在从本地发送给改客户端。
不知道说的对不对,大家给个答案!
 
原理上没错。知道原理做不出就是基础问题,先去补基础。
 
真的是很简单,如果你实在不懂呢,就用最简单的方法,两组控件,服务器用IDTCPSERVER,客户端用IDTCPCLIENT,在线的就直接发。
不在线的,在客户端登陆后,再从数据库取出后,再发。
 
我有个用INDY组件做的C/S模型.给你参考下:
客户端:
procedure TForm1.Button1Click(Sender: TObject);
begin
IdTCPClient1.Host:=Edit1.Text;
IdTcpClient1.Port:=StrToInt(Edit2.Text);
ListBox1.Items.Add('正在连接'+Edit1.Text+'...');
with IdTCPClient1 do
begin
try
connect(2000);
try
ListBox1.Items.Add(ReadLn());
Button1.Enabled:=False;
Button2.Enabled:=True;
Button3.Enabled:=True;
except
ListBox1.Items.Add('远程主机无响应!') ;
IdTCPClient1.Disconnect();
end;
except
ListBox1.Items.Add('无法建立到'+Edit1.Text+'的连接');
end;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ListBox1.Items.Add('DATA'+Edit3.Text);
with IdTCPClient1 do
begin
try
WriteLn('DATA'+' '+trim(Edit3.Text));
ListBox1.Items.Add(ReadLn());
except
ListBox1.Items.Add('发送数据失败!');
IdTCPClient1.Disconnect();
ListBox1.Items.Add('同主机'+Edit1.Text+'的连接已断开!');
Button1.Enabled:=True;
Button2.Enabled:=False;
Button3.Enabled:=False;
end;
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
Received:string;
begin
ListBox1.Items.Add('QUIT');
try
IdTCPClient1.WriteLn('QUIT');
finally
IdTCPClient1.Disconnect();
ListBox1.Items.Add('同主机'+Edit1.Text+'的连接已断开!');
Button1.Enabled:=True;
Button2.Enabled:=False;
Button3.Enabled:=False;
end;
end;

end.


服务端:
procedure TForm1.Button1Click(Sender: TObject);
begin
IdTCPServer1.DefaultPort:=StrToInt(Edit1.Text);
IdTCPServer2.DefaultPort:=StrToInt(Edit3.Text);
IdTCPServer1.Active:=True;
IdTCPServer2.Active:=True;
Button1.Enabled:=False;
Button2.Enabled:=True;
ListBox1.Items.Add('服务器已成功启动!');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
IdTCPServer1.Active:=False;
IdTCPServer2.Active:=False;
Button1.Enabled:=True;
Button2.Enabled:=False;
ListBox1.Items.Add('服务器已成功停止!');
end;

procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
ListBox1.Items.Add('来自主机'+AThread.Connection.Socket.Binding.PeerIP+'的连接请求已经被接纳!');
AThread.Connection.WriteLn('100:欢迎连接到简单TCP服务器!');

end;

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
sCommand,FLogEntry:string;

begin
with AThread.Connection do
begin
sCommand:=ReadLn();
FLogEntry:=sCommand+'来自于主机'+AThread.Connection.Socket.Binding.PeerIP;
AThread.Synchronize(AddLogEntry);
if AnsiStartsText('DATA',sCommand) then
begin
FReceived:=RightStr(sCommand,length(sCommand)-5);
WriteLn(Edit4.Text);
AThread.Synchronize(DisplayData);
end
else if SameText(sCommand,'QUIT') then
begin
FLogEntry:='断开同主机'+AThread.Connection.Socket.Binding.PeerIP+'的连接!';
AThread.Synchronize(AddLogEntry);
Disconnect;
end
{else begin
WriteLn('500:无法识别的命令!');
FLogEntry:='无法识别命令:'+sCommand;
AThread.Synchronize(AddLogEntry);
end;}
end;
end;

procedure TForm1.DisplayData();
begin
Edit2.Text:=FReceived;
Edit4.Text:=FReceived1;
end;
procedure TForm1.AddLogEntry();
begin
ListBox1.Items.Add(FLogEntry);
end;
procedure TForm1.AddLogEntry1();
begin
ListBox1.Items.Add(FLogEntry1);
end;

end.

只是简单的发送接受消息,其他的功能你自己完善!
 
接受答案了.
 

Similar threads

回复
0
查看
701
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
975
SUNSTONE的Delphi笔记
S
顶部