⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 servermain.~pas

📁 Winsock通信程序源码 用Delphi和Win API写的winsock通信程序
💻 ~PAS
字号:
unit ServerMain;

interface

uses
  Windows, Messages, WinSock, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ImgList, ToolWin, XPMan, Menus, ExtCtrls;


const
   WM_WORK1_ACCEPT = WM_USER + 12;
   WM_WORK1_READ = WM_USER + 13;

type
  TForm1 = class(TForm)
    StatusBar1: TStatusBar;
    ToolBar1: TToolBar;
    ToolButton1: TToolButton;
    ToolButton2: TToolButton;
    ToolButton3: TToolButton;
    ImageList1: TImageList;
    XPManifest1: TXPManifest;
    PopupMenu1: TPopupMenu;
    N8: TMenuItem;
    Panel1: TPanel;
    ListBox1: TListBox;
    Memo1: TMemo;
    Splitter1: TSplitter;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ToolButton3Click(Sender: TObject);
    procedure ToolButton1Click(Sender: TObject);
    procedure N8Click(Sender: TObject);
  private
    { Private declarations }
    procedure InitSocket;
    procedure OnWork1Accept(Var message: TMessage); message WM_WORK1_ACCEPT;
    procedure OnWork1Read(Var message: TMessage); message WM_WORK1_READ;
  public
    { Public declarations }
  end;

  TCarCache = Record
      Pzh: String[10];
      Cz: String[20];
      Zs: Integer;
  end;


var
  Form1: TForm1;
  Server_Socket : Integer;    //服务器Socket号码
  Conn_Socket : Integer;    //连接后Socket号码

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
    //初始化
    InitSocket;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
    //释放WInSOck
    WSACleanup();
end;

procedure TForm1.OnWork1Accept(var message: TMessage);
Var
    Client_Addr: TSockAddr;
    ClientLen: Integer;
begin
    FillChar(Client_Addr,Sizeof(Client_Addr),0);
    ClientLen := Sizeof(Client_Addr);
    Conn_Socket := Accept(Server_Socket,@Client_Addr,@ClientLen);
    StatusBar1.Panels[1].Text := '已连接';
    ToolButton1.Enabled := true;
    ToolButton3.Enabled := true;
    //读取/关闭 事件
    WSAAsyncSelect(Conn_Socket, Form1.Handle, WM_WORK1_READ, FD_READ or FD_CLOSE);
end;                                                                                  

procedure TForm1.OnWork1Read(var message: TMessage);
Var
    Buff: String[100];
    RET: Integer;
begin
    CASE WSAGETSELECTEVENT(message.lParam) OF
        FD_READ:
        begin
            Ret := Recv(Conn_Socket,Buff,Sizeof(Buff),0);
            if Ret = SOCKET_ERROR then
            begin
                showmessage('Read Error!');
            end
            else if Ret > 0 then //接收
            begin
                ListBox1.Items.Add(Buff);
                //返回
                Send(Conn_Socket,Buff,Sizeof(Buff),0);
            end; 
        end;
        FD_CLOSE:
        begin
            StatusBar1.Panels[1].Text := '已断开';
            ToolButton1.Enabled := false;
            ToolButton3.Enabled := false;
        end;
    end;
end;

procedure TForm1.ToolButton3Click(Sender: TObject);
var
    Buff: String[100];
    i: Integer;
begin
    for i := 0 to Memo1.Lines.Count - 1 do
    begin
        Buff := Memo1.Lines[i];
        Send(Conn_socket,Buff,sizeof(Buff),0);
    end;
    Memo1.Clear;
end;

procedure TForm1.ToolButton1Click(Sender: TObject);
begin
    CloseSocket(Conn_socket);
    StatusBar1.Panels[1].Text := '已断开';
    ToolButton1.Enabled := false;
    ToolButton3.Enabled := false;
end;

procedure TForm1.N8Click(Sender: TObject);
begin
    ListBox1.Clear;
end;

procedure TForm1.InitSocket;
Var
    XL_WSADATA:TWSADATA;
    Sa: SockAddr_In;
    RET:Integer;
begin
    //初始化WinSock库
    RET:=WSASTARTUP(MakeWord(2,2),XL_WSADATA);
    IF RET=0 THEN
    begin
        //建立Sock
        Server_Socket:=Socket(PF_INET,SOCK_STREAM,0);
        IF Server_SOCKET=INVALID_SOCKET THEN
        begin
            Application.MessageBox('SOCKET创建失败','注意',mb_ok)
        end;
        //邦定
        Sa.sin_family := PF_INET;
        Sa.sin_port := Htons(8080);
        Sa.sin_addr.s_addr := INADDR_ANY;
        RET := Bind(Server_Socket,Sa,sizeof(Sa));
        IF RET = SOCKET_ERROR then
        begin
            Application.MessageBox('SOCKET邦定失败!','注意',mb_ok)
        end;
        //监听
        Ret := Listen(Server_Socket,1);
        if Ret <> 0 then
        begin
            Application.MessageBox('监听失败!','错误信息',MB_OK);
            Exit;
        end;
        //连接事件
        WSAAsyncSelect(Server_Socket,Form1.Handle,WM_WORK1_ACCEPT,FD_ACCEPT);
    end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -