1. 簡介
1) 流程
2) 服務端程序特點
Ø 一般啓動後就一直處於運行狀態,以等待客戶端進程的請求
Ø 使用的端口往往是熟知端口,便於客戶機進程連接請求
Ø 一般擁有較多的系統資源,以便及時響應各個客戶機進程的請求
Ø 可以並行處理多個客戶機進程的請求,但數目是有一定的限制
Ø 在通信時一般處於被動的一方,不需要知道客戶機的IP地址和端口信息
3) 客戶端程序特點
Ø 在需要服務端進程的服務時將向服務器進程請求服務,並建立通信連接,得到滿足並完成處理後就終止通信連接
Ø 使用向系統申請的臨時端口與服務端進程進行通信,通信完成後將釋放該端口
Ø 擁有相對較少的系統資源
Ø 在通信時屬於主動地一方,需要事先知道服務端的IP地址和端口信息
4) 套接字
套接字可以理解爲通信連接的一端,其主要包括協議、主機IP地址和端口號,將兩個套接字連接到一起便可以再不同應用進程之間傳遞數據,因此套接字實現了對網絡和傳輸層協議的封裝,爲應用進程之間的通信連接的建立、數據傳輸等通信過程提供了編程界面,使用套接字進行通信示意圖爲:
5) 工作模型
2. 創建工程
文件à新建à項目
在模板中選中控制檯應用程序,輸入名稱後,單擊瀏覽選擇保存的位置,單擊確定,同樣的方法建立好客戶端的工程
3. 服務端
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace server
{
class Program
{
static void Main(string[] args)
{
try
{
IPAddress Ip = IPAddress.Parse("127.0.0.1");
//IPAddress提供網際協議地址的類,Parse將IP地址字符串轉換爲IPAddress的實例
TcpListener TcpList = new TcpListener(Ip, 8888);
//TcpListener網絡偵聽類,從TCP網絡客戶端偵聽連接,TcpListener (參數1,參數2),參數1表示本地IP地址,參數2表示用來偵聽傳入的端口連接
TcpList.Start();
//啓動對掛起連接數的傳入鏈接請求的偵聽
Console.WriteLine(“Server start!”);
Console.WriteLine(“Ip address:” + TcpList.LocalEndpoint);
//LocalEndpoint獲取服務端(即本地)地址與端口等信息
Console.WriteLine(“Wait”);
Socket Soc = TcpList.AcceptSocket();
//AcceptSocket表示接受掛起的連接請求,Socket爲套接字接口的類
Console.WriteLine("Received Connection:" + Soc.RemoteEndPoint);
//RemoteEndPoint獲取客戶端地址與端口等信息
byte[] b = new byte[100];
int k = Soc.Receive(b);
//Soc.Receive(b)從socket接收數據,將數據存入接收緩衝區列表中,k的值爲該數據的長度
Console.WriteLine(“Received data from client:”);
for (int i = 0; i < k; i++)
Console.Write(Convert.ToChar(b[i]));
//Convert.ToChar(b[i])將數組b轉換基本數據類型爲char的類型並輸出
ASCIIEncoding AS = new ASCIIEncoding();
//ASCIIEncoding表示Unicode字符的ASCII字符編碼類
Soc.Send(AS.GetBytes(“Received data!”));
//Soc.Send向客戶端發送數據,AS.GetBytes()獲得括號中字符串的bytes值
Soc.Close();
//關閉連接並釋放所有關聯的資源
TcpList.Stop();
//關閉偵聽
Console.ReadLine();
//等待輸入,起到暫停的作用
}
catch(Exception e)
{
Console.WriteLine("Error!" + e.StackTrace);
//獲取當前異常發生時調用堆棧上的幀的字符串
}
}
}
}
4. 客戶端
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
using System.Net.Sockets;
namespace client
{
class Program
{
static void Main(string[] args)
{
try
{
TcpClient TcpClient = new TcpClient();
//TcpClient爲TCP網絡服務提供客戶端連接的類
TcpClient.Connect("127.0.0.1", 8888);
//Connect方法使用指定的IP地址和端口號將客戶端連接到遠程TCP主機
Console.WriteLine("Connect Complete");
Console.WriteLine("Input string:");
String str = Console.ReadLine();
//定義字符串str變量,保存輸入的字符
Stream stm = TcpClient.GetStream();
//定義數據流,用於發送和接收數據
ASCIIEncoding AS = new ASCIIEncoding();
byte[] b = AS.GetBytes(str);
//將字符串轉換爲byte類型
stm.Write(b, 0, b.Length);
//Write(參數1,參數2,參數3)表示向服務端發送字符串,參數1指將此數組複製到當前流,參數2指從零開始的字節偏移量,參數3指要寫入當前流的字節數(即字符串長度)
Console.WriteLine("Send Complete");
byte[] bb = new byte[100];
int k = stm.Read(bb, 0, 100);
//stm.Read在當前流中讀入服務端發來的響應信息,其參數與Write方法參數一致,k值爲讀入字符串的長度
for (int i = 0; i < k; i++)
Console.Write(Convert.ToChar(bb[i]));
TcpClient.Close();
//釋放TcpClient實例,並不關閉基礎連接
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine("Error!" + e.StackTrace);
}
}
}
}
5. 測試
運行服務端,提示服務端已啓動,IP地址爲127.0.0.1,使用的端口爲8888,等待客戶端的連接
運行客戶端,提示連接服務端完成,等待輸入需發送的信息
客戶端運行後,在服務端上出現客戶端地址爲127.0.0.1,使用的端口爲2094
輸入信息hello後回車發送,提示發送完成,並收到由服務器發來的確認接收信息
服務器接收到來自客戶端發送的hello