代码改变世界

Socket 网络连接

2007-12-13 23:31  Animax!  阅读(522)  评论(0编辑  收藏  举报
Socket 是一个用于TCP或UDP通信的类
需要 using System.Net

TCP :


TcpListener : 从 TCP 网络客户端侦听连接。

打开一个TCP监听:
TcpListener TcpServer = new TcpListener(/*本机IP地址*//*本机监听的端口号*/); //新建一个TCP监听类
TcpServer.Start();  //开始监听


此时 , 指定的端口开始侦听传入的连接请求.
然后用AcceptTcpClient 方法来挂起TcpListener的线程。 直至有遇到新的TCP连接。
当有TCP链接的时候此方法将返回一个TcpClient 。



TcpClient : 为 TCP 网络服务提供客户端连接。

连接到一个服务器
TcpClient tcpClient = new TcpClient(/*远端计算机(服务器)的DNS名*//*远端计算机(服务器)的端口号*/);

由IP获取计算机DNS名
IPHostEntry ipHost = Dns.Resolve(/*计算机的IP地址 string*/); //解析IP地址
// IPHostEntry : 为 Internet 主机地址信息提供容器类。

ipHost.HostName 
// 从这里获取主机的DNS名称

当得到一条连接好的TcpClient后,就需要使用GetStream 方法来获取 用于发送和接收数据的 NetworkStream 。

NetworkStream : 提供用于网络访问的基础数据流。

NetworkStream 类有读方法 Read 、ReadByte 和写方法 Write 、WriteByte 。
这些方法都是以 Byte 来作传递的。

如果需要传递处理string字符串,则可把NetworkStream 转为 StreamReader 和 StreamWriter 。


StreamReader :实现一个 TextReader,使其以一种特定的编码从字节流中读取字符
       TextReader: 表示可读取连续字符系列的读取器。

StreamWriter :实现一个 TextWriter,使其以一种特定的编码向流中写入字符。
       TextWriter: 表示可以编写一个有序字符系列的编写器。该类为抽象类。


示例
需要 :
using System.Net
using System.Net.Sockets;
using System.Threading;
using System.IO;

服务器端:
 1     class Program //主线程
 2     {
 3         const int PortNum = 1234//监听端口号
 4 
 5         static void Main(string[] args)
 6         {
 7             Console.WriteLine("开始监控");
 8 
 9             TcpListener Listener = new TcpListener(GetIpAddress(), PortNum); // 建立TCP监听 , GetIpAddress : 本机IP
10             Listener.Start(); //打开监听
11 
12             while (true)    // 循环等待连接
13             {
14                 TcpClient Client = Listener.AcceptTcpClient(); // 挂起直至有TCP连接接入
15                 NetworkStream Stream = Client.GetStream(); // 取得链接的数据流
16 
17                 TCPWork tcpWork = new TCPWork(Stream); // 传入此链接的数据流
18 
19                 Thread DoWork = new Thread(tcpWork.Work); // 建立一条线程
20                 DoWork.IsBackground = true// 转为后台线程
21                 DoWork.Start(); // 开始线程
22             }
23         }
24 
25 
26 
27         /// <summary>
28         /// 获取本机IP
29         /// </summary>
30         /// <returns></returns>
31         static IPAddress GetIpAddress()
32         {
33             string name = Dns.GetHostName(); // 本机主机名
34             IPHostEntry me = Dns.GetHostByName(name);
35 
36             IPAddress IpAddress = null ; 
37             //找到本机网卡IP 
38             foreach (IPAddress ip in me.AddressList) // 注: 若本机有多个IP , 小心处理
39             {
40                 IpAddress = ip;
41             }
42             return IpAddress;
43         }
44     }
45 
46 
47     class TCPWork 
48     {
49         private NetworkStream Stream; //连接的数据流
50         public TCPWork(NetworkStream Stream)
51         {
52             this.Stream = Stream;
53         }
54 
55         /// <summary>
56         /// 工作过程
57         /// </summary>
58         public void Work()
59         {
60             byte[] bytes = new byte[1024];//建立缓冲区 
61 
62             while (true//循环接受数据
63             {
64                 int bytesRead = Stream.Read(bytes, 0, bytes.Length);// 挂起 直到有数据进入
65                 // Encoding.ASCII.GetString(bytes, 0, bytesRead);  // byte[] 转为string 
66 
67                 // 其他操作
68             }
69         }
70     }


客户端:
 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Console.WriteLine("输入服务器IP地址");
 6             string IP = Console.ReadLine(); //获取IP地址
 7             Console.WriteLine("输入服务器端口号");
 8             int Port = int.Parse(Console.ReadLine()); //获取端口号
 9 
10             IPHostEntry ipHost = Dns.Resolve(IP); //解析IP地址
11 
12             TcpClient Client = new TcpClient(ipHost.HostName, Port); // 打开链接
13 
14             NetworkStream Stream = Client.GetStream(); //成功连接 
15             StreamWriter Writer = new StreamWriter(Stream);
16 
17             Console.WriteLine("输入传送字符串");
18             Writer.WriteLine(Console.ReadLine());  // 写入到输出流.
19             // Writer.Write(Console.ReadLine()); 
20             Writer.Flush(); //传送出去
21 
22         }
23     }