史萊姆論壇

返回   史萊姆論壇 > 專業主討論區 > 程式語言討論區
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


發文 回覆
 
主題工具 顯示模式
舊 2005-07-04, 09:50 PM   #1
不知道
長老會員
榮譽勳章
UID - 548
在線等級: 級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時
註冊日期: 2002-12-06
住址: 桃園
文章: 8606
現金: 1491 金幣
資產: 1183995 金幣
預設 用C++ Builder設計在網路玩猜數字遊戲

表單累容如下:
語法:
object Form1: TForm1
  Left = 267
  Top = 273
  Width = 226
  Height = 237
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object SpeedButton1: TSpeedButton
    Left = 8
    Top = 88
    Width = 81
    Height = 22
    Caption = '傳送'
    Flat = True
    OnClick = SpeedButton1Click
  end
  object SpeedButton2: TSpeedButton
    Left = 8
    Top = 120
    Width = 81
    Height = 25
    Caption = '放棄'
    Flat = True
    OnClick = SpeedButton2Click
  end
  object SpeedButton3: TSpeedButton
    Left = 8
    Top = 168
    Width = 81
    Height = 25
    Caption = '離開'
    Flat = True
    OnClick = SpeedButton3Click
  end
  object ToolBar1: TToolBar
    Left = 0
    Top = 0
    Width = 218
    Height = 29
    ButtonHeight = 21
    ButtonWidth = 31
    Caption = 'ToolBar1'
    Flat = True
    ShowCaptions = True
    TabOrder = 0
    object ToolButton1: TToolButton
      Left = 0
      Top = 0
      Caption = '連線'
      DropdownMenu = PopupMenu1
      ImageIndex = 0
    end
  end
  object Edit1: TEdit
    Left = 8
    Top = 40
    Width = 81
    Height = 40
    Font.Charset = CHINESEBIG5_CHARSET
    Font.Color = clWindowText
    Font.Height = -32
    Font.Name = 'Fixedsys'
    Font.Style = []
    MaxLength = 4
    ParentFont = False
    TabOrder = 1
  end
  object Memo1: TMemo
    Left = 96
    Top = 40
    Width = 113
    Height = 153
    TabOrder = 2
  end
  object ServerSocket1: TServerSocket
    Active = False
    Port = 1234
    ServerType = stNonBlocking
    OnClientConnect = ServerSocket1ClientConnect
    OnClientDisconnect = ServerSocket1ClientDisconnect
    OnClientRead = ServerSocket1ClientRead
    Left = 40
    Top = 104
  end
  object ClientSocket1: TClientSocket
    Active = False
    ClientType = ctNonBlocking
    Port = 1234
    OnConnect = ClientSocket1Connect
    OnDisconnect = ClientSocket1Disconnect
    OnRead = ClientSocket1Read
    Left = 72
    Top = 104
  end
  object PopupMenu1: TPopupMenu
    Left = 104
    Top = 104
    object N1: TMenuItem
      Caption = '等待連線'
      OnClick = N1Click
    end
    object N2: TMenuItem
      Caption = '加入連線'
      OnClick = N2Click
    end
  end
end
首先先討論如何利用Builder的TServerSocket與TClientSocket物件來透過網路傳輸資料
TServerSocket是屬於主機端的物件,也就是他是等待連結
TClientSocket則是屬於用戶端的物件,就是主動連結主機
接著有另外一項重要屬性就是Port,據書面資料說Port值可以任意,但必須大於1024,而兩台相連的電腦,Port值一定要一樣
使用時,其中一端必須當作主機(就是使用TServerSocket),等待TClientSocket的訊息,另一台電腦則使用TClientSocket發出訊息給主機

首先讓使用者選擇是要當主機(使用TServerSocket等待他人加入)呢?還是要加入其中一台主機(使用TClientSocket)
至於連接時您可以選擇使用IP(Address)或是輸入對方電腦名稱(Host)
本程式是兩個都放入,然後由使用者選擇要當Server會Client
若是當Server(選擇等待連結)則直接將ServerSocket1的Active屬性設為true,就可以等候Client的訊息了
語法:
void __fastcall TForm1::N1Click(TObject *Sender)
{
  ServerSocket1->Active=true;  
}
//---------------------------------------------------------------------------
若是當Client(選擇加入連結)則先輸入連結的電腦名稱,再將ClientSocket1的Active屬性設為true;
語法:
void __fastcall TForm1::N2Click(TObject *Sender)
{
  String sh;
  if(InputQuery("連線","輸入 電腦名稱: ",sh));
    if(sh.Length()>0)
    {
      ClientSocket1->Host=sh;
      ClientSocket1->Active=true;
    }
}
//---------------------------------------------------------------------------
當雙方都連線時,在Server端的TServerSocket會觸發OnClientConnect事件
語法:
void __fastcall TForm1::ServerSocket1ClientConnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
  Memo1->Lines->Add(Socket->RemoteHost+"上來!");
  ToolButton1->Enabled=false;
}
//---------------------------------------------------------------------------
而Client端也會觸發OnConnect事件
語法:
void __fastcall TForm1::ClientSocket1Connect(TObject *Sender,
      TCustomWinSocket *Socket)
{
  Memo1->Lines->Add("連到"+Socket->RemoteHost);
  ToolButton1->Enabled=false;
}
//---------------------------------------------------------------------------
接下來是傳送資料
在TServerSocket是以ServerSocket1->Socket->Connections[0]->SendText(Edit1->Text)方法傳送的
而TClientSocket則以ClientSocket1->Socket->SendText(Edit1->Text)傳送
所以傳送按鈕(SpeedButton1)的OnClick事件是:
語法:
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
  if(ServerSocket1->Active)
    ServerSocket1->Socket->Connections[0]->SendText(Edit1->Text);
  else
    ClientSocket1->Socket->SendText(Edit1->Text);
}
//---------------------------------------------------------------------------
在資料接收事件TServerSocket的觸發事件是OnClientRead
語法:
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
  Memo1->Lines->Add(Socket->ReceiveText());
}
//---------------------------------------------------------------------------
TClientSocket則為OnRead
語法:
void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
      TCustomWinSocket *Socket)
{
  Memo1->Lines->Add(Socket->ReceiveText());
}
//---------------------------------------------------------------------------
而離線按鈕(SpeedButton2)是將Active設為false,OnClick事件是:
語法:
void __fastcall TForm1::SpeedButton2Click(TObject *Sender)
{
  if(ServerSocket1->Active)
    ServerSocket1->Active=false;
  else
    ClientSocket1->Active=false;
  ToolButton1->Enabled=true;
}
//---------------------------------------------------------------------------
同樣的離線時TServerSocket與TClientSocket都會收到一個事件
TServerSocket的事件是OnClientDisconnect
語法:
void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
  Memo1->Lines->Add(Socket->RemoteHost+"離線");
  ToolButton1->Enabled=true;
}
//---------------------------------------------------------------------------
TClientSocket的事件是OnDisconnect
語法:
void __fastcall TForm1::ClientSocket1Disconnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
  Memo1->Lines->Add(Socket->RemoteHost+"離線");
  ToolButton1->Enabled=true;
}
//---------------------------------------------------------------------------
最後若離開時,將TServerSocket與TClientSocket關閉在離開
語法:
void __fastcall TForm1::SpeedButton3Click(TObject *Sender)
{
  ServerSocket1->Close();
  ClientSocket1->Close();
  Close();
}
//---------------------------------------------------------------------------
今天先介紹連線元件,下次在加入之前的程式碼

<敬請指教>
__________________
地獄變現記
[人身得來不易,願大家能尊重生命--勿傷胎命][好淫者請好自為之吧--割鳥]
南泉禪師道:
道不屬知,不屬不知。知是妄覺,不知是無記。若真達不疑之道,猶如太虛,廓然蕩豁,豈可強是非邪?」
德山宣鑒禪師:
「如果明白無事,則勿妄求,妄求而得,亦非得也。汝但無事於心,無心於事,則虛而靈,空而妙。若毛端許,言之本末者,皆為自欺。何故?毫氂繫念,三塗業因。瞥爾情生,萬劫羈鎖。聖名凡號,盡是虛聲。殊相劣形,皆是幻色。汝欲求之,得無累乎?」
不知道 目前離線  
送花文章: 5469, 收花文章: 5341 篇, 收花: 24549 次
回覆時引用此帖
舊 2005-07-05, 02:55 PM   #2 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9667小時 | 升級還需:130小時級別:96 | 在線時長:9667小時 | 升級還需:130小時級別:96 | 在線時長:9667小時 | 升級還需:130小時級別:96 | 在線時長:9667小時 | 升級還需:130小時級別:96 | 在線時長:9667小時 | 升級還需:130小時級別:96 | 在線時長:9667小時 | 升級還需:130小時
註冊日期: 2002-12-07
文章: 13250
精華: 0
現金: 26242 金幣
資產: 3024052 金幣
預設

可惜沒有安裝 Borland C++
不過還是謝謝您的教學解說及範例 ^^
mini 目前離線  
送花文章: 2000, 收花文章: 7958 篇, 收花: 26750 次
回覆時引用此帖
舊 2005-07-09, 11:03 PM   #3 (permalink)
長老會員
榮譽勳章
UID - 548
在線等級: 級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時
註冊日期: 2002-12-06
住址: 桃園
文章: 8606
現金: 1491 金幣
資產: 1183995 金幣
預設

語法:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
String num;
int n=0;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::N1Click(TObject *Sender)
{
  ServerSocket1->Active=true;  
}
//---------------------------------------------------------------------------

void __fastcall TForm1::N2Click(TObject *Sender)
{
  String sh;
  if(InputQuery("連線","輸入 電腦名稱: ",sh));
    if(sh.Length()>0)
    {
      ClientSocket1->Host=sh;
      ClientSocket1->Active=true;
    }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ServerSocket1ClientConnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
  Memo1->Lines->Add(Socket->RemoteHost+"上來了");
  ToolButton1->Enabled=false;
  while(1){
    InputQuery("輸入","輸入 您的數字(4位數): ",num);
    for(int i=1;i<=num.Length()-1;i++)
      for(int j=i+1;j<=num.Length();j++)
        if(num.SubString(i,1)==num.SubString(j,1)) {
          ShowMessage("數字不合,請重新輸入");
          num="";
        }
    if(num.Length()==4) break;
  }
  Memo1->Lines->Add("您的數字是"+num);
  Memo1->Lines->Add("您先猜");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClientSocket1Connect(TObject *Sender,
      TCustomWinSocket *Socket)
{
  Memo1->Lines->Add("已連到"+Socket->RemoteHost);
  ToolButton1->Enabled=false;
  while(1){
    InputQuery("輸入","輸入 您的數字(4位數): ",num);
    for(int i=1;i<=num.Length()-1;i++)
      for(int j=i+1;j<=num.Length();j++)
        if(num.SubString(i,1)==num.SubString(j,1)) {
          ShowMessage("數字不合,請重新輸入");
          num="";
        }
    if(num.Length()==4) break;
  }
  Memo1->Lines->Add("您的數字是"+num);
  SpeedButton1->Enabled=false;
  Edit1->Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
  if(ServerSocket1->Active)
    ServerSocket1->Socket->Connections[0]->SendText(Edit1->Text);
  else
    ClientSocket1->Socket->SendText(Edit1->Text);
  SpeedButton1->Enabled=false;
  Edit1->Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
  int an=0,bn=0;
  String s=Socket->ReceiveText();
  if(n==1){
    Memo1->Lines->Add(Socket->RemoteHost+" 猜: "+s);
    for(int i=1;i<=4;i++){
      if(s.SubString(i,1)==num.SubString(i,1)) an++;
      for(int j=1;j<=4;j++)
        if(s.SubString(i,1)==num.SubString(j,1)) if(i!=j)bn++;
    }
    if(an==4) {
      ServerSocket1->Socket->Connections[0]->SendText("4A");
      Memo1->Lines->Add(Socket->RemoteHost+" 猜對了...");
      SpeedButton1->Enabled=false;
      Edit1->Enabled=false;
    }else{
      ServerSocket1->Socket->Connections[0]->SendText(s+" => "+IntToStr(an)+"A"+IntToStr(bn)+"B");
      Edit1->Text="";
      Memo1->Lines->Add("換您猜... ");
      SpeedButton1->Enabled=true;
      Edit1->Enabled=true;
      n=0;
    }
  }else{
    Memo1->Lines->Add(s);
    n=1;
    if(s=="4A"){
      Memo1->Lines->Add("您猜對了");
      SpeedButton1->Enabled=false;
      Edit1->Enabled=false;
    }
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
      TCustomWinSocket *Socket)
{
  int an=0,bn=0;
  String s=Socket->ReceiveText();
  if(n==0){
    for(int i=1;i<=4;i++){
      if(s.SubString(i,1)==num.SubString(i,1)) an++;
      for(int j=1;j<=4;j++)
        if(s.SubString(i,1)==num.SubString(j,1)) if(i!=j)bn++;
    }
    Memo1->Lines->Add(Socket->RemoteHost+" 猜: "+s);
    if(an==4) {
      ClientSocket1->Socket->SendText("4A");
      Memo1->Lines->Add(Socket->RemoteHost+" 猜對了...");
      SpeedButton1->Enabled=false;
      Edit1->Enabled=false;
    }else{
      ClientSocket1->Socket->SendText(s+" => "+IntToStr(an)+"A"+IntToStr(bn)+"B");
      Edit1->Text="";
      Memo1->Lines->Add("換您猜... ");
      SpeedButton1->Enabled=true;
      Edit1->Enabled=true;
      n=1;
    }
  }else{
    Memo1->Lines->Add(s);
    n=0;
    if(s=="4A"){
      Memo1->Lines->Add("您猜對了");
      SpeedButton1->Enabled=false;
      Edit1->Enabled=false;
    }
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton2Click(TObject *Sender)
{
  if(ServerSocket1->Active)
    ServerSocket1->Active=false;
  else
    ClientSocket1->Active=false;
  ToolButton1->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
  Memo1->Lines->Add(Socket->RemoteHost+"離線");
  ToolButton1->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClientSocket1Disconnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
  Memo1->Lines->Add(Socket->RemoteHost+"離線");
  ToolButton1->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton3Click(TObject *Sender)
{
  ServerSocket1->Close();
  ClientSocket1->Close();
  Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
    for(int i=1;i<Edit1->Text.Length();i++)
        if(Edit1->Text.SubString(Edit1->Text.Length(),1)==Edit1->Text.SubString(i,1)){
            Edit1->Text=Edit1->Text.Delete(Edit1->Text.Length(),1);
            Edit1->SelStart=Edit1->Text.Length();
        }
}
//---------------------------------------------------------------------------
不知道 目前離線  
送花文章: 5469, 收花文章: 5341 篇, 收花: 24549 次
回覆時引用此帖
舊 2005-07-09, 11:04 PM   #4 (permalink)
長老會員
榮譽勳章
UID - 548
在線等級: 級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時
註冊日期: 2002-12-06
住址: 桃園
文章: 8606
現金: 1491 金幣
資產: 1183995 金幣
預設

語法:
object Form1: TForm1
  Left = 267
  Top = 273
  Width = 233
  Height = 237
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object SpeedButton1: TSpeedButton
    Left = 8
    Top = 88
    Width = 81
    Height = 22
    Caption = '傳送'
    Flat = True
    OnClick = SpeedButton1Click
  end
  object SpeedButton2: TSpeedButton
    Left = 8
    Top = 120
    Width = 81
    Height = 25
    Caption = '放棄'
    Flat = True
    OnClick = SpeedButton2Click
  end
  object SpeedButton3: TSpeedButton
    Left = 8
    Top = 168
    Width = 81
    Height = 25
    Caption = '離開'
    Flat = True
    OnClick = SpeedButton3Click
  end
  object ToolBar1: TToolBar
    Left = 0
    Top = 0
    Width = 225
    Height = 29
    ButtonHeight = 21
    ButtonWidth = 31
    Caption = 'ToolBar1'
    Flat = True
    ShowCaptions = True
    TabOrder = 0
    object ToolButton1: TToolButton
      Left = 0
      Top = 0
      Caption = '連線'
      DropdownMenu = PopupMenu1
      ImageIndex = 0
    end
  end
  object Edit1: TEdit
    Left = 8
    Top = 40
    Width = 81
    Height = 40
    Font.Charset = CHINESEBIG5_CHARSET
    Font.Color = clWindowText
    Font.Height = -32
    Font.Name = 'Fixedsys'
    Font.Style = []
    MaxLength = 4
    ParentFont = False
    TabOrder = 1
    OnChange = Edit1Change
  end
  object Memo1: TMemo
    Left = 96
    Top = 40
    Width = 121
    Height = 153
    TabOrder = 2
  end
  object ServerSocket1: TServerSocket
    Active = False
    Port = 1234
    ServerType = stNonBlocking
    OnClientConnect = ServerSocket1ClientConnect
    OnClientDisconnect = ServerSocket1ClientDisconnect
    OnClientRead = ServerSocket1ClientRead
    Left = 40
    Top = 104
  end
  object ClientSocket1: TClientSocket
    Active = False
    ClientType = ctNonBlocking
    Port = 1234
    OnConnect = ClientSocket1Connect
    OnDisconnect = ClientSocket1Disconnect
    OnRead = ClientSocket1Read
    Left = 72
    Top = 104
  end
  object PopupMenu1: TPopupMenu
    Left = 104
    Top = 104
    object N1: TMenuItem
      Caption = '等待連線'
      OnClick = N1Click
    end
    object N2: TMenuItem
      Caption = '加入連線'
      OnClick = N2Click
    end
  end
end
不知道 目前離線  
送花文章: 5469, 收花文章: 5341 篇, 收花: 24549 次
回覆時引用此帖
發文 回覆



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 07:50 PM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1