Socket 网络连接
2007-12-13 23:31 Animax! 阅读(522) 评论(0) 编辑 收藏 举报
Socket 是一个用于TCP或UDP通信的类
需要 using System.Net
TcpListener : 从 TCP 网络客户端侦听连接。
打开一个TCP监听:
此时 , 指定的端口开始侦听传入的连接请求.
然后用AcceptTcpClient 方法来挂起TcpListener的线程。 直至有遇到新的TCP连接。
当有TCP链接的时候此方法将返回一个TcpClient 。
TcpClient : 为 TCP 网络服务提供客户端连接。
连接到一个服务器
由IP获取计算机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;
服务器端:
客户端:
需要 using System.Net
TCP :
TcpListener : 从 TCP 网络客户端侦听连接。
打开一个TCP监听:
TcpListener TcpServer = new TcpListener(/*本机IP地址*/, /*本机监听的端口号*/); //新建一个TCP监听类
TcpServer.Start(); //开始监听
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名称
// 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 }
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 }
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 }