建立tcp服務器
1.開啓服務
// 創建負責監聽的套接字,注意其中的參數;
Socket Listensocket= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 獲得文本框中的IP對象;
IPAddress address = IPAddress.Parse("127.0.0.1");
// 創建包含ip和端口號的網絡節點對象;
IPEndPoint endPoint = new IPEndPoint(address, int.Parse("8000"));
// 將負責監聽的套接字綁定到唯一的ip和端口上;
Listensocket.Bind(endPoint);
// 設置監聽隊列的長度;
Listensocket.Listen(200);
// 創建負責監聽的線程;
Thread threadWatch = new Thread(ListenConnecting);
//是否爲後臺線程
Thread threadWatch.IsBackground = true;
//線程開始
Thread threadWatch.Start();
2.監聽線程
/// <summary>
/// 存放申請連接的客戶端
/// </summary>
public static Socket[] Clientsocket = new Socket[200];
public static void ListenConnecting()
{
// 持續不斷的監聽客戶端的連接請求;
while (true)
{
//請求的連接,爲阻塞的模式,無請求一直阻塞線程
Socket sokConnection = Listensocket.Accept();
//存入數組
for(int i=0;i<Clientsocket.length;i++){
if(Clientsocket[i]==null){
Clientsocket[i]=sokConnection;
break;
}
}
//建立接收數據的線程
Thread thread = new Thread(RecMsg);
thread.IsBackground = true;
//傳入Socket對象
thread.Start(sokConnection);
}
}
3.接收數據線程
/// <summary>
/// 接收數據
/// </summary>
/// <param name="sokConnectionparn"></param>
public static void RecMsg(object sokConnectionparn)
{
//實例化Socket對象
Socket sokClient = sokConnectionparn;
//定義接收數組
byte[] arrMsgRec = new byte[128];
while (true)
{
try
{
//接收客戶端數據
int lengths = sokClient.Receive(arrMsgRec);
}
catch (SocketException ex)
{
//一方斷開連接
break;
}
if(lengths>0){
//做數據處理
} \
else {
//沒有任何數據
}
}
}
4.發送數據
/// <summary>
/// 發送指令
/// </summary>
/// <param name="strMsg"></param>
/// <param name="socket"></param>
/// <returns></returns>
public static bool SendData(string strMsg, Socket socket)
{
// 將要發送的字符串轉換成Utf-8字節數組;
byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg);
try
{
socket.Send(arrMsg);
return true;
}
catch (Exception see)
{
return false;
}
}
5.關閉TCP服務
/// <summary>
/// 關閉TCP服務
/// </summary>
/// <param name="sokClient"></param>
public static void CloseTCPserver(Socket sokClient)
{
sokClient.Shutdown(SocketShutdown.Both);
sokClient.Close();
}