2010年12月16日 星期四

[C#] 基本網路技術(三) 建立 TCP 連線

TcpClient 類別 : 提供 TCP 網路服務的用戶端連接。
TcpListener 類別 : 接聽來自 TCP 網路用戶端的連接。
NetworkStream 類別 : 提供網路存取之資料的基礎資料流。

sample1 Server 端應用程式
//匯入命名空間
using System.Net.Sockets;
namespace TestNetworkServer {
class Program {
static void Main(string[] args) {
System.Net.IPAddress theIPAddress;
//建立 IPAddress 物件(本機)
theIPAddress = System.Net.IPAddress.Parse("127.0.0.1");

//建立監聽物件
TcpListener myTcpListener = new TcpListener(theIPAddress, 36000);
//啟動監聽
myTcpListener.Start();
Console.WriteLine("通訊埠 36000 等待用戶端連線...... !!");
Socket mySocket = myTcpListener.AcceptSocket();
do {
try {
//偵測是否有來自用戶端的連線要求,若是
//用戶端請求連線成功,就會秀出訊息。
if (mySocket.Connected) {
int dataLength;
Console.WriteLine("連線成功 !!");
byte[] myBufferBytes = new byte[1000];
//取得用戶端寫入的資料
dataLength = mySocket.Receive(myBufferBytes);

Console.WriteLine("接收到的資料長度 {0} \n ", dataLength.ToString());
Console.WriteLine("取出用戶端寫入網路資料流的資料內容 :");
Console.WriteLine(Encoding.ASCII.GetString(myBufferBytes, 0, dataLength) + "\n");
Console.WriteLine("按下 [任意鍵] 將資料回傳至用戶端 !!");
Console.ReadLine();
//將接收到的資料回傳給用戶端
mySocket.Send(myBufferBytes, myBufferBytes.Length, 0);
}
}
catch (Exception e) {
Console.WriteLine(e.Message);
mySocket.Close();
break;
}

} while (true);
}
}
}

sample2 Client 端應用程式
using System.Net.Sockets;
namespace TestNetworkClient {
class Program {
//宣告網路資料流變數
NetworkStream myNetworkStream;
//宣告 Tcp 用戶端物件
TcpClient myTcpClient;

static void Main(string[] args) {
Program myNetworkClient = new Program();

Console.WriteLine("輸入連接機名稱 : ");
//取得主機名稱
string hostName = Console.ReadLine();
Console.WriteLine("輸入連接通訊埠 : ");
//取得連線 IP 位址
int connectPort = int.Parse(Console.ReadLine());
//建立 TcpClient 物件
myNetworkClient.myTcpClient = new TcpClient();
try {
//測試連線至遠端主機
myNetworkClient.myTcpClient.Connect(hostName, connectPort);
Console.WriteLine("連線成功 !!\n");
}
catch {
Console.WriteLine
("主機 {0} 通訊埠 {1} 無法連接 !!", hostName, connectPort);
return;
}

myNetworkClient.WriteData();
myNetworkClient.ReadData();
Console.ReadKey();
}

//寫入資料
void WriteData() {
String strTest = "this is a test string !!";
//將字串轉 byte 陣列,使用 ASCII 編碼
Byte[] myBytes = Encoding.ASCII.GetBytes(strTest);

Console.WriteLine("建立網路資料流 !!");
//建立網路資料流
myNetworkStream = myTcpClient.GetStream();

Console.WriteLine("將字串寫入資料流 !!");
//將字串寫入資料流
myNetworkStream.Write(myBytes, 0, myBytes.Length);
}

//讀取資料
void ReadData() {
Console.WriteLine("從網路資料流讀取資料 !!");
//從網路資料流讀取資料
int bufferSize = myTcpClient.ReceiveBufferSize;
byte[] myBufferBytes = new byte[bufferSize];
myNetworkStream.Read(myBufferBytes, 0, bufferSize);
//取得資料並且解碼文字
Console.WriteLine(Encoding.ASCII.GetString(myBufferBytes, 0, bufferSize));
}
}
}

轉載自 http://www.dotblogs.com.tw/atowngit/archive/2010/01/16/13047.aspx

沒有留言:

張貼留言