Multithreaded Winsock Vb6
Số trang: 9
Loại file: pdf
Dung lượng: 202.90 KB
Lượt xem: 1
Lượt tải: 0
Xem trước 2 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Multithreaded WinsockVb6 cho ta Winsock Control để 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...
Nội dung trích xuất từ tài liệu:
Multithreaded Winsock Vb6 Multithreaded WinsockVb6 cho ta Winsock Control để giúp một program VB6 nói chuyện với mộtprogram khác trên mạng TCP/IP.Ta có thể dùng Winsock Control trong một program để làm Winsock Server hayWinsock 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 trongmột VB6 program để chạy trên một computer và dùng Winsock Control làmClient trong một VB6 program để chạy trên một computer khác trên mạngTCP/IP. Ðể cho hai programs nói chuyện (communicate) trước hết ta cần phảiconnect (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ư 9123). Kế đó ta cho Winsock Client Connect (mócnối) qua LocalPort đó ở địa chỉ TCP của Computer nơi ta chạy Winsock Serverprogram. 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 đếncùng một Computer TCP address. (Nếu bạn còn mới đối với TCP/IP hãy đọc bàiCăn bản TCP/IP )Class ServerWinsock và Class ClientWinsockTrong .NET, Winsock được thay thế bằng TcpListener và TcpClient củaSystem.Net.Sockets. Để dùng chúng ta chỉ cần Project | Add Reference..cái System.dll và thêm câu:Imports System.Net.Sockets for TcpClient and TcpServerở đầu phần code.Khi instantiate một TcpListener object, ta cho nó một PortNo để nó lắng nghequa cổng đó như sau:Dim oListener As TcpListener Variable for TcpListener Instantiate a TcpListener on given PortNooListener = New TcpListener(PortNo)oListener.Start() Start the TcpListenerVề phía Client, ta gọi method Connect của TcpClient với tên củadestination/server computer (hay TCP address của computer ấy) và cái cổng trêndestination/server computer. Ta code như sau:Dim Client As TcpClient Variable for the Client TCP socket Instantiate TCPClient objectClient = New TcpClient() Attempt to connect to destination (server) computer on given portnumberClient.Connect(DestinationComputer, TCPIPPortNo)Bên TcpListener sẽ dùng một Socket để Accept (nhận) cái Request (thỉnh cầu)của TcpClient: Accept request from the TcpClientDim oSocket As SocketoSocket = oListener.AcceptSocketKhi TcpListener AcceptSocket rồi thì hai bên TcpClient và TcpListener có thể gởithông điệp qua lại cho đến khi một bên terminates (stop).Dưới đây là hình minh họa sự móc nối và gởi thông điệp từ Client (máy SAIGON)qua Server (máy SADEC). Từ Server ta cũng có thể gởi thông điệp qua Clientcùng một cách như vậy.Một khi connection đã đứt đoạn, không dễ cho ta nối lại. Trên nguyên tắc, haibên phải đóng socket rồi tìm cách lắng nghe/móc nối trở lại..NET cho ta một giải pháp đơn giản và thanh tao, đó là dùng thread, một dạngprocess nhẹ ký. Ở cùng một cổng, mỗi khi nhận được Request-to-connect từ mộtTcpClient, ta instantiate một Socket chạy trong một thread riêng để phục vụTcpClient ấy. Khi TcpClient disconnects thì ta cũng đóng socket nầy.Bên phía TcpClient, mỗi lần cần gởi một thông điệp ta instantiate một TcpClientmới, và sau khi gởi xong ta disconnect nó ngay.Cách dùng thread rất đơn giản. Muốn một Sub chạy riêng trong một thread tachỉ cần instantiate một thread với AddressOf của Sub ấy, rồi khởi động threadấy như sau: create a thread to handle this Client RequestDim oThread As ThreadoThread = New Thread(AddressOf ProcessRequest)oThread.Start() Run Sub ProcessRequestĐể dùng Thread ta chỉ cần thêm câu:Imports System.Threading for Threadở đầu phần code.Trong dự án nầy, TcpListener được gói trong class ServerWinsock vàTcpClient được gói trong class ClientWinsock. Chính bên trong classServerWinsock ta dùng multithread để phục vụ nhiều TcpClient qua cùng mộtcổng TCPPortNo duy nhất.Class ClientWinsock chỉ gởi thông điệp và class ServerWinsock chỉ nhận thôngđiệp. Khi ServerWinsock nhận một thông điệp nó sẽ Raise một Event đểprogram chủ của nó xử lý thông điệp. Thông điệp được gởi đi lại dưới dạng mộtarray of bytes. Do đó muốn gởi một Text String ta phải cho biết Encode của Textstring lúc bấy giờ là UTF8, Unicode hay ASCII, và đổi nó ra array of bytes nhưsau:Dim Buffer() As Byte used for outgoing message Convert UFT8 message to an array of bytes before sendingBuffer = System.Text.Encoding.UTF8.GetBytes(mMessage.ToCharArray) Send out the bufferClient.GetStream().Write(Buffer, 0, Buffer.Length)Về phía đầu ServerWinsock, khi nhận được array of bytes thì phải đổi ra Textstring trở lại như sau: Convert the array of bytes (i.e. the buffer) to UTF8 text stringRecvMessage = System.Text.Encoding.UTF8.GetString(Buffer) Raise an event to return the message to the program that owns thisServerWinsockRaiseEvent OnMessage(RecvMessage)Trong thí dụ nầy ta dùng UTF8 để gởi Unicode. Nếu dữ kiện chỉ là ASCII thì cóthể dùng encoding ASCII cho hiệu lực hơn vì mỗi ASCII character chỉ cần mộtbyte:Buffer = System.Text.Encoding.ASCII.GetBytes(mMessage.ToCharArray) Chuẩn bị Buffer để gởi điRecvMessage = System.Text.Encoding.ASCII.GetString(Buffer) Đởi lạithành ASCII text string khi nhậnThật ra để gởi Unicode ta cũng có thể dùng encoding Unicode, tức là UTF16LittleEndian. (Nếu bạn còn mới đối với Unicode encoding hãy đọc bài DùngUnicode chữ Việt trong .NET).Dưới đây là mã nguồn của hai classes ClientWinsock và ServerWinsock:Imports System.Threading for threadsImports System.Net.Sockets for TcpClient and TcpServer This module contains two classes: ClientWinsock and ServerWinsockPublic Class ClientWinsock This object is created to connect to a TCPServer and to send asingle Unicode message Private ClientThread As Thread used to run the main SubStartClient of Client Private TCPIPPortNo As Integer TCPIP port number on destinationcomputer Private DestinationComputer As String name or IP address ofdest ...
Nội dung trích xuất từ tài liệu:
Multithreaded Winsock Vb6 Multithreaded WinsockVb6 cho ta Winsock Control để giúp một program VB6 nói chuyện với mộtprogram khác trên mạng TCP/IP.Ta có thể dùng Winsock Control trong một program để làm Winsock Server hayWinsock 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 trongmột VB6 program để chạy trên một computer và dùng Winsock Control làmClient trong một VB6 program để chạy trên một computer khác trên mạngTCP/IP. Ðể cho hai programs nói chuyện (communicate) trước hết ta cần phảiconnect (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ư 9123). Kế đó ta cho Winsock Client Connect (mócnối) qua LocalPort đó ở địa chỉ TCP của Computer nơi ta chạy Winsock Serverprogram. 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 đếncùng một Computer TCP address. (Nếu bạn còn mới đối với TCP/IP hãy đọc bàiCăn bản TCP/IP )Class ServerWinsock và Class ClientWinsockTrong .NET, Winsock được thay thế bằng TcpListener và TcpClient củaSystem.Net.Sockets. Để dùng chúng ta chỉ cần Project | Add Reference..cái System.dll và thêm câu:Imports System.Net.Sockets for TcpClient and TcpServerở đầu phần code.Khi instantiate một TcpListener object, ta cho nó một PortNo để nó lắng nghequa cổng đó như sau:Dim oListener As TcpListener Variable for TcpListener Instantiate a TcpListener on given PortNooListener = New TcpListener(PortNo)oListener.Start() Start the TcpListenerVề phía Client, ta gọi method Connect của TcpClient với tên củadestination/server computer (hay TCP address của computer ấy) và cái cổng trêndestination/server computer. Ta code như sau:Dim Client As TcpClient Variable for the Client TCP socket Instantiate TCPClient objectClient = New TcpClient() Attempt to connect to destination (server) computer on given portnumberClient.Connect(DestinationComputer, TCPIPPortNo)Bên TcpListener sẽ dùng một Socket để Accept (nhận) cái Request (thỉnh cầu)của TcpClient: Accept request from the TcpClientDim oSocket As SocketoSocket = oListener.AcceptSocketKhi TcpListener AcceptSocket rồi thì hai bên TcpClient và TcpListener có thể gởithông điệp qua lại cho đến khi một bên terminates (stop).Dưới đây là hình minh họa sự móc nối và gởi thông điệp từ Client (máy SAIGON)qua Server (máy SADEC). Từ Server ta cũng có thể gởi thông điệp qua Clientcùng một cách như vậy.Một khi connection đã đứt đoạn, không dễ cho ta nối lại. Trên nguyên tắc, haibên phải đóng socket rồi tìm cách lắng nghe/móc nối trở lại..NET cho ta một giải pháp đơn giản và thanh tao, đó là dùng thread, một dạngprocess nhẹ ký. Ở cùng một cổng, mỗi khi nhận được Request-to-connect từ mộtTcpClient, ta instantiate một Socket chạy trong một thread riêng để phục vụTcpClient ấy. Khi TcpClient disconnects thì ta cũng đóng socket nầy.Bên phía TcpClient, mỗi lần cần gởi một thông điệp ta instantiate một TcpClientmới, và sau khi gởi xong ta disconnect nó ngay.Cách dùng thread rất đơn giản. Muốn một Sub chạy riêng trong một thread tachỉ cần instantiate một thread với AddressOf của Sub ấy, rồi khởi động threadấy như sau: create a thread to handle this Client RequestDim oThread As ThreadoThread = New Thread(AddressOf ProcessRequest)oThread.Start() Run Sub ProcessRequestĐể dùng Thread ta chỉ cần thêm câu:Imports System.Threading for Threadở đầu phần code.Trong dự án nầy, TcpListener được gói trong class ServerWinsock vàTcpClient được gói trong class ClientWinsock. Chính bên trong classServerWinsock ta dùng multithread để phục vụ nhiều TcpClient qua cùng mộtcổng TCPPortNo duy nhất.Class ClientWinsock chỉ gởi thông điệp và class ServerWinsock chỉ nhận thôngđiệp. Khi ServerWinsock nhận một thông điệp nó sẽ Raise một Event đểprogram chủ của nó xử lý thông điệp. Thông điệp được gởi đi lại dưới dạng mộtarray of bytes. Do đó muốn gởi một Text String ta phải cho biết Encode của Textstring lúc bấy giờ là UTF8, Unicode hay ASCII, và đổi nó ra array of bytes nhưsau:Dim Buffer() As Byte used for outgoing message Convert UFT8 message to an array of bytes before sendingBuffer = System.Text.Encoding.UTF8.GetBytes(mMessage.ToCharArray) Send out the bufferClient.GetStream().Write(Buffer, 0, Buffer.Length)Về phía đầu ServerWinsock, khi nhận được array of bytes thì phải đổi ra Textstring trở lại như sau: Convert the array of bytes (i.e. the buffer) to UTF8 text stringRecvMessage = System.Text.Encoding.UTF8.GetString(Buffer) Raise an event to return the message to the program that owns thisServerWinsockRaiseEvent OnMessage(RecvMessage)Trong thí dụ nầy ta dùng UTF8 để gởi Unicode. Nếu dữ kiện chỉ là ASCII thì cóthể dùng encoding ASCII cho hiệu lực hơn vì mỗi ASCII character chỉ cần mộtbyte:Buffer = System.Text.Encoding.ASCII.GetBytes(mMessage.ToCharArray) Chuẩn bị Buffer để gởi điRecvMessage = System.Text.Encoding.ASCII.GetString(Buffer) Đởi lạithành ASCII text string khi nhậnThật ra để gởi Unicode ta cũng có thể dùng encoding Unicode, tức là UTF16LittleEndian. (Nếu bạn còn mới đối với Unicode encoding hãy đọc bài DùngUnicode chữ Việt trong .NET).Dưới đây là mã nguồn của hai classes ClientWinsock và ServerWinsock:Imports System.Threading for threadsImports System.Net.Sockets for TcpClient and TcpServer This module contains two classes: ClientWinsock and ServerWinsockPublic Class ClientWinsock This object is created to connect to a TCPServer and to send asingle Unicode message Private ClientThread As Thread used to run the main SubStartClient of Client Private TCPIPPortNo As Integer TCPIP port number on destinationcomputer Private DestinationComputer As String name or IP address ofdest ...
Tìm kiếm theo từ khóa liên quan:
công nghệ thông tin kỹ thuật máy tính lập trình quản trị mạng tin học vi tính Multithreaded Winsock Vb6Gợi ý tài liệu liên quan:
-
52 trang 426 1 0
-
24 trang 351 1 0
-
Top 10 mẹo 'đơn giản nhưng hữu ích' trong nhiếp ảnh
11 trang 309 0 0 -
74 trang 293 0 0
-
96 trang 289 0 0
-
Báo cáo thực tập thực tế: Nghiên cứu và xây dựng website bằng Wordpress
24 trang 288 0 0 -
Đồ án tốt nghiệp: Xây dựng ứng dụng di động android quản lý khách hàng cắt tóc
81 trang 276 0 0 -
EBay - Internet và câu chuyện thần kỳ: Phần 1
143 trang 270 0 0 -
Tài liệu dạy học môn Tin học trong chương trình đào tạo trình độ cao đẳng
348 trang 269 1 0 -
Tài liệu hướng dẫn sử dụng thư điện tử tài nguyên và môi trường
72 trang 259 0 0