Professional C# Third Edition phần 9 ppsx

140 278 0
Professional C# Third Edition phần 9 ppsx

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

IPAddress IPAddress represents an IP address. The address itself is available as the Address property, and may be converted to a dotted decimal format with the ToString() method. IPAddress also implements a static Parse() method, which effectively performs the reverse conversion of ToString()—converting from a dotted decimal string to an IPAddress. IPAddress ipAddress = IPAddress.Parse(“234.56.78.9”); long address = ipAddress.Address; string ipString = ipAddress.ToString(); In the previous example, the long integer address is assigned 156121322, and the string ipString is assigned the text “234.56.78.9”. IPAddress also provides a number of constant static fields to return special addresses. For example, the Loopback address allows a machine to send messages to itself, while the Broadcast address allows multicasting to the local network. // The following line will set loopback to “127.0.0.1”. // the loopback address indicates the local host. string loopback = IPAddress.Loopback.ToString(); // The following line will set broadcast address to “255.255.255.255”. // the broadcast address is used to send a message to all machines on // the local network. string broadcast = IPAddress.Broadcast.ToString(); IPHostEntry The IPHostEntry class encapsulates information relating to a particular host computer. This class makes the host name available via the HostName property (which returns a string), and the AddressList property returns an array of IPAddress objects. We are going to use the IPHostEntry class in the in next example: DNSLookupResolver. Dns The Dns class is able to communicate with your default DNS server in order to retrieve IP addresses. The two important (static) methods are Resolve(), which uses the DNS server to obtain the details of a host with a given host name, and GetHostByAddress(), which also returns details of the host, but this time using the IP address. Both methods return an IPHostEntry object. IPHostEntry wroxHost = Dns.Resolve(“www.wrox.com”); IPHostEntry wroxHostCopy = Dns.GetHostByAddress(“168.215.86.81”); In this code both IPHostEntry objects will contain details of the Wrox.com servers. The Dns class differs from the IPAddress and IPHostEntry classes since it has the ability to actually communicate with servers to obtain information. In contrast, IPAddress and IPHostEntry are more along the lines of simple data structures with convenient properties to allow access to the underlying data. 1080 Chapter 31 39 557599 Ch31.qxd 4/29/04 11:43 AM Page 1080 Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com The DnsLookup example We will illustrate the DNS and IP-related classes with an example that looks up DNS names: DnsLookup (see Figure 31-7). Figure 31-7 This sample application simply invites the user to type in a DNS name using the main text box. When the user clicks the Resolve button, the sample uses the Dns.Resolve() method to retrieve an IPHostEntry reference and display the host name and IP addresses. Note how the host name displayed may be different from the name typed in. This can occur if one DNS name ( www.microsoft.com) sim- ply acts as a proxy for another DNS name (a562.cd.akamai.net). The DnsLookup application is a standard C# Windows application. The controls are added as shown in Figure 31-7, giving them the names txtBoxInput, btnResolve, txtBoxHostName, and listBoxIPs respectively. Then we simply add the following method to the Form1 class as the event handler for the buttonResolve click event. void btnResolve_Click (object sender, EventArgs e) { try { IPHostEntry iphost = Dns.Resolve(txtBoxInput.Text); foreach (IPAddress ip in iphost.AddressList) { string ipaddress = ip.AddressFamily.ToString(); listBoxIPs.Items.Add(ipaddress); listBoxIPs.Items.Add(“ “ + ip.ToString()); } txtBoxHostName.Text = iphost.HostName; } catch(Exception ex) { MessageBox.Show(“Unable to process the request because “ + 1081 Accessing the Internet 39 557599 Ch31.qxd 4/29/04 11:43 AM Page 1081 Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com “the following problem occurred:\n” + ex.Message, “Exception occurred”); } } Notice that in this code we are careful to trap any exceptions. An exception might occur if the user types in an invalid DNS name, or if the network is down. After retrieving the IPHostEntry instance, we use the AddressList property to obtain an array contain- ing the IP addresses, which we then iterate through with a foreach loop. For each entry we display the IP address as an integer and as a string, using the IPAddress.AddressFamily.ToString() method. Lower-Level Protocols In this section we will briefly discuss some of the .NET classes used to communicate at a lower level. Network communications work on several different levels. The classes we have covered in this chapter so far work at the highest level: the level at which specific commands are processed. It is probably easi- est to understand this concept if you think of file transfer using FTP. Although today’s GUI applications hide many of the FTP details, it was not so long ago when we executed FTP from a command-line prompt. In this environment we explicitly typed commands to send to the server for downloading, uploading, and listing files. FTP is not the only high-level protocol relying on textual commands. HTTP, SMTP, POP, and other proto- cols are based on a similar type of behavior. Again, many of the modern graphical tools hide the trans- mission of commands from the user, so you are generally not aware of them. For example, when you type a URL into a Web browser, and the Web request goes off to a server, the browser is actually sending a (plain text) GET command to the server, which fulfills a similar purpose as the FTP get command. It can also send a POST command, which indicates that the browser has attached other data to the request. However, these protocols are not sufficient by themselves to achieve communication between comput- ers. Even if both the client and the server understand, for example, the HTTP protocol, it will still not be possible for them to understand each other unless there is also agreement on exactly how to transmit the characters: what binary format will be used, and getting down to the lowest level, what voltages will be used to represent 0s and 1s in the binary data? Since there are so many items to configure and agree upon, developers and hardware engineers in the networking field often refer to a protocol stack. When you list all of the various protocols and mechanisms required for communication between two hosts, you create a protocol stack with high-level protocols on the top and low-level protocols on the bottom. This approach results in a modular and layered approach to achieving efficient communication. Luckily, for most development work, we don’t need to go far down the stack or work with voltage levels, but if you are writing code that requires efficient communication between computers, it’s not unusual to write code that works directly at the level of sending binary data packets between computers. This is the realm of protocols such as TCP, and Microsoft has supplied a number of classes that allow you to conveniently work with binary data at this level. 1082 Chapter 31 39 557599 Ch31.qxd 4/29/04 11:43 AM Page 1082 Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com Lower-Level Classes The System.Net.Sockets namespace contains the relevant classes. These classes, for example, allow you to directly send out TCP network requests or to listen to TCP network requests on a particular port. The following table explains the main classes. Class Purpose Socket Low-level class that deals with managing connections. Classes such as WebRe- quest, TcpClient, and UdpClient use this class internally. NetworkStream Derived from Stream. Represents a stream of data from the network. TcpClient Enables you to create and use TCP connections. TcpListener Enables you to listen for incoming TCP connection requests. UdpClient Enables you to create connections for UDP clients. (UDP is an alternative pro- tocol to TCP, but is much less widely used, mostly on local networks.) Using the TCP classes The transmission control protocol (TCP) classes offer simple methods for connecting and sending data between two endpoints. An endpoint is the combination of an IP address and a port number. Existing protocols have well defined port numbers, for example, HTTP uses port 80, while SMTP uses port 25. The Internet Assigned Number Authority, IANA, ( http://www.iana.org/) assigns port numbers to these well-known services. Unless you are implementing a well-known service, you will want to select a port number above 1,024. TCP traffic makes up the majority of traffic on the Internet today. TCP is often the protocol of choice because it offers guaranteed delivery, error correction, and buffering. The TcpClient class encapsulates a TCP connection and provides a number of properties to regulate the connection, including buffering, buffer size, and timeouts. Reading and writing is accomplished by requesting a NetworkStream object via the GetStream() method. The TcpListener class listens for incoming TCP connections with the Start() method. When a con- nection request arrives you can use the AcceptSocket() method to return a socket for communication with the remote machine, or use the AcceptTcpClient() method to use a higher-level TcpClient object for communication. The easiest way to demonstrate the TcpListener and TcpClient classes working together is to work through an example. The TcpSend and TcpReceive examples To demonstrate how these classes work we need to build two applications. Figure 31-8 shows the first application, TcpSend. This application opens a TCP connection to a server and sends the C# source code for itself. 1083 Accessing the Internet 39 557599 Ch31.qxd 4/29/04 11:43 AM Page 1083 Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com Figure 31-8 Once again we create a C# Windows application. The form consists of two text boxes ( txtHost and txtPort) for the host name and port, respectively, as well as a button (btnSend) to click and start a con- nection. First, we ensure that we include the relevant namespaces: using System.Net; using System.Net.Sockets; using System.IO; The following code shows the event handler for the button’s click event: private void btnSend_Click(object sender, System.EventArgs e) { TcpClient tcpClient = new TcpClient(txtHost.Text, Int32.Parse(txtPort.Text)); NetworkStream ns = tcpClient.GetStream(); FileStream fs = File.Open(“ \\ \\form1.cs”, FileMode.Open); int data = fs.ReadByte(); while(data != -1) { ns.WriteByte((byte)data); data = fs.ReadByte(); } fs.Close(); ns.Close(); tcpClient.Close(); } This example creates the TcpClient using a host name and a port number. Alternatively, if you have an instance of the IPEndPoint class, you can pass the instance to the TcpClient constructor. After retriev- ing an instance of the NetworkStream class we open the source code file and begin to read bytes. Like many of the binary streams, we need to check for the end of the stream by comparing the return value of the ReadByte() method to -1. After our loop has read all of the bytes and sent them along to the net- work stream, we make sure to close all of the open files, connections, and streams. On the other side of the connection, the TcpReceive application displays the received file after the trans- mission is finished (see Figure 31-9). 1084 Chapter 31 39 557599 Ch31.qxd 4/29/04 11:43 AM Page 1084 Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com Figure 31-9 The form consists of a single RichTextBox control, named txtDisplay. The TcpReceive application uses a TcpListener to wait for the incoming connection. In order to avoid freezing the application interface, we use a background thread to wait for and then read from the connection. Thus we need to include the System.Threading namespace as well: using System.Net; using System.Net.Sockets; using System.IO; using System.Threading; Inside the form’s constructor we spin up a background thread: public Form1() { InitializeComponent(); Thread thread = new Thread(new ThreadStart(Listen)); thread.Start(); } The remaining important code is this: public void Listen() { TcpListener tcpListener = new TcpListener(2112); 1085 Accessing the Internet 39 557599 Ch31.qxd 4/29/04 11:43 AM Page 1085 Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com tcpListener.Start(); TcpClient tcpClient = tcpListener.AcceptTcpClient(); NetworkStream ns = tcpClient.GetStream(); StreamReader sr = new StreamReader(ns); string result = sr.ReadToEnd(); Invoke(new UpdateDisplayDelegate(UpdateDisplay), new object[] {result} ); tcpClient.Close(); tcpListener.Stop(); } public void UpdateDisplay(string text) { txtDisplay.Text= text; } protected delegate void UpdateDisplayDelegate(string text); The thread begins execution in the Listen() method and allows us to make the blocking call to AcceptTcpClient() without halting the interface. Notice that we have hard-coded the port number 2112 into the application, so you will need to enter the same port number from the client application. We use the TcpClient object returned by AccepTcpClient() to open a new stream for reading. Similar to the earlier example, we create a StreamReader to convert the incoming network data into a string. Before we close the client and stop the listener, we update the form’s text box. We do not want to access the text box directly from our background thread, so we use the form’s Invoke() method with a dele- gate, and pass the result string as the first element in an array of object parameters. Invoke() ensures our call is correctly marshaled into the thread owning the control handles in the user interface. TCP versus UDP The other protocol to cover in this section is UDP (user datagram protocol). UDP is a simple protocol with few features but also little overhead. Developers often use UDP in applications where the speed and performance requirements outweigh the reliability needs, for example, video streaming. In contrast, TCP offers a number of features to confirm the delivery of data. TCP provides error correction and re- transmission in the case of lost or corrupted packets. Last, but hardly least, TCP buffers incoming and outgoing data and also guarantees a sequence of packets scrambled in transmission are reassembled before delivery to the application. Even with the extra overhead, TCP is the most widely used protocol across the Internet because of the higher reliability. The UDP class As you might expect, the UdpClient class features a smaller and simpler interface compared to TcpClient. This reflects the relatively simpler nature of the protocol in comparison to TCP. While both TCP and UDP classes use a socket underneath the covers, the UdpClient client does not contain a method to return a network stream for reading and writing. Instead, the member function Send()accepts an array of bytes as a parameter, while the Receive() function returns an array of bytes. Also, since UDP 1086 Chapter 31 39 557599 Ch31.qxd 4/29/04 11:43 AM Page 1086 Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com is a connectionless protocol, you can wait to specify the endpoint for the communication as a parameter to the Send() and Receive() methods, instead of earlier in a constructor or Connect() method. You can also change the endpoint on each subsequent send or receive. The following code fragment uses the UdpClient class to send a message to an echo service. A server with an echo service running accepts TCP or UDP connections on port 7. The echo service simply echoes any data sent to the server back to the client. This service is useful for diagnostics and testing, although many system administrators disable echo services for security reasons. using System; using System.Text; using System.Net; using System.Net.Sockets; namespace Wrox.ProCSharp.InternetAccess.UdpExample { class Class1 { [STAThread] static void Main(string[] args) { UdpClient udpClient = new UdpClient(); string sendMsg = “Hello Echo Server”; byte [] sendBytes = Encoding.ASCII.GetBytes(sendMsg); udpClient.Send(sendBytes, sendBytes.Length, “SomeEchoServer.net”, 7); IPEndPoint endPoint = new IPEndPoint(0,0); byte [] rcvBytes = udpClient.Receive(ref endPoint); string rcvMessage = Encoding.ASCII.GetString(rcvBytes, 0, rcvBytes.Length); // should print out “Hello Echo Server” Console.WriteLine(rcvMessage); } } } We make heavy use of the Encoding.ASCII class to translate strings into arrays of byte and vice versa. Also note that we pass an IPEndPoint by reference into the Receive() method. Since UDP is not a con- nection-oriented protocol, each call to Receive() might pick up data from a different endpoint, so Receive() populates this parameter with the IP address and port of the sending host. Both UdpClient and TcpClient offer a layer of abstraction over the lowest of the low-level classes: the Socket. 1087 Accessing the Internet 39 557599 Ch31.qxd 4/29/04 11:43 AM Page 1087 Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com The Socket class The Socket class offers the highest level of control in network programming. One of the easiest ways to demonstrate the class is to rewrite the TcpReceive application with the Socket class. The updated Listen() method is listed in this example: public void Listen() { Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); listener.Bind(new IPEndPoint(IPAddress.Any, 2112)); listener.Listen(0); Socket socket = listener.Accept(); Stream netStream = new NetworkStream(socket); StreamReader reader = new StreamReader(netStream); string result = reader.ReadToEnd(); Invoke(new UpdateDisplayDelegate(UpdateDisplay), new object[] {result} ); socket.Close(); listener.Close(); } The Socket class requires a few more lines of code to complete the same task. For starters, the construc- tor arguments need to specify an IP addressing scheme for a streaming socket with the TCP protocol. These arguments are just one of the many combinations available to the Socket class, and the TcpClient class configured these settings for you. We then bind the listener socket to a port and begin to listen for incoming connections. When an incoming request arrives we can use the Accept() method to create a new socket for handling the connection. We ultimately attach a StreamReader instance to the socket to read the incoming data, in much the same fashion as before. The Socket class also contains a number of methods for asynchronously accepting, connecting, sending, and receiving. You can use these methods with callback delegates in the same way we used the asyn- chronous page requests with the WebRequest class. If you really need to dig into the internals of the socket, the GetSocketOption() and SetSocketOption() methods are available. These methods allow you to see and configure options, including timeout, time-to-live, and other low-level options. Summary In this chapter we have reviewed the .NET Framework classes available in the System.Net namespace for communication across networks. We have seen some of the .NET base classes that deal with opening client connections on the network and Internet, and how to send requests to and receive responses from servers; the most obvious use of this being to receive HTML pages. By taking advantage of COM inter- operability in .NET, you can easily make use of Internet Explorer from your desktop applications. 1088 Chapter 31 39 557599 Ch31.qxd 4/29/04 11:43 AM Page 1088 Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com As a rule of thumb, when programming with classes in the System.Net namespace, you should always try to use the most generic class possible. For instance, using the TCPClient class instead of the Socket class isolates your code from many of the lower-level socket details. Moving one step higher, the WebRequest class allows you to take advantage of the pluggable protocol architecture of.NET Framework. Your code will be ready to take advantage of new application-level protocols as Microsoft and other third- party developers introduce new functionality. Finally, we discussed the use of the asynchronous capabilities in the networking classes, which give a Windows Forms application the professional touch of a responsive user interface. 1089 Accessing the Internet 39 557599 Ch31.qxd 4/29/04 11:43 AM Page 1089 Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com [...]... account that has even more privileges than that of the system administrator Chapter 32 Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com Windows Services don’t run on Windows 95 , 98 , or ME; the NT kernel is a requirement Windows Services do run on Windows NT 4, Windows 2000, Windows XP, and Windows Server 2003 Unless otherwise noted, when we are referring to a service, we are... system On a Windows 2000 Server this program can be accessed be selecting Start➪Programs➪Administrative Tools➪Services; on Windows 2000 Professional and Windows XP the program is accessible through Settings➪Control Panel➪Administrative Tools➪Services Figure 32-1 1 092 Windows Services Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com Windows Ser vices Architecture Three program... The third assembly is the actual service The QuoteService starts and stops the QuoteServer; the service controls the server: Client Server Windows forms Application and Socket client Socket Server «assembly» QuoteClient communicates «assembly» QuoteServer «assembly» QuoteService Windows Service Figure 32-4 Before creating the service part of our program, we create a simple socket server in an extra C#. .. can be passed to the call The constructor where just the file name is passed uses the default port 7 890 for the server The default constructor defines the default file name for the quotes as quotes.txt: public QuoteServer() : this (“quotes.txt”) { } public QuoteServer(string filename) : this(filename, 7 890 ) { } public QuoteServer(string filename, int port) { this.filename = filename; this.port = port;... the constructor, the Start() method of the QuoteServer instance is called Start() returns immediately after having created a thread, so the console application keeps running until Return is pressed: 1 099 Chapter 32 Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com static void Main(string[] args) { QuoteServer qs = new QuoteServer(@”c:\ProCSharp\Services\quotes.txt”, 4567); qs.Start();... requests to services ❑ The ServiceProcessInstaller and ServiceInstaller classes are, as their names suggest, classes to install and configure service programs Now we are ready to create a new service 1 095 Chapter 32 Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com Creating a Windows Ser vice The service that we create will host a quote server With every request that is made from... and to stop it Service Control Manager The SCM is the part of the operating system that communicates with the service Figure 32-2 illustrates how this communication works with a UML sequence diagram 1 093 Chapter 32 Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com SCM start service process Service register service-mains service-main register handler Figure 32-2 At boot time, each... However, all service programs share some similarities The program must be able to start (and to return to the caller), stop, and suspend We will look at such an implementation using a socket server 1 096 Windows Services Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com With Windows 2000 or Windows XP, the Simple TCP/IP Services can be installed as part of the Windows components... be started The service-main function contains the actual functionality of the service One important task of the service-main function is to register a handler with the SCM The handler function is the third part of service program The handler must respond to events from the SCM Services can be stopped, suspended, and resumed, and the handler must react to these events Once a handler has been registered... addition, we are creating an instance of the Random class that will be used to return random quotes: protected void ReadQuotes() { quotes = new StringCollection(); Stream stream = File.OpenRead(filename); 1 097 Chapter 32 Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com StreamReader streamReader = new StreamReader(stream); string quote; while ((quote = streamReader.ReadLine()) != null) . interface. 10 89 Accessing the Internet 39 557 599 Ch31.qxd 4/ 29/ 04 11:43 AM Page 10 89 Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 39 557 599 Ch31.qxd 4/ 29/ 04 11:43 AM Page 1 090 Simpo. the console application keeps running until Return is pressed: 1 099 Windows Services 40 557 599 Ch32.qxd 4/ 29/ 04 11:45 AM Page 1 099 Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com . finished (see Figure 31 -9) . 1084 Chapter 31 39 557 599 Ch31.qxd 4/ 29/ 04 11:43 AM Page 1084 Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com Figure 31 -9 The form consists of

Ngày đăng: 13/08/2014, 15:21

Từ khóa liên quan

Mục lục

  • Professional C#

    • Cover

    • Content

    • Introduction

    • Part I: The C# Language

      • Chapter 1: .NET Architecture

        • The Relationship of C# to .NET

        • The Common Language Runtime

          • Advantages of Managed Code

          • A Closer Look at Intermediate Language

            • Support for Object Orientation and Interfaces

            • Distinct Value and Reference Types

            • Strong Data Typing

            • Error Handling with Exceptions

            • Use of Attributes

            • Assemblies

              • Private Assemblies

              • Shared Assemblies

              • Reflection

              • .NET Framework Classes

                • Namespaces

                • Creating .NET Applications Using C#

                  • Creating ASP.NET Applications

                  • Creating Windows Forms

                  • Windows Services

                  • The Role of C# in the .NET Enterprise Architecture

                  • Summary

                  • Chapter 2: C# Basics

                    • Before We Start

Tài liệu cùng người dùng

Tài liệu liên quan