Một Winsock Class vững chãi

Chia sẻ: Son Cung | Ngày: | Loại File: DOC | Số trang:4

0
203
lượt xem
73
download

Một Winsock Class vững chãi

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Tham khảo tài liệu 'một winsock class vững chãi', công nghệ thông tin, kỹ thuật lập trình phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả

Chủ đề:
Lưu

Nội dung Text: Một Winsock Class vững chãi

  1. Một Winsock Class vững chãi Vb6 cho ta Winsock Control để dùng cho việc giúp một program VB6 nói chuyện với  một program khác trên mạng TCP/IP. Ta có thể dùng Winsock Control trong một program để làm Winsock Server hay  Winsock Client. Sự khác biệt nầy rất nhỏ, mặc dầu ta phải lưu ý để phân biệt sự khác  nhau của hai trường hợp. Giả sử ta dùng Winsock Control làm Server trong một VB6  program để chạy trên một computer và dùng Winsock Control làm Client trong một  VB6 program để chạy trên một computer khác trên mạng TCP/IP. Ðể cho hai  programs nói chuyện (communicate) trước hết ta cần phải connect (nối) chúng lại với  nhau. Ta cho Winsock Server Listen (lắng nghe) qua một LocalPort (một cổng có mang  một con số, thí dụ như 101). Kế đó ta cho Winsock Client Connect (móc nối) qua  LocalPort đó ở địa chỉ TCP của Computer nơi ta chạy Winsock Server program. Sở dỉ  ta cần phải nói rõ LocalPort số mấy là vì Server Computer có thể Listen qua nhiều  LocalPorts cùng một lúc để nhiều Clients có thể Connect đến cùng một Computer  TCP address. Bên Winsock Server, giả dụ tên của Winsock control là myWinsock và myPortNo là  một con số thí dụ như 101, ta viết: myWinsock.LocalPort = myPortNo myWinsock.Listen Bên Winsock Client, giả dụ tên của Winsock control là myWinsock, myPortNo là một  con số dùng cho Winsock Server và TCPAddress là địa chỉ TCP của Server computer  (hay có thể là tên của Server Computer mà System đổi thành TCP address được) ta  viết: myWinsock.Connect TCPAddress, myPortNo Nếu mọi việc êm xuôi bên Client sẽ nhận được một Event ConnectionRequest với một  RequestID. Bên Client lập tức phải Accept RequestID đó như sau:  Private Sub myWinsock_ConnectionRequest(ByVal RequestID As Long) ' Pass the value of the requestID parameter to the Accept method. myWinsock.Accept RequestID End Sub Ðến đây thì Connection đã được thiết lập. Sau đó cả hai bên đều có thể tự do gởi  những Text messages cho nhau. Mỗi khi một bên gởi một Text message, đầu kia sẽ  nhận được một Event DataArrival và sẽ đọc message như sau: Private Sub myWinsock_DataArrival(ByVal bytesTotal As Long) Dim strData As String ' Read the incoming data myWinsock.GetData strData, vbString ' Process message .... ' ....
  2. End Sub Nếu chuyện đời chỉ đơn giản như vậy thôi thì không có gì phải nói thêm. Khổ nổi nếu  một trong hai program terminates (stop), đầu kia không biết chuyện ấy cho đến khi nó  vô tình gởi một message kế đó mới khám phá ra đối tượng đã cuốn gói sang ngang. Bây giờ làm sao nối lại duyên xưa? Giả sử Server stops trước, thì Client phải cố gắng  Connect nhiều lần mới hy vọng có kết quả. Ngược lại, nếu Client stops trước, dầu  Server có Listen thêm cũng không biết chừng nào nghe được vì nó phải Close cái  Connection rồi Listen trở lại mới được. Do đó ta có Class clsWinsock nầy.  Ðặc điểm của clsWinsock là nó có thể nối lại Connection bất cứ lúc nào, tức là hể khi  nào hai program cùng chạy là chúng nối nhau. Và hể khi một trong hai program stop  là bên kia biết ngay. Ðể đạt được các ưu điểm ấy ta làm các việc sau: 1. Khi có Connection, cứ mỗi chút xíu (1 hay 2 seconds) mỗi  program hỏi bên kia còn thức không. Nếu gặp Error thì là bên kia  đã stop. Nếu bên kia nghe được nó sẽ trả lời OK. Thật ra việc trả  lời không quan trọng lắm. Ðể làm việc nầy ta cần một Timer gọi là  WatchdogTimer hay DeadManTimer.  2. Khi biết đầu kia đã stop, thì bên nầy tìm cách nối lại. Nếu là  Server thì Listen, nếu là Client thì Connect, và mỗi lần tìm cách  nối lại (every 2 seconds) nhớ Close cái existing Connection. Ðể  làm việc nầy ta cần một Timer gọi là ReconnectTimer.  Trong thí dụ nầy bạn có một program chánh tên là WinsockTest.vbp. Bạn có thể sửa  một chút trong Sub Form_Load để dùng nó làm Server hay Client để test cho hai  programs nói chuyện với nhau. Listing của Sub Form_Load như sau: Private Sub Form_Load() Set Winsck = New clsWinsock ' There's no need to supply the TCP address ' The port number is arbitrary, but must be the same in both Server and Client, eg: 102 '-------- Use the next three lines for a server. Me.Caption = "Winsock Server" Text1.Text = "Greeting from Server" Call Winsck.MakeConnection(Winsock1, "", 102, True, Timer1, Timer2) '-------------------------------------------END for Server ' You must supply the TCP address of the Server, eg: "192.168.0.1" '-------- Use the next three lines for a client. ' Me.Caption = "Winsock Client" ' Text1.Text = "Hello Server, this is Client calling" ' Call Winsck.MakeConnection(Winsock1, "192.168.0.1", 102, False, Timer1, Timer2) '-------------------------------------------END for Client
  3. lblStatus.Caption = "No Connection" End Sub Hình của Form gồm có một Winsock Control và hai Timers như sau:  Vì một VB6 Class không có Controls và không thể nhận parameters lúc initialise nên  ta dùng một Public Sub MakeConnection để cung cấp cho clsWinsock các Controls  cần thiết như Winsock và Timers. Public Sub MakeConnection(theWinsock, theTCPAddress, PortNo, beingAServer, Timer1, Timer2) On Error Resume Next Set myWinsock = theWinsock Set DeadManTimer = Timer1 ' Use Timer1 as DeadManTimer DeadManTimer.Enabled = False ' Disable DeadManTimer initially DeadManTimer.Interval = 2000 ' 2 seconds Set ReConnectTimer = Timer2 ' Use Timer2 as ReConnectTimer ReConnectTimer.Enabled = False ' Disable ReConnectTimer initially ReConnectTimer.Interval = 2000 ' 2 seconds TCPAddress = theTCPAddress ' the address may also be the server computer name, i.e: "server01" myPortNo = PortNo ' same Port No. must be used for both server and client IamServer = beingAServer ' No Connection initially ConnectionEstablished = False ' Server listens , Client connects, both refreing to the same Port No. If IamServer Then myWinsock.LocalPort = myPortNo myWinsock.Listen Else myWinsock.Connect TCPAddress, myPortNo End If ' Schedule to reconnect ReConnectTimer.Enabled = True End Sub clsWinsock có thể raise ba Events là Connected, Disconnected và DataArrived  (Mess). Trong frmTestWinsock ta dùng các Events Connected và Disconnected để  update property Caption của Label nằm ở góc bên trái phía dưới để display "No 
  4. connection" hay "Connection established". Trong thực tế ta có thể dùng các Event nầy  để display một hình tròn nhỏ màu xanh lá cây hay màu đỏ, chẳng hạn. Parameter  Mess của Event DataArrived là incoming message mà ta cần xử lý. Có điểm bạn cần lưu ý là nhiều khi hai ba messages khác nhau nối thành một  message mà bạn nhận được. Do đó bạn cần phải có cách để tách chúng ra. Thí dụ  bạn nhận được một message gồm ba messages nhỏ đến liên tiếp như sau: Cardkey 1234 Valid entryCardkey 4356 ExitCardkey 6423 Invalid Cardkey Bạn có thể dùng Class clsString để ngắt khúc chúng dựa vào delimiter character 
Đồng bộ tài khoản