Socket程式設計-TCP實現簡單聊天程式
在System.net.Sockets的名稱空間中,TcpListener類與TcpClient類是兩個專門用於TCP協議程式設計的類,它們封裝了底層的套接字並分別提供了用Socket進行同步和非同步通訊的方法,降低了TCP應用程式設計的難度。
在網路應用程式設計中,利用TCP協議編寫的程式非常多,例如網路遊戲,網路辦公,股票交易,網路通訊等。
1、TcpListener類
監聽器,用於監聽和接受傳入的連線請求。
建構函式:TcpListener(IPEndPoint p)
其中,引數p為IPEndPoint型別的物件,其包含了服務區端的IP地址與埠號,引數address和port正好組成端點。最終,監聽器通過指定端點來監聽傳入的連線請求。
為了監聽客戶端的連線請求,TcpListener分別提供了同步與非同步方法。
AcceptTcpClient方法用於在同步方式下返回一個封裝了套接字TcpClient物件。
Start方法用於啟動監聽。
Stop方法用於停止監聽請求,原型:public void Stop()。執行Stop方法後,會立即停止監聽客戶端連線請求,並關閉底層的Socket物件。等待佇列中的請求將會丟失,等待接受連線請求的遠端主機會丟擲套接字異常。
2、TcpClient類
利用TcpClient類提供的方法,可以連線,傳送和接收網路資料流,其建構函式有
TcpClient(IPEndPoint p)
TcpClient()
編寫一個伺服器端和客戶端通訊的小程式,說明利用TCP協議和同步套接字編寫網路應用程式方法。
首先啟動服務端,輸入要監聽的埠號,單擊開始按鈕啟動監聽,接下來啟動客戶端,輸入伺服器的IP地址和埠號,連線到伺服器,接下來雙方就可以對話了。之後,如果單擊客戶端和伺服器端終止按鈕,即可終止對話。
執行結果:(上面伺服器端,下面客戶端)
原始碼:
伺服器端:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net; using System.Net.Sockets; namespace Socket_Server { public partial class Form1 : Form { static TcpClient client = null; //客戶端物件,用來接受或傳送資訊 TcpListener server = null; //監聽器物件,用來監聽TCP連線 static NetworkStream stream = null; //流物件,完成接受或傳送訊息操作 public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { int port = int.Parse(textPort.Text); IPEndPoint p = new IPEndPoint(IPAddress.Any, port); //建立TCP連線的端點 server = new TcpListener(p); //初始化TcpListener的新例項 server.Start(); //開始監聽客戶端的請求 lblShow.Items.Add("服務端已啟動!"); client = server.AcceptTcpClient(); //執行掛起和接受連線請求,獲得客戶端物件 lblShow.Items.Add("已連線客戶端!"); } private void button2_Click(object sender, EventArgs e) { Byte[] msg = Encoding.UTF8.GetBytes(textMessage.Text); stream = client.GetStream(); //獲取用於讀取和寫入的流物件 stream.Write(msg, 0, msg.Length); //向客戶端傳送一個響應資訊 } private void button3_Click(object sender, EventArgs e) { Byte[] bytes = new Byte[256]; //快取讀入的資料 stream = client.GetStream(); //獲取用於讀取和寫入的流物件 stream.Read(bytes, 0, bytes.Length); //讀取來自客戶端的資訊 string data = Encoding.UTF8.GetString(bytes, 0, bytes.Length); lblShow.Items.Add("客戶端:" + data); } private void button4_Click(object sender, EventArgs e) { if (stream != null) stream.Close(); if (server != null) server.Stop(); if (client != null) client.Close(); } } }
客戶端:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
namespace Socket_Client
{
public partial class Form1 : Form
{
static TcpClient client = null; //客戶端物件,用來接收或傳送訊息
static NetworkStream stream = null; //流物件,完成接受或傳送訊息的操作
public Form1()
{
InitializeComponent();
}
private void label3_Click(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
string strIp = textAddress.Text;
int port = int.Parse(textPort.Text);
client = new TcpClient(); //建立TCP客戶端
client.Connect(strIp, port); //連線伺服器
}
private void button2_Click(object sender, EventArgs e)
{
byte[] msg = Encoding.UTF8.GetBytes(textMessage.Text);
stream = client.GetStream(); //獲取用於讀取和寫入的流物件
stream.Write(msg, 0, msg.Length); //向伺服器端傳送一個響應資訊
}
private void button3_Click(object sender, EventArgs e)
{
byte[] bytes = new byte[256]; //快取讀入的資料
stream = client.GetStream(); //獲取用於讀取和寫入的流物件
stream.Read(bytes, 0, bytes.Length); //讀取來自伺服器端的資訊
string data = Encoding.UTF8.GetString(bytes, 0, bytes.Length);
lblShow.Items.Add("服務端: " + data);
}
private void button4_Click(object sender, EventArgs e)
{
if(stream != null)
stream.Close();
if(client != null)
client.Close();
}
}
}