線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2346
推到 Plurk!
推到 Facebook!

ServerSocket 和ClientSocket 傳,收訊息的問題

答題得分者是:andychang1690
a126154362
一般會員


發表:21
回覆:13
積分:6
註冊:2004-05-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-01 22:27:03 IP:61.70.xxx.xxx 未訂閱
各位大大好   小弟寫了一個有登入和註冊功能的聊天室 再傳輸和接收訊息上有一點問題    就是我要按一個Button用三個ClientSocket傳三個訊息給Server端 可是為什麼我要按三次才能完成這些動作    P.S.粗體部分是我程式傳輸和接收有問題的片段(我個人認為的)    以下是我的程式 **************************Server端*************************** //-------------------------------------------------------------------- ////////////////////////(Unit1.h)///////////////////////////// #include  #include "jpeg.hpp" #pragma hdrstop #include "Unit1.h" //-------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TServer *Server; int i=0,j=0; AnsiString id,pw,login=12; //-------------------------------------------------------------------- __fastcall TServer::TServer(TComponent* Owner) : TForm(Owner) { Image1->Picture->LoadFromFile("bird002.jpg"); RichEdit1->Clear(); } //-------------------------------------------------------------------- void __fastcall TServer::Button1Click(TObject *Sender) { ServerSocket->Active = true ; ServerSocket1->Active = true ; ServerSocket2->Active = true ; ServerSocket3->Active = true ; ServerSocket4->Active = true ; ServerSocket5->Active = true ; ServerSocket6->Active = true ; ServerSocket7->Active = true ; StatusBar1->SimpleText = "Listening ..." ; Button1->Enabled = false ; Button2->Enabled = true ; } //-------------------------------------------------------------------- void __fastcall TServer::Button2Click(TObject *Sender) { AnsiString buf; int j; for(j=0;jSocket->Connections[j]->RemoteAddress "\tDisconnected."; RichEdit1->Lines->Add(buf); } ServerSocket->Active = false ; ServerSocket1->Active = false ; ServerSocket2->Active = false ; ServerSocket3->Active = false ; ServerSocket4->Active = false ; ServerSocket5->Active = false ; ServerSocket6->Active = false ; ServerSocket7->Active = true ; Button1->Enabled = true ; Button2->Enabled = false ; i=0; StatusBar1->SimpleText = IntToStr(i) " Client Connected...."; } //-------------------------------------------------------------------- void __fastcall TServer::ServerSocketClientConnect(TObject *Sender, TCustomWinSocket *Socket) { AnsiString buf; //Client與Server連線上所要做的事情 //將Server收到連線需求的Log Post一份在Memo上 buf = DateTimeToStr(Now()); buf = " " Socket->RemoteAddress "\tConnected."; RichEdit1->Lines->Add(buf); i ; StatusBar1->SimpleText = "Connected from: " Socket->RemoteAddress ; Sleep(1000); StatusBar1->SimpleText = IntToStr(i) " Client Connected...."; } //-------------------------------------------------------------------- void __fastcall TServer::ServerSocketClientDisconnect(TObject *Sender, TCustomWinSocket *Socket) { AnsiString buf; //Client與Server斷線時所要做的動作 buf = DateTimeToStr(Now()); buf = " " Socket->RemoteAddress "\tDisconnected."; RichEdit1->Lines->Add(buf); i--; StatusBar1->SimpleText = "Disconnected from: " Socket->RemoteAddress ; Sleep(1000); StatusBar1->SimpleText = IntToStr(i) " Client Connected...."; } //-------------------------------------------------------------------- void __fastcall TServer::ServerSocketClientError(TObject *Sender, TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode) { StatusBar1->SimpleText = "Error from Client socket."; } //-------------------------------------------------------------------- void __fastcall TServer::ServerSocketClientRead(TObject *Sender, TCustomWinSocket *Socket) { AnsiString text; int j; StatusBar1->SimpleText = "Message from: " Socket->RemoteAddress; text = Socket->ReceiveText() ; for(j=0;jSocket->Connections[j]->SendText(text); } } //-------------------------------------------------------------------- void __fastcall TServer::ServerSocketListen(TObject *Sender, TCustomWinSocket *Socket) { StatusBar1->SimpleText = "Server Listen" ; } //-------------------------------------------------------------------- void __fastcall TServer::ServerSocket1ClientConnect(TObject *Sender, TCustomWinSocket *Socket) { TMemoryStream *msFile=new TMemoryStream; msFile->LoadFromFile("bird002.jpg"); MYPACK mp; int j=0,k; int block=(msFile->Size%MAX_DATASIZE==0)? msFile->Size/MAX_DATASIZE: msFile->Size/MAX_DATASIZE 1; for(j=0; jSize; mp.dwThisDataSize=((j 1)*MAX_DATASIZE>msFile->Size)? msFile->Size-j*MAX_DATASIZE: MAX_DATASIZE; msFile->Position=j*MAX_DATASIZE; msFile->Read(mp.pbThisData, mp.dwThisDataSize); ServerSocket1->Socket->Connections[i-1]->SendBuf(&mp, sizeof(MYPACK)); Sleep(10); } delete msFile; } //-------------------------------------------------------------------- void __fastcall TServer::ServerSocket2ClientRead(TObject *Sender, TCustomWinSocket *Socket) { AnsiString ClientName; int k; ClientName = Socket->ReceiveText() ; for(k=0;kSocket->Connections[k]->SendText(ClientName) ;; } } //-------------------------------------------------------------------- void __fastcall TServer::ServerSocket4ClientRead(TObject *Sender, TCustomWinSocket *Socket) { pw = Socket->ReceiveText(); } //-------------------------------------------------------------------- void __fastcall TServer::ServerSocket3ClientRead(TObject *Sender, TCustomWinSocket *Socket) { id = Socket->ReceiveText(); } //-------------------------------------------------------------------- void __fastcall TServer::ServerSocket5ClientRead(TObject *Sender, TCustomWinSocket *Socket) { AnsiString test; login=12; login = Socket->ReceiveText(); if(login==0) { ADOQuery1->Close(); ADOQuery1->SQL->Clear(); ADOQuery1->Parameters->CreateParameter("checkID",ftString,pdInput,30,id); ADOQuery1->Parameters->CreateParameter("checkPassword",ftString,pdInput,30,pw); ADOQuery1->SQL->Add("Select * From 資料表1 Where ID=:checkID and Password=:checkPassword"); ADOQuery1->Open(); if(ADOQuery1->RecordCount==1) { test="登入成功"; ServerSocket7->Socket->Connections[j-1]->SendText(test); ServerSocket6->Socket->Connections[j-1]->SendText(test); } else { test="登入失敗"; ServerSocket7->Socket->Connections[j-1]->SendText(test); ServerSocket6->Socket->Connections[j-1]->SendText(test); } } else if(login == 1) { ADOQuery1->Close(); ADOQuery1->SQL->Clear(); ADOQuery1->Parameters->CreateParameter("checkID",ftString,pdInput,30,id); ADOQuery1->Parameters->CreateParameter("checkPassword",ftString,pdInput,30,pw); ADOQuery1->SQL->Add("Select * From 資料表1 Where ID=:checkID"); ADOQuery1->Open(); if(ADOQuery1->RecordCount==1) { test="此帳號有人使用"; ServerSocket7->Socket->Connections[j-1]->SendText(test); ServerSocket6->Socket->Connections[j-1]->SendText(test); } else { ADOQuery1->Close(); ADOQuery1->SQL->Clear(); ADOQuery1->Parameters->CreateParameter("checkID",ftString,pdInput,30,id); ADOQuery1->Parameters->CreateParameter("checkPassword",ftString,pdInput,30,pw); ADOQuery1->SQL->Add("Insert Into 資料表1 Values(:checkID,:checkPassword)"); ADOQuery1->ExecSQL(); test="此帳號註冊成功"; ServerSocket7->Socket->Connections[j-1]->SendText(test); ServerSocket6->Socket->Connections[j-1]->SendText(test); } } else { test="無登入和註冊(遊客)"; ServerSocket7->Socket->Connections[j-1]->SendText(test); ServerSocket6->Socket->Connections[j-1]->SendText(test); } } //-------------------------------------------------------------------- void __fastcall TServer::ServerSocket5ClientConnect(TObject *Sender, TCustomWinSocket *Socket) { j=j 1; } //-------------------------------------------------------------------- void __fastcall TServer::ServerSocket5ClientDisconnect(TObject *Sender, TCustomWinSocket *Socket) { j=j-1; } //-------------------------------------------------------------------- **************************Client端***************************** //-------------------------------------------------------------------- #include #include #pragma hdrstop #include "Unit1.h" #include "Unit2.h" TMemoryStream *gmsFile=NULL; //-------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; int i=0; //-------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { gmsFile=new TMemoryStream; RichEdit1->Clear(); Label4->Caption=""; } //-------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString status; if(Edit2->Text != "") { ClientSocket->Host = Edit2->Text; ClientSocket1->Host = Edit2->Text; ClientSocket2->Host = Edit2->Text; ClientSocket3->Host = Edit2->Text; if (Button1->Caption == "Connect") { ClientSocket3->Active = true ; Form2->ShowModal(); status = ClientSocket3->Socket->ReceiveText(); Label4->Caption = status; ClientSocket3->Active = false ; try { ClientSocket->Active = true ; ClientSocket1->Active = true ; ClientSocket2->Active = true ; StatusBar1->SimpleText = "Connecting ..." ; } __finally { Button1->Caption = "Disconnect" ; } } else { ClientSocket->Active = false ; ClientSocket1->Active = false ; ClientSocket2->Active = false ; Label4->Caption = ""; Edit2->Text=""; StatusBar1->SimpleText = "Disconnect" ; Button1->Caption = "Connect" ; } } else ShowMessage("請輸入伺服器IP"); } //-------------------------------------------------------------------- void __fastcall TForm1::txtSendKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { if (StrToInt(Key) == 13 ) { if(txtSend->Text == "" && Edit1->Text == "") { ShowMessage("請輸入傳輸文字及使用者名稱"); } else if(txtSend->Text == "") { ShowMessage("請輸入傳輸文字"); } else if(Edit1->Text == "") { ShowMessage("請輸入使用者名稱"); txtSend->Text = ""; } else { AnsiString buf,ClientName; ClientName = Edit1->Text; ClientSocket2->Socket->SendText(ClientName); buf = Edit1->Text "-->" txtSend->Text; ClientSocket->Socket->SendText(buf); txtSend->Text = ""; } } } //-------------------------------------------------------------------- void __fastcall TForm1::ClientSocketConnect(TObject *Sender, TCustomWinSocket *Socket) { StatusBar1->SimpleText = "Connected to: " Socket->RemoteHost; } //-------------------------------------------------------------------- void __fastcall TForm1::ClientSocketConnecting(TObject *Sender, TCustomWinSocket *Socket) { StatusBar1->SimpleText = "Connecting to: " Socket->RemoteHost; } //-------------------------------------------------------------------- void __fastcall TForm1::ClientSocketDisconnect(TObject *Sender, TCustomWinSocket *Socket) { StatusBar1->SimpleText = "Disconnect from: " Socket->RemoteHost; Button1->Caption = "Connect" ; } //-------------------------------------------------------------------- void __fastcall TForm1::ClientSocketError(TObject *Sender, TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode) { StatusBar1->SimpleText = "Socket Error" ; Button1->Caption = "Connect" ; } //-------------------------------------------------------------------- void __fastcall TForm1::ClientSocketRead(TObject *Sender, TCustomWinSocket *Socket) { AnsiString Retext,ReUserName; ReUserName = ClientSocket2->Socket->ReceiveText(); if(ReUserName == Edit1->Text) { RichEdit1->SelAttributes->Color = clRed; } Retext = ClientSocket->Socket->ReceiveText(); RichEdit1->Lines->Add(Retext); RichEdit1->SelAttributes->Color = clGreen; } //-------------------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { if(gmsFile) delete gmsFile; } //-------------------------------------------------------------------- void __fastcall TForm1::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket) { MYPACK mp; lstrcpy(mp.szFileName,"bird002.jpg"); Socket->ReceiveBuf(&mp, sizeof(MYPACK)); AnsiString sz=(AnsiString)mp.szHeader; if(sz.SubString(1, 4)=="FILE") { if(sz=="FILE-START") { gmsFile->Size=mp.dwTotalDataSize; gmsFile->Position=0; } gmsFile->Write(mp.pbThisData, mp.dwThisDataSize); if(sz=="FILE-END") { gmsFile->Position=0; gmsFile->SaveToFile(mp.szFileName); gmsFile->Clear(); Image1->Picture->LoadFromFile("bird002.jpg"); } } } //-------------------------------------------------------------------- void __fastcall TForm1::ClientSocket3Read(TObject *Sender, TCustomWinSocket *Socket) { ; } //-------------------------------------------------------------------- /////////////////////////////(Unit2.h)////////////////////////// //-------------------------------------------------------------------- #include #pragma hdrstop #include "Unit2.h" #include "Unit1.h" //-------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm2 *Form2; AnsiString test=""; //-------------------------------------------------------------------- __fastcall TForm2::TForm2(TComponent* Owner) : TForm(Owner) { } //-------------------------------------------------------------------- void __fastcall TForm2::Button1Click(TObject *Sender) { AnsiString buf,buf1,in; ClientSocket1->Host = Form1->Edit2->Text; ClientSocket2->Host = Form1->Edit2->Text; ClientSocket3->Host = Form1->Edit2->Text; ClientSocket4->Host = Form1->Edit2->Text; ClientSocket1->Active = true; ClientSocket2->Active = true; ClientSocket3->Active = true; ClientSocket4->Active = true; in = 0; buf=Edit1->Text; buf1=Edit2->Text; ClientSocket1->Socket->SendText(buf); ClientSocket2->Socket->SendText(buf1); ClientSocket3->Socket->SendText(in); test=ClientSocket4->Socket->ReceiveText(); //Label3->Caption=test; if(test!="") { Edit1->Text=""; Edit2->Text=""; ClientSocket1->Active = false; ClientSocket2->Active = false; ClientSocket3->Active = false; ClientSocket4->Active = false; Form2->Close(); } } //-------------------------------------------------------------------- void __fastcall TForm2::Button2Click(TObject *Sender) { AnsiString buf,buf1,in; ClientSocket1->Host = Form1->Edit2->Text; ClientSocket2->Host = Form1->Edit2->Text; ClientSocket3->Host = Form1->Edit2->Text; ClientSocket4->Host = Form1->Edit2->Text; ClientSocket1->Active = true; ClientSocket2->Active = true; ClientSocket3->Active = true; ClientSocket4->Active = true; in = 1; buf=Edit1->Text; buf1=Edit2->Text; ClientSocket1->Socket->SendText(buf); ClientSocket2->Socket->SendText(buf1); ClientSocket3->Socket->SendText(in); test=ClientSocket4->Socket->ReceiveText(); //Label3->Caption=test; if(test!="") { Edit1->Text=""; Edit2->Text=""; ClientSocket1->Active = false; ClientSocket2->Active = false; ClientSocket3->Active = false; ClientSocket4->Active = false; Form2->Close(); } } //-------------------------------------------------------------------- void __fastcall TForm2::Button3Click(TObject *Sender) { AnsiString in; ClientSocket3->Host = Form1->Edit2->Text; ClientSocket4->Host = Form1->Edit2->Text; ClientSocket3->Active = true; ClientSocket4->Active = true; in = 2; ClientSocket3->Socket->SendText(in); test=ClientSocket4->Socket->ReceiveText(); //Label3->Caption=test; if(test!="") { Edit1->Text=""; Edit2->Text=""; ClientSocket3->Active = false; ClientSocket4->Active = false; Form2->Close(); } } //-------------------------------------------------------------------- void __fastcall TForm2::ClientSocket4Read(TObject *Sender, TCustomWinSocket *Socket) { //test=Socket->ReceiveText(); //Label3->Caption=test; } //--------------------------------------------------------------------
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-08 19:23:47 IP:61.230.xxx.xxx 未訂閱
ServerSocket用一個就好了,不需要用到8個,ClientSocket端也只要用一個就好. 一個Server可以服務好幾個Client(好幾台電腦),你先用一個ServerSocket試看看,先處理1個Client的登錄,傳輸,一個通,再來處理多個應沒問題.
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-09 02:07:06 IP:221.169.xxx.xxx 未訂閱
a126154362:我想跟你分享一下我的經驗,我曾經使用
ServerSocket及ClientSocket寫過賭博輪盤網站,先說Client段
不是使用鍵盤而是使用電話(一台電腦接四部電話)下注,更要命的是
百分之八十的電腦是撥接(使用Modem)語音卡還要不停的回應語音,
顯示器還要不停處理下注資訊及開盤等等。一部電話要送出的資訊很多
電腦編號、電話編號、金額、顏色、各種查詢等等,我一次就要最快送出資料
到Server上處理我把所有資料以自定義方式處理如
WebString="GET /input.xxxpcname?" PcName "&pchdd?" VOL_SerialNo
 "&cardno?" gSLICEnv.pLines[Voc_Point].CardNo
 "&money?" gSLICEnv.pLines[Voc_Point].Money
 "&color?" gSLICEnv.pLines[Voc_Point].Color
 "&cancel?" gSLICEnv.pLines[Voc_Point].Cancel_ "&a?1 HTTP/1.1";
送到Server時ServerSocket再去分解處理!
連送訊號我都是使用Timer1Timer處理介由ClientSocket的事件來判斷是否
送出OK!重送幾次失敗後語音告之電腦忙線請重新輸入。等
void __fastcall TForm1::ClientSocket1Connect(TObject *Sender,
      TCustomWinSocket *Socket)
// ClientSocket1->Socket->SendText(WebString); // 送資料
void __fastcall TForm1::ClientSocket1Error(TObject *Sender,
      TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
// 連線失敗處理於此
void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
      TCustomWinSocket *Socket)
// 接收處理ServerSocket傳回資料
void __fastcall TForm1::ClientSocket1Disconnect(TObject *Sender,
      TCustomWinSocket *Socket)
// 若至此離線或網站可能未開(交ErrorCode判斷)
ServerSocket段
void __fastcall TForm1::
ServerSocket1Accept(TObject *Sender,
   TCustomWinSocket *Socket)
{
  Sleep(300); // 有連線先暫停一下下
  // 我使用多執行緒來處理
  new TWebThread(Socket, 參數,參數,參數);
}
__fastcall TWebThread::
TWebThread(TCustomWinSocket* socket,
  參數,參數,參數) : TThread(false)
{
  if (socket->Connected)
    FSocket = socket;
}
void __fastcall TWebThread::Execute(void)
{
  FreeOnTerminate = true;
  if (!Terminated && FSocket->Connected) {
    char smsg[1024];
    int rBytes;
    try {
      TWinSocketStream* FSocketStream=new TWinSocketStream(FSocket, 20000);
      try {
// 下面為讀入ClientSocket資料
        if (FSocketStream->WaitForData(20000)) {
          ZeroMemory(smsg, 1024);
          if (FSocket->Connected) {
            rBytes=FSocketStream->Read(smsg, 1024);
            FReceiveText = AnsiString(smsg);
            if (rBytes > 20) {
              try  {
                Synchronize(AnalyzeGET); // AnalyzeGET();
              }
              catch (...) {
                ;
              }
            }
            else
              if (FSocket->Connected)
                FSocket->Close();
          }
        }
      }
      __finally {
        delete FSocketStream;
      }
    }
    catch (...) {
      ;
    }
    delete[] smsg;
  }
  if (FSocket->Connected)
    FSocket->Close();
  Terminate();
}
// 送資料回Client
SendBuf(msg.c_str(), msg.Length());
int __fastcall TWebThread::
SendBuf(char* Buf, int Count)
{
  int result = 0;
  if (FSocket->Connected) {
    FSocket->Lock();
    try {
      result = send(FSocket->SocketHandle, Buf, Count, 0);
      if (result == SOCKET_ERROR) {
        int ErrorCode = WSAGetLastError();
        if (ErrorCode != WSAEWOULDBLOCK) {
          FSocket->Disconnect(FSocket->SocketHandle);
        Terminate();
        }
      }
    }
    __finally {
      FSocket->Unlock();
    }
  }
  return result;
}
以上是我的經驗談,而且我還可以告訴你這程式的Table全部是.DBF
運作正常!
請參考!    
Andy Chang
------
Andy Chang
系統時間:2024-05-19 3:58:15
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!