ServerSocket与ClientSocket 阻塞模式通信怎么开发

解决方案 »

  1.   

    你去的 delphi 6 上有这两个控件,不想去其它的,且程序也写了一部分,要改的话要用好大的功。
      

  2.   

    给你个完整的,基于ServerSocket与ClientSocket 的通信程序
    Client端:unit UnitMain;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ScktComp, StdCtrls, ExtCtrls, ComCtrls, Menus;type
      TForm1 = class(TForm)
        MemoChat: TMemo;
        EditSay: TEdit;
        ButtonSend: TButton;
        ButtonConnect: TButton;
        ClientSocket: TClientSocket;
        StatusBar: TStatusBar;
        Bevel1: TBevel;
        EditIP: TLabeledEdit;
        EditPort: TLabeledEdit;
        Label1: TLabel;
        EditNick: TLabeledEdit;
        ButtonChangeNick: TButton;
        MainMenu: TMainMenu;
        File1: TMenuItem;
        ConnectDisconnect1: TMenuItem;
        ChangeNickname1: TMenuItem;
        Exit1: TMenuItem;
        Bevel2: TBevel;
        procedure ButtonConnectClick(Sender: TObject);
        procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
        procedure ButtonSendClick(Sender: TObject);
        procedure EditChatKeyPress(Sender: TObject; var Key: Char);
        procedure FormCreate(Sender: TObject);
        procedure ClientSocketConnect(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure Exit1Click(Sender: TObject);
        procedure ConnectDisconnect1Click(Sender: TObject);
        procedure ClientSocketDisconnect(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure ChangeNickname1Click(Sender: TObject);
        procedure EditNickKeyPress(Sender: TObject; var Key: Char);
        procedure EditSayKeyPress(Sender: TObject; var Key: Char);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.ButtonConnectClick(Sender: TObject);
    begin
    ClientSocket.Host := EditIp.Text;
    ClientSocket.Port := StrToInt(EditPort.Text);
    ClientSocket.Active := True;
    end;procedure TForm1.ClientSocketRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
    read : string;
    begin
      read := socket.ReceiveText;
      memoChat.Lines.Add(read);
    end;procedure TForm1.ButtonSendClick(Sender: TObject);
    begin
    ClientSocket.Socket.SendText(EditNick.Text + ' says: ' + EditSay.Text);
    EditSay.Text := '';
    end;
    procedure TForm1.EditChatKeyPress(Sender: TObject; var Key: Char);
    begin
    Key := #0; //i dont want to change the nickname at runtime
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
    MemoChat.Clear;
    StatusBar.SimpleText := 'Status: Ready [Not connected].';
    EditNick.Text := 'Unnamed Soldier';
    end;procedure TForm1.ClientSocketConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
    StatusBar.SimpleText := 'Status: Connected with '+ClientSocket.Socket.RemoteHost;
    end;procedure TForm1.Exit1Click(Sender: TObject);
    begin
    Close;
    end;procedure TForm1.ConnectDisconnect1Click(Sender: TObject);
    begin
    ClientSocket.Active := not ClientSocket.Active;
    end;procedure TForm1.ClientSocketDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      StatusBar.SimpleText := 'Status: Disconnected.';
    end;procedure TForm1.ChangeNickname1Click(Sender: TObject);
    var
    old, new : string;
    begin
    InputQuery('New nick?', 'Please write the new nickname you want to use.', new);
    if new = '' then
      Exit;
    old := EditNick.Text;
    ClientSocket.Socket.SendText(old + ' just changed its nick to '+ new);
    EditNick.Text := New;
    end;procedure TForm1.EditNickKeyPress(Sender: TObject; var Key: Char);
    begin
    Key := #0;
    end;
    procedure TForm1.EditSayKeyPress(Sender: TObject; var Key: Char);
    begin
    if key = #13 then //#13 is Enter
      begin
      ButtonSend.Click;
      end;
    end;end.
      

  3.   

    Server端:
    unit UnitMain;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ScktComp, Menus, ComCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        MemoChat: TMemo;
        ServerSocket: TServerSocket;
        EditSay: TEdit;
        Label1: TLabel;
        MainMenu1: TMainMenu;
        N1: TMenuItem;
        Listen: TMenuItem;
        Exit1: TMenuItem;
        ButtonSend: TButton;
        StatusBar: TStatusBar;
        ChangeNickname1: TMenuItem;
        EditNick: TLabeledEdit;
        Button1: TButton;
        Label2: TLabel;
        procedure FormCreate(Sender: TObject);
        procedure ListenClick(Sender: TObject);
        procedure ServerSocketClientConnect(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure Exit1Click(Sender: TObject);
        function SendToAllClients( s : string) : boolean;
        procedure ServerSocketClientRead(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure ServerSocketClientDisconnect(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure ButtonSendClick(Sender: TObject);
        procedure EditNickKeyPress(Sender: TObject; var Key: Char);
        procedure ChangeNickname1Click(Sender: TObject);
        procedure EditSayKeyPress(Sender: TObject; var Key: Char);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}function TForm1.SendToAllClients( s : string) : boolean;
    var
    i : integer;
    begin
    if ServerSocket.Socket.ActiveConnections = 0 then
      begin
      ShowMessage('There are no connected clients.');
      Exit;
      end;
    for i := 0 to (ServerSocket.Socket.ActiveConnections - 1) do
      begin
      ServerSocket.Socket.Connections[i].SendText(s);
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
    MemoChat.Clear;
    EditNick.Text := 'Unnamed Soldier';
    end;procedure TForm1.ListenClick(Sender: TObject);
    var
      StrPort : string;
      IntPort : Integer;
    begin
    if not Listen.Checked then
    begin
    InputQuery('What port?', 'Please enter the port you want to listen. Make sure it''s a valid integer number between 1 and 65535.', StrPort);
    If StrPort = '' then Exit;
    if length(StrPort) > 6 then Exit;
    try
      IntPort := StrToInt(StrPort);
    except
      begin
      MessageBox(handle, 'Stupid you. What did I just tell you? You didn''t give me a valid port!!!', 'Duh!', Mb_ok + Mb_IconError);
      Exit;
      end;
    end;
    if (IntPort < 0) or (IntPort > 65535) then
      begin
      MessageBox(handle, 'Stupid you. What did I just tell you? You didn''t give me a valid port!!!', 'Duh!', Mb_ok + Mb_IconError);
      Exit;
      end;
    Listen.Checked := True;
    ServerSocket.Port := IntPort;
    ServerSocket.Active := True;
    StatusBar.SimpleText := 'Status: Listening on port '+StrPort;
    end
    else
      begin //if i am alredy connected
      Listen.Checked := False;
      ServerSocket.Active := False;
      StatusBar.SimpleText := 'Status: Ready [not listening].';
      end;end;procedure TForm1.ServerSocketClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      SendToAllClients('<'+Socket.RemoteHost+' just connected.>');
      MemoChat.Lines.Add('<'+Socket.RemoteHost+' just connected.>');
    end;
    procedure TForm1.Exit1Click(Sender: TObject);
    begin
    Close;
    end;procedure TForm1.ServerSocketClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      received : string;
    begin
      received := Socket.ReceiveText;
      SendToAllClients(received);
      MemoChat.Lines.Add(received);
    end;procedure TForm1.ServerSocketClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      SendToAllClients('<'+Socket.RemoteHost+' just disconnected.>');
      MemoChat.Lines.Add('<'+Socket.RemoteHost+' just disconnected.>');
    end;procedure TForm1.ButtonSendClick(Sender: TObject);
    begin
      SendToAllClients(EditNick.Text + ' [Server] says: ' + EditSay.Text);
      MemoChat.Lines.Add(EditNick.Text +' [Server] says: ' + EditSay.Text);
      EditSay.Text := '';
    end;procedure TForm1.EditNickKeyPress(Sender: TObject; var Key: Char);
    begin
    Key := #0; //because i dont want nobody to change its nickname until they press the change button
    end;procedure TForm1.ChangeNickname1Click(Sender: TObject);
    var
    old, new : string;
    begin
    InputQuery('New nick?', 'Please write the new nickname you want to use.', new);
    if new = '' then
      Exit;
    old := EditNick.Text;
    SendToAllClients('<'+Old + ' has just changed its nick to '+ new+'.>');
    MemoChat.Lines.Add('<'+Old + ' has just changed its nick to '+ new+'.>');
    EditNick.Text := New;
    end;
    procedure TForm1.EditSayKeyPress(Sender: TObject; var Key: Char);
    begin
    if Key = #13 then //#13 is Enter
      begin
      ButtonSend.Click;
      end;
    end;end.
      

  4.   

    感觉在网上找delphi的例子越来越少了。