這東西不少朋友都有寫過了,我也就寫着玩玩,就當作個筆記吧。不廢話了。服務器
TCP/IP在數據通訊中被普遍的使用,天然得包含客戶端和服務端,固然,本身自言自語不是什麼不能夠,可那樣貌似有點神經。spa
好了,那就先來創建服務端吧。blog
一、新建一個項目,就取名叫MyServer吧,而後敲入以下代碼:ip
using System;
using System.Net;
using System.Net.Sockets;string
namespace MyServer
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Server服務已啓動……");
IPAddress ip = Dns.GetHostEntry("localhost").AddressList[0];it
TcpListener listener = new TcpListener(ip, 250);
listener.Start(); // 開始偵聽io
Console.WriteLine("開始監聽……");
Console.WriteLine("\n輸入\"Q\"鍵退出。");
ConsoleKey key;
do
{
key = Console.ReadKey(true).Key;
}
while (key != ConsoleKey.Q);
}
}
}class
好了,運行……顯示服務已啓動。cli
接下來看看咱們監聽的端口號250是否是已經在被監聽狀態。以下圖:服務器端
二、好啦,一切正常。下面開始來編寫客戶端吧。
從新打開一個VS窗口,新建項目MyClient,而後錄入以下代碼:
using System;
using System.Net.Sockets;
namespace MyClient
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("客戶端啓動……");
TcpClient client = new TcpClient();
try
{
//與服務器鏈接
client.Connect("localhost", 250);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return;
}
// 打印鏈接到的服務端信息
Console.WriteLine("已經成功與客戶端創建鏈接!{0} --> {1}", client.Client.LocalEndPoint, client.Client.RemoteEndPoint);
Console.WriteLine("\n輸入\"Q\"鍵退出。");
ConsoleKey key;
do
{
key = Console.ReadKey(true).Key;
}
while (key != ConsoleKey.Q);
}
}
}
看起來一切都是那麼清晰明瞭,好啦,啓動運行——沃日!沒反應?打個斷點跟蹤一下試試?
看到那個異常了不?「因爲目標計算機積極拒絕,沒法鏈接。127.0.0.1:250」
靠,個人目標計算機這麼積極的啊?是防火牆乾的好事嗎?關了——不行,同樣。端口號被佔用了?不能用250?那我換2500呢?多換幾個試試……:-D:-D仍是不能夠的,說明沒有端口號什麼事。那程序運行權限不夠?那我用管理員運行下試試——仍是不行。這玩意兒真是不如WCF那麼省心啊!
好吧,我把這localhost換成IP地址試試。先經過ipconfig看看本身的IP地址是什麼,額,192.168.175.1,好吧,都換了。
服務端的IP那裏換成:
IPAddress ip = IPAddress.Parse("192.168.175.1");
客戶端那換成:
client.Connect(System.Net.IPAddress.Parse("192.168.175.1"), 2500);
再運行試試,通了通了,能夠了誒!看下圖:
呵呵呵,對了,看到上圖中那兩個端口號沒?第一個來自客戶端,是由客戶端自個兒本身隨機分配的,後面那個2500就是咱們監聽的服務器端的端口號(把250-->2500)
其實TCP/IP這東西啊,服務端和客戶端,真是要在茫茫人海中,找到對方不容易啊。即便你知道她家在哪兒,並且還有她們家的鑰匙,要是你在去她們家的路上遇到個程咬金擋路,不讓你過去你也沒辦法。因此,爲了可以順利到她們家,咱們就得想一想其它辦法了。也就是……回頭有空的時候我再來寫一下怎麼確保順利到達她們家吧。