c#的網(wǎng)絡(luò)編程比較簡(jiǎn)單假瞬,有相關(guān)的類來(lái)實(shí)現(xiàn)相關(guān)的功能陕靠。
本小程序是<<c#網(wǎng)絡(luò)編程>>里面的。
基本的類介紹
tcpClient
TcpClient 類提供了一些簡(jiǎn)單的方法脱茉,用于在同步阻止模式下通過(guò)網(wǎng)絡(luò)來(lái)連接剪芥、發(fā)送和接收流數(shù)據(jù)。
為使 TcpClient 連接并交換數(shù)據(jù)琴许,使用 TCP ProtocolType 創(chuàng)建的 TcpListener 或 Socket 必須偵聽(tīng)是否有傳入的連接請(qǐng)求税肪。 可以使用下面兩種方法之一連接到該偵聽(tīng)器:
創(chuàng)建一個(gè) TcpClient,并調(diào)用三個(gè)可用的 Connect 方法之一榜田。
使用遠(yuǎn)程主機(jī)的主機(jī)名和端口號(hào)創(chuàng)建 TcpClient益兄。 此構(gòu)造函數(shù)將自動(dòng)嘗試一個(gè)連接。
tcpListener
TcpListener 類提供一些簡(jiǎn)單方法箭券,用于在阻止同步模式下偵聽(tīng)和接受傳入連接請(qǐng)求净捅。 可使用 TcpClient 或 Socket 來(lái)連接 TcpListener。 可使用 IPEndPoint辩块、本地 IP 地址及端口號(hào)或者僅使用端口號(hào)灸叼,來(lái)創(chuàng)建 TcpListener。 可以將本地 IP 地址指定為 Any庆捺,將本地端口號(hào)指定為 0(如果希望基礎(chǔ)服務(wù)提供程序?yàn)槟峙溥@些值)古今。 如果您選擇這樣做,可在連接套接字后使用 LocalEndpoint 屬性來(lái)標(biāo)識(shí)已指定的信息滔以。
使用 Start 方法捉腥,可開(kāi)始偵聽(tīng)傳入的連接請(qǐng)求。 Start 將對(duì)傳入連接進(jìn)行排隊(duì)你画,直至您調(diào)用 Stop 方法或它已經(jīng)完成 MaxConnections 排隊(duì)為止抵碟。 可使用 AcceptSocket 或 AcceptTcpClient 從傳入連接請(qǐng)求隊(duì)列提取連接。 這兩種方法將阻止坏匪。 如果要避免阻止拟逮,可首先使用 Pending 方法來(lái)確定隊(duì)列中是否有可用的連接請(qǐng)求。
調(diào)用 Stop 方法來(lái)關(guān)閉 TcpListener适滓。
還需要理解線程敦迄,委托和事件。
服務(wù)器端
有一個(gè)listener類來(lái)監(jiān)聽(tīng)凭迹,Sender類來(lái)發(fā)送消息罚屋。
listener類關(guān)鍵代碼
private void Listen()
{
try
{
IPAddress addr = IPAddress.Parse(Form1.ipaddress);
IPEndPoint ipLocalEndPoint = new IPEndPoint(addr, 5656);//服務(wù)器端需要使用endpoint
tcp1 = new TcpListener(ipLocalEndPoint);
tcp1.Start();
while(listenerRun)//開(kāi)始進(jìn)行監(jiān)聽(tīng)
{
Socket s = tcp1.AcceptSocket();
string remote = s.RemoteEndPoint.ToString();
Byte[] stream = new Byte[1024];
int i = s.Receive(stream);
string msg;
string str = System.Text.Encoding.UTF8.GetString(stream);
//MessageBox.Show(str);
if(str.Substring(0,1) == "1")
{
string str_ = "歡迎登陸!";
TcpClient tcpc = new TcpClient(((IPEndPoint)s.RemoteEndPoint).Address.ToString(), 5657);
NetworkStream tcpStream = tcpc.GetStream();
Byte[] data = System.Text.Encoding.UTF8.GetBytes(str_);//將字符串轉(zhuǎn)為byte
tcpStream.Write(data, 0, data.Length);
tcpc.Close();
msg = "<" + remote + ">" + "上線";
AddMessageEventArgs arg = new AddMessageEventArgs();
arg.mess = msg;
OnAddMessage(this, arg);
}
else if(str.Substring(0,1)=="0")
{
msg = "<" + remote + ">" + "斷開(kāi)";
AddMessageEventArgs argRe = new AddMessageEventArgs();
argRe.mess = remote.ToString();
OnIpRemod(this, argRe);
AddMessageEventArgs arg = new AddMessageEventArgs();
arg.mess = msg;
OnAddMessage(this, arg);
}
else
{
msg = "<" + remote + ">" + System.Text.UTF8Encoding.UTF8.GetString(stream);
AddMessageEventArgs arg = new AddMessageEventArgs();
arg.mess = msg;
OnAddMessage(this, arg);
}
}
}
sender關(guān)鍵代碼
public void Send(string str)//需要發(fā)送的字符串
{
try
{
TcpClient tcpc = new TcpClient(obj, 5657);
NetworkStream tcpStream = tcpc.GetStream();
Byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(str);
tcpStream.Write(data, 0, data.Length);
tcpStream.Close();
}
catch(Exception)
{
MessageBox.Show("連接被目標(biāo)主機(jī)拒絕");
}
}
客戶端
listener類關(guān)鍵代碼
private void Listen()
{
try
{
IPAddress addr = IPAddress.Parse(Form1.ipaddress);
IPEndPoint ipLocalEndPoint = new IPEndPoint(addr, 5657);
tcp1 = new TcpListener(ipLocalEndPoint);
tcp1.Start();
while(listenerRun)
{
Socket s = tcp1.AcceptSocket();
string remote = s.RemoteEndPoint.ToString();
Byte[] stream = new Byte[1024];
int i = s.Receive(stream);
string msg = "<" + remote + ">" + System.Text.UTF8Encoding.UTF8.GetString(stream);
AddMessageEventArgs arg = new AddMessageEventArgs();
arg.mess = msg;
OnAddMessage(this, arg);
// MessageBox.Show(msg);
}
}
catch(System.Security.SecurityException)
{
MessageBox.Show("防火墻禁止連接");
}
catch(Exception)
{
MessageBox.Show("監(jiān)聽(tīng)已經(jīng)停止");
}
}
}
提供文件下載
鏈接: http://pan.baidu.com/s/1skYeq6L 密碼: 93yg