服务器端主要代码如下:
     unit uServerMain;
interface 
uses 
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
ScktComp, ToolWin, ComCtrls, ExtCtrls, StdCtrls, Buttons; 
const 
CMax=10; //客户端最大连接数 
type 
client_record=record 
CHandle: integer; //客户端套接字句柄 
CSocket:TCustomWinSocket; //客户端套接字
CName:string; //客户端计算机名称
CAddress:string; //客户端计算机IP地址
CUsed: boolean; //客户端联机标志
end; 
type 
TfrmServerMain = class(TForm)
ServerSocket: TServerSocket; 
ControlBar1: TControlBar; 
ToolBar1: TToolBar; 
tbConnect: TToolButton; 
tbClose: TToolButton; 
tbDisconnected: TToolButton;
Edit1: TEdit; 
Memo1: TMemo; 
StatusBar: TStatusBar;
Button1: TButton;
procedure tbConnectClick(Sender: TObject); 
procedure tbDisconnectedClick(Sender: TObject); 
procedure ServerSocketClientRead(Sender: TObject; 
Socket: TCustomWinSocket);
procedure ServerSocketListen(Sender: TObject;
Socket: TCustomWinSocket); 
procedure ServerSocketClientConnect(Sender: TObject; 
Socket: TCustomWinSocket); 
procedure ServerSocketClientDisconnect(Sender: TObject; 
Socket: TCustomWinSocket); 
procedure tbCloseClick(Sender: TObject); 
procedure FormCreate(Sender: TObject); 
procedure FormClose(Sender: TObject; var Action: TCloseAction); 
procedure ServerSocketGetSocket(Sender: TObject; Socket: Integer;
var ClientSocket: TServerClientWinSocket); 
procedure ServerSocketClientError(Sender: TObject; 
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; 
var ErrorCode: Integer);
    procedure Button1Click(Sender: TObject);{ Private declarations } 
public
{ Public declarations }
session: array[0..CMax] of client_record; //客户端连接数组 
Sessions: integer; //客户端连接数 
end; 
var 
frmServerMain: TfrmServerMain;implementation
{$R *.DFM} 
//打开套接字连接,并使套接字进入监听状态
procedure TfrmServerMain.tbConnectClick(Sender: TObject); 
begin 
ServerSocket.Open ;
end; 
//关闭套接字连接,不再监听客户端的请求 
procedure TfrmServerMain.tbDisconnectedClick(Sender: TObject); 
begin 
ServerSocket.Close;
StatusBar.Panels[0].Text :='服务器套接字连接已经关闭,无法接受客户端的连接请求.';
end; 
//从客户端读取信息
procedure TfrmServerMain.ServerSocketClientRead(Sender: TObject; 
Socket: TCustomWinSocket);
var
  i:integer;
begin
//将从客户端读取的信息添加到Memo1中Memo1.Lines.Add(Socket.ReceiveText);
for i:=0 to sessions do
begin
//取得匹配的客户端
if session[i].CHandle = Socket.SocketHandle then
begin
session[i].CSocket.SendText('回复客户端'+session[i].CAddress+' ==> '+Edit1.Text);
end;
end;
end;
//服务器端套接字进入监听状态,以便监听客户端的连接
procedure TfrmServerMain.ServerSocketListen(Sender: TObject; 
Socket: TCustomWinSocket); 
begin 
StatusBar.Panels[0].Text :='等待客户端连接...'; 
end; 
//当客户端连接到服务器端以后 
procedure TfrmServerMain.ServerSocketClientConnect(Sender: TObject; 
Socket: TCustomWinSocket); 
var
i,j:integer;
begin
j:=-1;
for i:=0 to sessions do
begin
//在原有的客户端连接数组中有中断的客户端连接
if not session[i].CUsed then
begin
session[i].CHandle := Socket.SocketHandle ;//客户端套接字句柄
session[i].CSocket := Socket; //客户端套接字
session[i].CName := Socket.RemoteHost ; //客户端计算机名称
session[i].CAddress := Socket.RemoteAddress ;//客户端计算机IP
session[i].CUsed := True; //连接数组当前位置已经占用
Break;
end;
j:=i;
end;
if j=sessions then
begin
inc(sessions);
session[j].CHandle := Socket.SocketHandle ;
session[j].CSocket := Socket;
session[j].CName := Socket.RemoteHost ;
session[j].CAddress := Socket.RemoteAddress ;
session[j].CUsed := True;
end;
StatusBar.Panels[0].Text := '客户端 '+Socket.RemoteHost + ' 已经连接';
end;
//当客户端断开连接时
procedure TfrmServerMain.ServerSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
var 
i:integer; 
begin 
for i:=0 to sessions do 
begin 
if session[i].CHandle =Socket.SocketHandle then 
begin 
session[i].CHandle :=0; 
session[i].CUsed := False;
Break; 
end; 
end; 
StatusBar.Panels[0].Text :='客户端 '+Socket.RemoteHost + ' 已经断开'; 
end; 
//关闭窗口 
procedure TfrmServerMain.tbCloseClick(Sender: TObject); 
begin 
Close;
end; 
procedure TfrmServerMain.FormCreate(Sender: TObject); 
begin 
sessions := 0; 
end; 
procedure TfrmServerMain.FormClose(Sender: TObject; 
var Action: TCloseAction); 
begin 
ServerSocket.Close ;
end; 
//当客户端正在与服务器端连接时
procedure TfrmServerMain.ServerSocketGetSocket(Sender: TObject; 
Socket: Integer; var ClientSocket: TServerClientWinSocket); 
begin 
StatusBar.Panels[0].Text :='客户端正在连接...';
end; 
//客户端发生错误 
procedure TfrmServerMain.ServerSocketClientError(Sender: TObject; 
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer); 
begin
StatusBar.Panels[0].Text :='客户端'+Socket.RemoteHost +'发生错误!';
ErrorCode := 0;
end;//向所有的客户端发送消息
procedure TfrmServerMain.Button1Click(Sender: TObject);
var
 Socket2: TCustomWinSocket;
  i,j:integer;
begin
  j:=-1;
 for i:=0 to sessions do
begin
//在原有的客户端连接数组中有中断的客户端连接
  if not session[i].CUsed then
  begin
    ServerSocket.Open ;
    session[i].CHandle := Socket2.SocketHandle ;//客户端套接字句柄
    session[i].CSocket := Socket2; //客户端套接字
     session[i].CName := Socket2.RemoteHost ; //客户端计算机名称
    session[i].CAddress := Socket2.RemoteAddress ;//客户端计算机IP
    session[i].CUsed := True; //连接数组当前位置已经占用
   Break;
  end;
  j:=i;
 end;
  if j=sessions then
  begin
  inc(sessions);
    session[j].CHandle := Socket2.SocketHandle ;
   session[j].CSocket := Socket2;
   session[j].CName := Socket2.RemoteHost;
  session[j].CAddress := Socket2.RemoteAddress ;
   session[j].CUsed := True;
   session[j].CSocket.SendText('回复客户端'+session[j].CAddress+' ==> '+Edit1.Text);
end;
end;end.

解决方案 »

  1.   

    ERROR 是什麼你不講, 只貼出一大堆code 何用?
    先將error/exception code 貼上才對, code 其次.
      

  2.   

    就是最下面的那个按钮事件啊,我想统一给在线的客户端发送消息,可是不知道该怎么做?我尝试了一下重新初始化,可是报Access异常
      

  3.   

    請你將需求, 和出現的error, 詳細點講, 不要每次都只帶一句, 而每次都不同的一句.
    這樣誰會知你想做什麼呢?
    一下子說有exception, 是發消息時, 一下說初始報except, 詳細講可以嗎?
      

  4.   

    花了點時間看了一下
    當你想對所有的client 送message 時, 要知道, 當時client 的線不一定還是通的
    所以當你為每一個client送message 時, 一定要catch except,
    遇到有exception 的就認定client 已斷線, 就往下一個client 發送吧.
    直到loop 完成.
      

  5.   

    再次感谢LordaeronLou,怪我没有说明白,项目流程是这样子的,
    客户端登陆--->与服务器连接--->服务器有消息更新--->判断客户端是否在线---->向在线的客户端更新消息
    ---->客户端退出时,关闭此连接.
    我是在发消息取地址出现的问题,不知道如何去取与服务器还保持连接的客户端地址.
      

  6.   

    你如果要對socket 取它的ip, 哪是無意義的事, 因為該socket id 存在, 不代表連線依然存在.
    要知道連線是否依然存在, 只要向該socket id send message 才會知道.
    所以你要照我前面說的:
    所以當你為每一個client送message   時,   一定要catch   except,
    遇到有exception   的就認定client   已斷線,   就往下一個client   發送
      

  7.   

    好的,谢谢,可以大概写一段发送消息的try...catch吗?在线等,立即结贴
      

  8.   

    你就try catch 就對了