socket问题,谁能回答我? 谁能给一个在两台机器之间通信的程序?谢了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 二、编写主控程序 ---- 1、新建一个项目Client.dpr,并把一个TClientSocket元件放到Form上,它的属性设置如下:Port设为100(端口号可任意设置,只要求双方统一),其它属性按默认值。在窗体上添加两个TEdit:Edit1用来输入发送的字符,Edit2用来输入IP地址;添加两个TButton:Button1点击后用来连接被控机,Button2点击后用来发送字符,然后声明一个私有变量ConnectFlag,表示双方是否连接好: private ConnectFlag:Boolean;---- 2、ClientSocket1的OnConnect事件代码如下: procedure TForm1.ClientSocket1Connect(Sender: TObject;Socket: TCustomWinSocket); begin ConnectFlag:=True; //表示连接成功 end;---- 3、ClientSocket1的OnError事件代码如下: procedure TForm1.ClientSocket1Error(Sender: TObject;Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;var ErrorCode: Integer); beginApplication.MessageBox(PChar(' 不能连接到IP地址 : ' + Edit2.Text+'。'+#13+'可能是监听程序没有运行或网络故障!'),'连接错误',MB_OK+MB_ICONSTOP); ErrorCode := 0; end;---- 4、Button1的OnClick事件代码如下: procedure TForm1.Button1Click(Sender: TObject);beginwith ClientSocket1 do beginif Active then beginActive := False;//在连接之前首先关闭ConnectFlag:=False; //置连接标志为假end;if Length(Edit2.Text) > 0 then beginHost := Edit2.Text; //指定IP地址或主机名Active := True; end; end; end;---- 5、Button2的OnClick事件代码如下: procedure TForm1.Button2Click(Sender: TObject); begin if ConnectFlag thenClientSocket1.Socket.SendText(Edit1.Text) //如果连接成功则发送字符串 elseApplication.MessageBox(PChar(' 没有连接到地址 : ' + Edit2.Text+'。'+#13+'检查IP地址是否存在或是否已经连接!'),'提示信息',MB_OK+MB_ICONSTOP); end; 三、编写被控程序 ---- 1、新建一个项目Server.dpr,并把一个TServerSocket元件放到Form上,它的属性设置如下:Active设为True;Port设为100,其它属性按默认值。 ---- 2、ServerSocket1的OnClientRead事件代码如下: procedure TForm1.ServerSocket1ClientRead(Sender: TObject;Socket: TCustomWinSocket); var Str:PChar; Code,V:Integer; begin Str:=PChar(Socket.ReceiveText); //接收字符串Val(Str,V,Code); //处理接收的字符串,首先转换字符串为整数 if Code< >0 then Application.MessageBox(Str,'提示信息',MB_OK+MB_ICONINFORMATION) //如果转换后的数据不是一个整型数就通过消息框来显示字符串 else if (V=0)or(V=1)or(V=2) then ExitWindowsEx(V,0) //调用Windows的API函数(V=0表示重新登录、V=1表示关机、V=2表示重启动) elseApplication.MessageBox(Str,'提示信息',MB_OK+MB_ICONINFORMATION); //转换后数据不为0、1、2时在消息框内显示字符串 end;---- 3、修改项目文件,不让窗口显示并且防止它运行两次,修改begin和end之间的代码如下: beginApplication.Initialize;if FindWindow('TForm1','Form1')=0 then begin //当没有找到Form1时执行下面代码Application.ShowMainForm:=False; //不显示主窗口Application.CreateForm(TForm1, Form1);Application.Run; end; end. Delphi DEMO下有 例子呀! UPD协议unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, NMUDP, ExtCtrls, Buttons, Menus,ComCtrls,WinSock;//file://增加WinSock;type TForm1 = class(TForm) Panel1: TPanel; Panel2: TPanel; NMUDP1: TNMUDP; ListBox1: TListBox; Memo1: TMemo; Button1: TButton; Button2: TButton; Edit1: TEdit; Label1: TLabel; BitBtn1: TBitBtn; Button3: TButton; procedure FormShow(Sender: TObject); procedure BitBtn1Click(Sender: TObject); procedure NMUDP1DataReceived(Sender: TComponent; NumberBytes: Integer; FromIP: String; Port: Integer); procedure Edit1KeyPress(Sender: TObject; var Key: Char); procedure Button1Click(Sender: TObject); //procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1; ComputerName: array[0..127] of Char;implementation{$R *.DFM}procedure TForm1.FormShow(Sender: TObject);var sz:dword;begin sz := SizeOf(Computername); GetComputerName(ComputerName, sz);//得到本机的标识 ListBox1.Items.Clear; ListBox1.Items.Add('大家');//在网友清单中,增加"大家"和 ListBox1.Items.Add(ComputerName);//本机名称 ListBox1.ItemIndex:=0;end;procedure TForm1.BitBtn1Click(Sender: TObject);var MyStream: TMemoryStream; TmpStr: String; i:integer; Begin //if Edit1.Text<>'' then file://如果所说的内容不为空,则发送。 begin NMUDP1.ReportLevel := Status_Basic; //NMUDP1.RemotePort :=8888;//端口为:8888,可以自己定义,但必须与LocalPort相一致。 if ListBox1.Items[ListBox1.ItemIndex]=ComputerName then Edit1.Text:=ComputerName+'自言自语道:'+Edit1.Text //file://如果和自己对话. Else Edit1.Text:=ComputerName+'对'+ListBox1.Items[listbox1.itemindex]+'说:'+Edit1.Text; TmpStr :=Edit1.text; MyStream := TMemoryStream.Create; try MyStream.Write(TmpStr[1], Length(Edit1.Text)); if ListBox1.ItemIndex=0 then begin for i:=1 to ListBox1.Items.Count-1 do //file://如果选择"大家",则对所有的网友发送信息 begin NMUDP1.RemoteHost :=ListBox1.Items[i];//远程主机的名称或地址. NMUDP1.SendStream(MyStream);//发送信息. End; end else //如果私聊 begin NMUDP1.RemoteHost :=ListBox1.Items[ListBox1.itemindex]; //file://仅对所选中的网友. NMUDP1.SendStream(MyStream); End; finally MyStream.Free; end; Edit1.Text:=''; Edit1.SetFocus; end; //else Edit1.SetFocus; end;procedure TForm1.NMUDP1DataReceived(Sender: TComponent; NumberBytes: Integer; FromIP: String; Port: Integer);var MyStream: TMemoryStream; TmpStr: String; begin MyStream := TMemoryStream.Create; try NMUDP1.ReadStream(MyStream); SetLength(TmpStr,NumberBytes); MyStream.Read(TmpStr[1],NumberBytes); Memo1.Lines.Add(TmpStr); //file://显示对话的内容. finally MyStream.Free; end; end;procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);var MyStream: TMemoryStream; TmpStr: String; i:integer; Begin if (key=#13) and (Edit1.Text<>'') then //file://如果所说的内容不为空,且最后一个按键为"Enter",则发送。 begin NMUDP1.ReportLevel := Status_Basic; NMUDP1.RemotePort :=8888; if ListBox1.Items[ListBox1.ItemIndex]=ComputerName then Edit1.Text:=ComputerName+'自言自语道:'+Edit1.Text else Edit1.Text:=ComputerName+'对'+ListBox1.Items[listbox1.itemindex]+'说:'+Edit1.Text; TmpStr :=Edit1.text; MyStream := TMemoryStream.Create; try MyStream.Write(TmpStr[1], Length(Edit1.Text)); if ListBox1.ItemIndex=0 then begin for i:=1 to ListBox1.Items.Count-1 do begin NMUDP1.RemoteHost :=ListBox1.Items[i]; NMUDP1.SendStream(MyStream); end; end else begin NMUDP1.RemoteHost :=ListBox1.Items[ListBox1.itemindex]; NMUDP1.SendStream(MyStream); end; finally MyStream.Free; end; Edit1.Text:=''; edit1.SetFocus; end else Edit1.SetFocus; end;procedure TForm1.Button1Click(Sender: TObject);var InputString:String; begin //file;//增加网友,输入的可以是IP地址或计算机名称。 InputString:=InputBox('增加人员', 'IP地址或计算机名', ''); if Inputstring<>'' then ListBox1.Items.Add(Inputstring); ListBox1.ItemIndex:=0; end;procedure TForm1.Button3Click(Sender: TObject); begin //file://删除当前选中的网友,但"大家"不能被删除. if ListBox1.ItemIndex<>0 then ListBox1.Items.Delete(ListBox1.ItemIndex); end;end. client:SendTextserver:ReceiveText Delphi中ADO控件删除dbf数据库 TcxTreeList叶节点不能获得焦点,不能编辑 关于多线程处理数据库的两个问题? 为何不能在Delphi 6中不能使用TQRChart 请问,谁知道QROblique.dcu是做什么用的?那里可以得到这个文件? 動態生成Panel 並在每個生成的Panel上動態生成comboBox之相關問題 急件!! 中国象棋炮的着法 可怜虫 小女子向各位大哥请教一极菜的问题。我是初学。 关于RX Library 2.75,好象是他的bug? pchar string 二进制 地址 大評。。 请问各位大哥,现在申请哪个网站的免费邮箱好一点?多谢了!
二、编写主控程序
---- 1、新建一个项目Client.dpr,并把一个TClientSocket元件放到Form上,它的属性设置如下:Port设为100(端口号可任意设置,只要求双方统一),其它属性按默认值。在窗体上添加两个TEdit:Edit1用来输入发送的字符,Edit2用来输入IP地址;添加两个TButton:Button1点击后用来连接被控机,Button2点击后用来发送字符,然后声明一个私有变量ConnectFlag,表示双方是否连接好:
private
ConnectFlag:Boolean;---- 2、ClientSocket1的OnConnect事件代码如下:
procedure TForm1.ClientSocket1Connect
(Sender: TObject;Socket: TCustomWinSocket);
begin
ConnectFlag:=True; //表示连接成功
end;---- 3、ClientSocket1的OnError事件代码如下:
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent:
TErrorEvent;var ErrorCode: Integer);
begin
Application.MessageBox(PChar(' 不能连接到IP地址
: ' + Edit2.Text+'。'+
#13+'可能是监听程序没有运行或网络故障!'),'
连接错误',MB_OK+MB_ICONSTOP);
ErrorCode := 0;
end;---- 4、Button1的OnClick事件代码如下:
procedure TForm1.Button1Click(Sender: TObject);
begin
with ClientSocket1 do begin
if Active then begin
Active := False;//在连接之前首先关闭
ConnectFlag:=False; //置连接标志为假
end;
if Length(Edit2.Text) > 0 then begin
Host := Edit2.Text; //指定IP地址或主机名
Active := True;
end;
end;
end;---- 5、Button2的OnClick事件代码如下:
procedure TForm1.Button2Click(Sender: TObject);
begin
if ConnectFlag then
ClientSocket1.Socket.SendText(Edit1.Text)
//如果连接成功则发送字符串
else
Application.MessageBox(PChar(' 没有连接到地址 :
' + Edit2.Text+'。'+
#13+'检查IP地址是否存在或是否已经连接!'),'
提示信息',MB_OK+MB_ICONSTOP);
end; 三、编写被控程序
---- 1、新建一个项目Server.dpr,并把一个TServerSocket元件放到Form上,它的属性设置如下:Active设为True;Port设为100,其它属性按默认值。
---- 2、ServerSocket1的OnClientRead事件代码如下: procedure TForm1.ServerSocket1ClientRead
(Sender: TObject;Socket: TCustomWinSocket);
var
Str:PChar;
Code,V:Integer;
begin
Str:=PChar(Socket.ReceiveText); //接收字符串
Val(Str,V,Code); //处理接收的字符串,首先转换字符串为整数
if Code< >0 then
Application.MessageBox(Str,'提示信息',
MB_OK+MB_ICONINFORMATION)
//如果转换后的数据不是一个整型数就通过消息框来显示字符串
else
if (V=0)or(V=1)or(V=2) then
ExitWindowsEx(V,0)
//调用Windows的API函数(V=0表示重新登录、
V=1表示关机、V=2表示重启动)
else
Application.MessageBox(Str,'提示信息',
MB_OK+MB_ICONINFORMATION);
//转换后数据不为0、1、2时在消息框内显示字符串
end;---- 3、修改项目文件,不让窗口显示并且防止它运行两次,修改begin和end之间的代码如下:
begin
Application.Initialize;
if FindWindow('TForm1','Form1')=0 then begin
//当没有找到Form1时执行下面代码
Application.ShowMainForm:=False; //不显示主窗口
Application.CreateForm(TForm1, Form1);
Application.Run;
end;
end.
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, NMUDP, ExtCtrls, Buttons,
Menus,ComCtrls,WinSock;//file://增加WinSock;type
TForm1 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
NMUDP1: TNMUDP;
ListBox1: TListBox;
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Label1: TLabel;
BitBtn1: TBitBtn;
Button3: TButton;
procedure FormShow(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure NMUDP1DataReceived(Sender: TComponent; NumberBytes: Integer;
FromIP: String; Port: Integer);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Button1Click(Sender: TObject);
//procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
ComputerName: array[0..127] of Char;implementation{$R *.DFM}procedure TForm1.FormShow(Sender: TObject);
var sz:dword;begin sz := SizeOf(Computername); GetComputerName(ComputerName, sz);//得到本机的标识 ListBox1.Items.Clear; ListBox1.Items.Add('大家');//在网友清单中,增加"大家"和 ListBox1.Items.Add(ComputerName);//本机名称 ListBox1.ItemIndex:=0;end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var MyStream: TMemoryStream; TmpStr: String; i:integer; Begin //if Edit1.Text<>'' then file://如果所说的内容不为空,则发送。 begin NMUDP1.ReportLevel := Status_Basic; //NMUDP1.RemotePort :=8888;//端口为:8888,可以自己定义,但必须与LocalPort相一致。 if ListBox1.Items[ListBox1.ItemIndex]=ComputerName then Edit1.Text:=ComputerName+'自言自语道:'+Edit1.Text //file://如果和自己对话. Else Edit1.Text:=ComputerName+'对'+ListBox1.Items[listbox1.itemindex]+'说:'+Edit1.Text; TmpStr :=Edit1.text; MyStream := TMemoryStream.Create; try MyStream.Write(TmpStr[1], Length(Edit1.Text)); if ListBox1.ItemIndex=0 then begin for i:=1 to ListBox1.Items.Count-1 do //file://如果选择"大家",则对所有的网友发送信息 begin NMUDP1.RemoteHost :=ListBox1.Items[i];//远程主机的名称或地址. NMUDP1.SendStream(MyStream);//发送信息. End; end else //如果私聊 begin NMUDP1.RemoteHost :=ListBox1.Items[ListBox1.itemindex]; //file://仅对所选中的网友. NMUDP1.SendStream(MyStream); End; finally MyStream.Free; end; Edit1.Text:=''; Edit1.SetFocus; end;
//else Edit1.SetFocus; end;
procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var MyStream: TMemoryStream; TmpStr: String; begin MyStream := TMemoryStream.Create; try NMUDP1.ReadStream(MyStream); SetLength(TmpStr,NumberBytes); MyStream.Read(TmpStr[1],NumberBytes); Memo1.Lines.Add(TmpStr); //file://显示对话的内容. finally MyStream.Free; end; end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var MyStream: TMemoryStream; TmpStr: String; i:integer; Begin if (key=#13) and (Edit1.Text<>'') then //file://如果所说的内容不为空,且最后一个按键为"Enter",则发送。 begin NMUDP1.ReportLevel := Status_Basic; NMUDP1.RemotePort :=8888; if ListBox1.Items[ListBox1.ItemIndex]=ComputerName then Edit1.Text:=ComputerName+'自言自语道:'+Edit1.Text else Edit1.Text:=ComputerName+'对'+ListBox1.Items[listbox1.itemindex]+'说:'+Edit1.Text; TmpStr :=Edit1.text; MyStream := TMemoryStream.Create; try MyStream.Write(TmpStr[1], Length(Edit1.Text)); if ListBox1.ItemIndex=0 then begin for i:=1 to ListBox1.Items.Count-1 do begin NMUDP1.RemoteHost :=ListBox1.Items[i]; NMUDP1.SendStream(MyStream); end; end else begin NMUDP1.RemoteHost :=ListBox1.Items[ListBox1.itemindex]; NMUDP1.SendStream(MyStream); end; finally MyStream.Free; end; Edit1.Text:=''; edit1.SetFocus; end
else Edit1.SetFocus; end;procedure TForm1.Button1Click(Sender: TObject);var InputString:String; begin //file;//增加网友,输入的可以是IP地址或计算机名称。 InputString:=InputBox('增加人员', 'IP地址或计算机名', ''); if Inputstring<>'' then ListBox1.Items.Add(Inputstring); ListBox1.ItemIndex:=0; end;
procedure TForm1.Button3Click(Sender: TObject);
begin //file://删除当前选中的网友,但"大家"不能被删除. if ListBox1.ItemIndex<>0 then ListBox1.Items.Delete(ListBox1.ItemIndex); end;
end.
server:ReceiveText