Chuyên đề Lập trình mạng và internet

Học lập trình mạng để làm gì?

Có được sự hiểu biết để quản trị các dịch vụ có sẳn trên mạng tốt hơn.

Có kiến thức để có thể lập được các tiện ích khai thác tài nguyên trên mạng internet

Bước đầu lập được các ứng dụng server và client phục vụ cho một mục đích riêng nào đó

ppt122 trang | Chia sẻ: phuongt97 | Lượt xem: 344 | Lượt tải: 0download
Bạn đang xem trước 20 trang nội dung tài liệu Chuyên đề Lập trình mạng và internet, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ut.Text = strDataEnd SubCơ bản tạo lập kết nối và trao đối message kiểu TCPTCP client Sub Form_Load() tcpClient.RemoteHost = "ServerName" tcpClient.RemotePort = 1001End SubSub cmdConnect_Click() tcpClient.ConnectEnd SubSub txtSendData_Change() tcpClient.SendData txtSend.TextEnd SubSub tcpClient_DataArrival _(ByVal bytesTotal As Long) Dim strData As String tcpClient.GetData strData txtOutput.Text = strDataEnd SubUDP Peer A Private Sub Form_Load()udpPeerA.RemoteHost= "PeerB" udpPeerA.RemotePort = 1001 udpPeerA.Bind 1002End SubPrivate Sub txtSend_Change() udpPeerA.SendData txtSend.TextEnd SubPrivate Sub udpPeerA_DataArrival _(ByVal bytesTotal As Long) Dim strData As String udpPeerA.GetData strData txtOutput.Text = strDataEnd SubUDP Peer B Private Sub Form_Load() udpPeerB.RemoteHost= "PeerA" udpPeerB.RemotePort = 1002 udpPeerB.Bind 1001 End SubPrivate Sub txtSend_Change() udpPeerB.SendData txtSend.TextEnd SubPrivate Sub udpPeerB_DataArrival _(ByVal bytesTotal As Long) Dim strData As String udpPeerB.GetData strData txtOutput.Text = strDataEnd SubCơ bản cách thiết lập và trao đổi message kiểu UDPMột số ví dụ cho phần 5.1Trong Server có 2 socket được sử dụng. Một cho listen, 1 cho trao đổi dữ liệu. Trong client chỉ có 1 socket.Có một vài thay đổi tên thuộc tính winsock như state được thay bằng CtlStateĐể trao đỗi các message Unicode, sử dụng các hàm System.Text.Encoding.UTF8Ví dụ 1: Server và Client “chat với nhauServerPublic Class Form1Private Sub blisten_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles blisten.Click wsock1.Close() wsock2.Close() wsock1.LocalPort = 1234 wsock1.Listen()End SubPrivate Sub bstop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bstop.Click wsock1.Close() wsock2.Close()End SubPrivate Sub wsock1_ConnectionRequest(ByVal sender As Object, ByVal e As AxMSWinsockLib.DMSWinsockControlEvents_ConnectionRequestEvent) Handles wsock1.ConnectionRequest wsock2.Accept(e.requestID)End SubPrivate Sub wsock2_DataArrival(ByVal sender As Object, ByVal e As AxMSWinsockLib.DMSWinsockControlEvents_DataArrivalEvent) Handles wsock2.DataArrival Dim B(1024) As Byte wsock2.GetData(B) Dim S As String = System.Text.Encoding.UTF8.GetString(B, 0, B.Length) TextBox1.Text = TextBox1.Text & vbCrLf & SEnd SubPrivate Sub bsend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bsend.Click If wsock2.CtlState MSWinsockLib.StateConstants.sckConnected Then MessageBox.Show("Chưa kết nối") End If If TextBox2.Text = "" Then MessageBox.Show("Chưa nhập chuổi") End If Dim B(1) As Byte B = System.Text.Encoding.UTF8.GetBytes("Server: " & TextBox2.Text) wsock2.SendData(B) TextBox1.Text = TextBox1.Text & vbCrLf & "Server: " & TextBox2.Text TextBox2.Text = ""End SubPrivate Function wstate(ByVal v As Integer) As String Select Case v Case 0 Return "Closed" Case 2 Return "Listening" Case 7 Return "Connected" Case 9 Return "Error" End Select Return ""End FunctionPrivate Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Label1.Text = "Socket 1: " & wstate(wsock1.CtlState) & vbCrLf & "Socket 2: " & wstate(wsock2.CtlState)End SubEnd ClassClientPublic Class Form1 Private Sub bconn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bconn.Click wsock.Close() wsock.RemoteHost = "127.0.0.1" wsock.RemotePort = 1234 wsock.Connect() End Sub Private Sub bdisc_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bdisc.Click wsock.Close() End Sub Private Sub bsend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bsend.Click If wsock.CtlState MSWinsockLib.StateConstants.sckConnected Then MessageBox.Show("Chưa kết nối") End If If TextBox2.Text = "" Then MessageBox.Show("Chưa nhập chuổi") End If Dim B(1) As Byte B = System.Text.Encoding.UTF8.GetBytes("Client: " & TextBox2.Text) wsock.SendData(B) TextBox1.Text = TextBox1.Text & vbCrLf & "Client: " & TextBox2.Text TextBox2.Text = "" End Sub Private Sub wsock2_DataArrival(ByVal sender As Object, ByVal e As AxMSWinsockLib.DMSWinsockControlEvents_DataArrivalEvent) Handles wsock.DataArrival Dim B(1024) As Byte wsock.GetData(B) Dim S As String = System.Text.Encoding.UTF8.GetString(B, 0, B.Length) TextBox1.Text = TextBox1.Text & vbCrLf & S End Sub Private Function wstate(ByVal v As Integer) As String Select Case v Case 0 Return "Closed" Case 2 Return "Listening" Case 7 Return "Connected" Case 9 Return "Error" End Select Return "" End Function Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Label1.Text = "Socket: " & wstate(wsock.CtlState) End SubEnd ClassVí dụ 2: Nhiều client kết nối đồng thờiChỉ cần sử dụng một socket, server có thể “phục vụ” được cho nhiều client bằng cách “phuc vụ” xong client nào thì cắt kết nối luôn để “phuc vụ” cho client khác (kiểu như Web server). Trong ví dụ này, tạo ra một mảng 10 socket. Mỗi socket sẽ kết nối với một client và như vậy tại mỗi thời điểm, nó cho phép đến 10 client duy trì kết nối và trao đổi dữ liệu với nhau. Mỗi khi client X nào đó gửi message, client X sẽ đẩy message đến server. Server sẽ đẩy đến tất cả những client khác hiện đang kết nối. sock1ws(0)ws(1)ws(9)Client 1Client 2Client 3socksocksocklistenServerMàn hình:Viết code cho Server:1) Trước hết, cần khai báo một mảng ws gồm 10 socket: Dim ws(9) As AxMSWinsockLib.AxWinsock2) Tạo một thủ tục khởi tạo mảng các socket này: Private Sub InitWs() For i As Integer = 0 To 9 ws(i) = New AxMSWinsockLib.AxWinsock ws(i).Name = "S" & i ws(i).CreateControl() ' quan trong AddHandler ws(i).DataArrival, AddressOf ws_DataArrival Next End Sub3) Viết thủ tục ws_DataArrival: Nếu ws(si) có dũ liệu đến thì ws(si) sẽ đọc và phân tán đến các ws(i) khác nếu ws(i) hiện đang ở trạng thái Connected. Private Sub ws_DataArrival(ByVal sender As Object, ByVal e As AxMSWinsockLib.DMSWinsockControlEvents_DataArrivalEvent) For si As Integer = 0 To 9 If ws(si) Is CType(sender, AxMSWinsockLib.AxWinsock) Then Dim B(1024) As Byte ws(si).GetData(B) For i As Integer = 0 To 9 If i si And ws(i).CtlState = MSWinsockLib.StateConstants.sckConnected Then ws(i).SendData(B) End If Next Exit For End If Next End Sub4) sock1 sẽ được sử dụng cho listen. Khi một client kết nối với server , chương trình sẽ tìm ws(i) đầu tiên không ở trạng thái Connected để Accept với client này:Private Sub wsock1_ConnectionRequest(ByVal sender As Object, ByVal e As AxMSWinsockLib.DMSWinsockControlEvents_ConnectionRequestEvent) Handles wsock1.ConnectionRequest For i As Integer = 0 To 9 If ws(i).CtlState MSWinsockLib.StateConstants.sckConnected Then ws(i).Close() End If If ws(i).CtlState = MSWinsockLib.StateConstants.sckClosed Then ws(i).Accept(e.requestID) Exit For End If NextEnd SubĐề nghị đọc source code đầy đủ của ví dụ 2 và phát triển thêm là client A chỉ muốn gửi cho một vài client cụ thể nào đó chứ không phải là tất cả. 5.2 Sử dụng các lớp thuộc System.Net và System.Net.SocketsTìm hiểu các lớp thuộc System.Net và System.Net.SocketsLớp IPAddress:IPAddress được sử dụng để trình bày một địa chỉ IP.Ví dụ:using System;using System.Net;class AddressSample{ public static void Main () { IPAddress a1 = IPAddress.Parse("192.168.1.1"); IPHostEntry h =Dns.GetHostByName(Dns.GetHostName()); IPAddress a2 = h.AddressList[0]; Console.WriteLine("The test address is: {0}", a1.ToString()); Console.WriteLine("The Local IP address is: {0}\n",a2.ToString()); }}Kết quả:The Local IP address is: 192.168.1.6 The test address is: 192.168.1.1 Lớp IPEndPoint:IPEndPoint tương tự như cấu trúc địa chỉ socket (sockaddr_in)Ví dụ:using System;using System.Net;class IPEndPointSample{ public static void Main () { IPAddress a = IPAddress.Parse("192.168.1.1"); IPEndPoint e = new IPEndPoint(a, 8000); Console.WriteLine("The IPEndPoint is: {0}", e.ToString()); Console.WriteLine("The AddressFamily is: {0}", e.AddressFamily); Console.WriteLine("The address is: {0}, and the port is: {1}\n", e.Address, e.Port); SocketAddress sa = e.Serialize(); Console.WriteLine("The SocketAddress is: {0}",sa.ToString()); }} Kết quả:The IPEndPoint is: 192.168.1.1:8000 The AddressFamily is: InterNetwork The address is: 192.168.1.1, and the port is: 8000 The SocketAddress is: InterNetwork:16:{0,80,192,168,1,1,0,0,0,0,0,0,0,0} Lớp Socket:Đối tượng Socket được sử dụng tương tự như khi sử dụng socket trong C, C++ (Chương 4). Ví dụ: Đoạn code tại Server sử dụng đối tượng Socket:IPHostEntry local = Dns.GetHostByName(Dns.GetHostName());IPEndPoint iep = new IPEndPoint(local.AddressList[0], 8000);Socket sserver = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);sserver.Bind(iep);sserver.Listen(5);Socket snew = sserver.Accept();Và đoạn code sau là tại Client:IPAddress host = IPAddress.Parse("192.168.1.1");IPEndPoint hostep = new IPEndPoint(host, 8000);Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);sock.Connect(hostep);Lớp Socket (tiếp): Việc đẩy và nhận được sử dụng bởi các method Send(), Receive() của Socket. Ví dụ:using System;using System.Net;using System.Net.Sockets;using System.Text;class Client { public static void Main () { IPAddress host = IPAddress.Parse("192.168.1.1"); IPEndPoint hostep = new IPEndPoint(host, 8000); Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { sock.Connect(hostep); } catch (SocketException e) { Console.WriteLine("Problem connecting to host"); sock.Close(); return; } try { sock.Send(Encoding.ASCII.GetBytes("testing")); } catch (SocketException e) { Console.WriteLine("Problem sending data"); sock.Close(); return; } sock.Close(); } }Lớp NetworkStream:Lớp NetworkStream cung cấp các method có việc đẩy và nhận dữ liệu kiểu Stream sockets theo mode block. Có thể sử dụng NetworkStream cho cả cách truyền đồng bộ (synchronous) và dị bộ (asynchronous). NetworkStream thường được sử dụng với TcpClient, TcpListener, UdpClient.Ví dụ:TcpClient sockclient = new TcpClient(“192.168.1.1", 8000);NetworkStream ns = sockclient.GetStream();byte[] outbytes = Encoding.ASCII.GetBytes("Testing");ns.Write(outbytes, 0, outbytes.Length);byte[] inbytes = new byte[1024];ns.Read(inbytes, 0, inbytes.Length);string instring = Encoding.ASCII.GetString(inbytes);Console.WriteLine(instring);ns.Close();Lớp TcpClientLà một Helper class sử dụng cho kết nối TCP phía client. Có 3 cách sử dụng nó để kết nối với máy remote (server):1) Cấu tử mặc định:TcpClient sockclient = new TcpClient();sockclient.Connect(“192.168.1.1", 8000);2) Chỉ ra bởi đối tượng IPEndPoint.IPAddress ia = Dns.GetHostByName(Dns.GetHostName()).AddressList[0];IPEndPoint iep = new IPEndPoint(ia, 10232);TcpClient sockclient = new TcpClient(iep);sockclient.Connect(“192.168.1.1", 8000);3) Chỉ ra remote host Cách này hay sử dụng nhất. Nó không cần phải dùng method Connect() TcpClient sockclient = new TcpClient(“www.myweb.com", 8000);Ví dụ:TcpClient sockclient = new TcpClient(“192.168.1.1", 8000);NetworkStream ns = sockclient.GetStream();byte[] outbytes = Encoding.ASCII.GetBytes("Testing");ns.Write(outbytes, 0, outbytes.Length);byte[] inbytes = new byte[1024];ns.Read(inbytes, 0, inbytes.Length);string instring = Encoding.ASCII.GetString(inbytes);Console.WriteLine(instring);ns.Close();sockclient.Close();Lớp TcpListenerLà một Helper class được sử dụng như là server socket. Có 3 dạng tham số: •TcpListener(int port)•TcpListener(IPEndPoint ie) •TcpListener(IPAddress addr, int port)TcpListener.Start và TcpListener.Stop là bắt đầu và dừng ListenVí dụ:TcpListener sock1 = new TcpListener(9050);sock1.Start();TcpClient sock2 = sock1.AcceptTcpClient();NetworkStream ns = sock2.GetStream();byte[] outbytes = Encoding.ASCII.GetBytes("Testing");ns.Write(outbytes, 0, outbytes.Length);byte[] inbytes = new byte[1024];ns.Read(inbytes, 0, inbytes.Length);string instring = Encoding.ASCII.GetString(inbytes);Console.WriteLine(instring);ns.Close();sock2.Close();sock1.Stop();Một số ví dụ cho phần 5.2Ví dụ 1: Sử dụng lớp Socket. Hoạt động đơn giản như sau:Server listenClient Connect với server và chuyển một message S1 đến serverServer đọc và hiển thị message S1 và chuyển cho client message S2Client đọc message S2 và hiển thị rồi disconnectServer lặp lại bước 1Imports SystemImports System.NetImports System.Net.SocketsImports System.TextImports Microsoft.VisualBasicPublic Class Server Public Shared data As String = Nothing Public Shared Sub Main() Dim bytes() As Byte = New [Byte](1024) {} Dim ipHostInfo As IPHostEntry = Dns.Resolve(Dns.GetHostName()) Dim ipAddress As IPAddress = ipHostInfo.AddressList(0) Dim localEndPoint As New IPEndPoint(ipAddress, 11000) ' Create a TCP/IP socket. Dim listener As New Socket(AddressFamily.InterNetwork, _ SocketType.Stream, ProtocolType.Tcp) listener.Bind(localEndPoint) listener.Listen(10) Server:While True Console.WriteLine("Waiting for a connection...") Dim handler As Socket = listener.Accept() data = Nothing While True bytes = New Byte(1024) {} Dim bytesRec As Integer = handler.Receive(bytes) data += Encoding.ASCII.GetString(bytes, 0, bytesRec) If data.IndexOf("") > -1 Then Exit While End If End While Console.WriteLine("Text received : {0}", data) Dim msg As Byte() = Encoding.ASCII.GetBytes(data) handler.Send(msg) handler.Shutdown(SocketShutdown.Both) handler.Close() End While End SubEnd ClassClient:Imports SystemImports System.NetImports System.Net.SocketsImports System.TextPublic Class Client Public Shared Sub Main() Dim bytes(1024) As Byte Dim host As IPAddress = IPAddress.Parse("192.168.1.1"); Dim remoteEP As New IPEndPoint(host, 11000) Dim sender As New Socket(AddressFamily.InterNetwork, _ SocketType.Stream, ProtocolType.Tcp) sender.Connect(remoteEP) Console.WriteLine("Socket connected to {0}", sender.RemoteEndPoint.ToString()) Dim msg As Byte() = Encoding.ASCII.GetBytes("This is a test") Dim bytesSent As Integer = sender.Send(msg) Dim bytesRec As Integer = sender.Receive(bytes) Console.WriteLine("Echoed test = {0}", Encoding.ASCII.GetString(bytes, 0, bytesRec)) sender.Shutdown(SocketShutdown.Both) sender.Close() End SubEnd Class Chương 6 Một số bài tập ứng dụngnpbc#

Các file đính kèm theo tài liệu này:

  • pptchuyen_de_lap_trinh_mang_va_internet.ppt
Tài liệu liên quan