• Thứ Sáu, 15/05/2009 14:09 (GMT+7)

    Lập trình VB6.0, dùng winsock truyền webcam và dữ liệu

    Câu hỏi :
    Tôi muốn viết chương trình kết nối 2 máy tính dùng VB6.0 sử dụng hỗ trợ của winsock vừa truyền webcam vừa truyền dữ liệu. Có thể dùng 2 winsock (một cái truyền webcam, một cái truyền nhận thông tin) được không?


    Trả lời :
    Khi viết ứng dụng mạng bằng VB 6.0, cách dễ dàng nhất là dùng điều khiển ActiveX của Microsoft có tên là Winsock. Thường 1 ứng dụng mạng gồm 2 module phần mềm: module client và module server. Điều khiển Winsock cũng có thể hoạt động ở 1 trong 2 chế độ: Winsock server hay Winsock client. Winsock server có thể giao tiếp với nhiều client đồng thời, còn Winsock client thì chỉ có thể giao tiếp với 1 server tại từng thời điểm. Tóm lại, nếu bạn đang dùng Winsock ở chế độ client để truyền dữ liệu đến server, bạn có thể tạo 2 hay nhiều điều khiển Winsock khác nhau, mỗi điều khiển Winsock sẽ truyền/nhận dữ liệu với 1 đối tác nào đó. Sau đây là qui trình xây dựng ứng dụng mạng nhỏ demo việc tạo Winsock và gửi/nhận dữ liệu cho nhau.

     Qui trình xây dựng module Client:
     1. Chạy VB 6.0, tạo Project "Standard EXE".
     2. Chọn menu Project.Components để hiển thị cửa sổ Components, duyệt tìm và chọn mục "Microsoft Winsock Control 6.0" để "add" nó vào cửa sổ ToolBox của Project.
     3. Thiết kế Form cho ứng dụng Client như sau:
     Lưu ý đặt tên cho button là cmdConnect, Textbox của Client 1 là Text1, TextBox của Client 2 là Text2, 2 Winsock có tên lần lượt là ClientSock1 và ClientSock2.
     4. Nhấn kép chuột vào button Connect để tạo thủ tục xử lý sự kiện nhấn chuột cho nó. Khi cửa sổ soạn code hiển thị, bạn hãy viết đoạn code VB sau đây:
     'Thủ tục khởi tạo cho Form
     Private Sub Form_Load()
     'Để xác định máy chạy ứng dụng server, bạn có thể dùng địa chỉ IP (vd: "127.0.0.1") hay địa chỉ DNS (vd: “localhost”)
     'thiết lập địa chỉ server cho Winsock1
     ClientSock1.RemoteHost = "localhost"
     ClientSock1.RemotePort = 1001
     'thiết lập địa chỉ server cho Winsock2
     ClientSock2.RemoteHost = "localhost"
     ClientSock2.RemotePort = 1001
     End Sub
     
     'Thủ tục xử lý nhấn chuột trên button Connect
     Private Sub cmdConnect_Click()
     'nối kết ClientSock1 tới server
     ClientSock1.Connect
     'nối kết ClientSock2 tới server
     ClientSock2.Connect
     End Sub
     
     'Thủ tục xử lý nhấn phím trên TextBox1
     Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
     'nếu người dùng nhấn phím Enter thì gửi chuỗi nhập ra ClientSock1
     If KeyCode = 13 Then
     ClientSock1.SendData Text1.Text
     End If
     End Sub
     
     'Thủ tục xử lý nhấn phím trên TextBox1
     Private Sub Text2_KeyDown(KeyCode As Integer, Shift As Integer)
     'nếu người dùng nhấn phím Enter thì gửi chuỗi nhập ra ClientSock2
     If KeyCode = 13 Then
     ClientSock2.SendData Text2.Text
     End If
     End Sub
     5. Chọn menu File.Make Project1.exe và nhập tên file thực thi mong muốn để VB dịch mã nguồn ra file thực thi của module Client.
     Qui trình xây dựng module Server cũng tương tự:
     1. Chạy VB 6.0, tạo Propject "Standard EXE".
     2. Chọn menu Project.Components để hiển thị cửa sổ Components, duyệt tìm và chọn mục "Microsoft Winsock Control 6.0" để "add" nó vào cửa sổ ToolBox của Project.
     3. Thiết kế Form cho ứng dụng Server như sau:
     Lưu ý đặt tên cho ListBox1 là List1, ListBox2 là List2, Winsock có tên là sckServer.
     4. Chọn điều khiển Winsock vừa vẽ để hiển thị cửa sổ thuộc tính của nó, duyệt tìm thuộc tính Index và nhập giá trị 0 cho nó.
     5. Chọn menu View.Code để hiển thị cửa sổ soạn code và viết đoạn code VB sau đây:
     'Khai báo biến cần dùng
     Private intMax As Long
     'Thủ tục khởi tạo cho Form
     Private Sub Form_Load()
     intMax = 0
     'khởi tạo socket lắng nghe và phục vụ kết nối từ client
     sckServer(0).LocalPort = 1001
     sckServer(0).Listen
     End Sub
     
     'Thủ tục phục vụ yêu cầu kết nối từ Client
     Private Sub sckServer_ConnectionRequest (Index As Integer, ByVal requestID As Long)
     If Index = 0 Then
     intMax = intMax + 1
     Load sckServer(intMax)
     sckServer(intMax).LocalPort = 0
     sckServer(intMax).Accept requestID
     End If
     End Sub
     
     'Thủ tục nhận dữ liệu từ Client
     Private Sub sckServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)
     Dim strData As String
     'nhận dữ liệu vào biến strData
     sckServer(Index).GetData strData
     'kiểm tra dữ liệu đến từ Client nào
     Select Case Index
     Case 1: 'từ Client 1
     List1.AddItem strData
     Case 2: 'từ Client 2
     List2.AddItem strData
     End Select
     End Sub
     6. Chọn menu File.Make Project1.exe và nhập tên file thực thi mong muốn để VB dịch mã nguồn ra file thực thi của module Server.

     Sau khi đã xây dựng được 2 module client & server của ứng dụng mạng, bạn hãy chạy Server trước rồi chạy Client sau. Khi Form của Client hiển thị, bạn nhấn button Connect để client tạo 2 Winsock khác nhau và nối kết chúng đến cùng 1 server (đang lắng nghe ở địa chỉ localhost:1001). Sau đó, bạn thử nhập 1 chuỗi vào Text1 và nhấn Enter để nó gửi qua Server, Server sẽ nhận và hiển thị lên ListBox1, bạn thử nhập 1 chuỗi vào Text2 và nhấn Enter để nó gửi qua Server, Server sẽ nhận và hiển thị lên ListBox2...
     
    Chuyên mục: Lập trình