C# Socket通信
Socket簡介
Socket又稱套接字,它是處于應用層和傳輸層之間的一個抽象接口。它封裝了TCP/UDP等的底層協議,通過它我們就可以實現應用程序或者進程之間(它們可以處在網絡上的不同位置)的通信。

Socket的表示方法
因為Socket是兩個程序之間的通信,只需要給定IP地址和端口號就可以進行通信。
Socket= (IP,PORT)
Socket(TCP)的工作流程

可以看到,總的工作流程就是:
- 服務端監聽
- 客戶端(可以有多個)請求連接
- 確認連接進行通信
針對服務器端的工作流程是:
- 建立Socket對象
- Bind(ip, port)綁定端口。比如說本地的(127.0.0.1, 6666)
- Listen()開始監聽
- Accept()接受客戶端連接
- Send()和Receive()進行通信
- Close()關閉套接字
而針對客戶端的工作流程是:
- 建立Socket對象
- Connet(ip, port)向某個IP下的PORT端口發起連接請求,接受后開始通信
- Send()和Receive()進行通信
- Close() 關閉套接字
關于IPAddress.Parse("127.0.0.1") 和 Address.Any的問題,詳見;
https://blog.csdn.net/u010178308/article/details/77650919
代碼下載:https://github.com/urahyou/C-Sharp-Socket-example/tree/master
Server端代碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.Net;
using System.Threading;
namespace socket
{
class Program
{
static Socket serverSocket;
static void Main(string[] args)
{
SetListen(); //開始監聽
}
static void SetListen()
{
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
//這里最好改成IPAddress.Any, 這樣放到服務器上就會同時監聽所有網卡上的端口,比如有內外雙網的服務器
serverSocket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8888));
serverSocket.Listen(2);
Thread thread = new Thread(Listen);
thread.Start(serverSocket);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
static void Listen(object so)
{
Socket serverSocket = so as Socket;
while (true)
{
try
{
Socket clientSocket = serverSocket.Accept(); //接受客戶端接入
// 獲取鏈接IP地址
string clientPoint = clientSocket.RemoteEndPoint.ToString();
//開啟新線程來不停接受信息
Thread rec = new Thread(Receive);
rec.Start(clientSocket);
//開啟新線程來不停發送信息
Thread sen = new Thread(Send);
sen.Start(clientSocket);
}
catch(Exception ex)
{
Console.WriteLine(ex.Message, ex);
break;
}
}
serverSocket.Close();
}
static void Receive(object so)
{
Socket clientSocket = so as Socket;
string clientPoint = clientSocket.RemoteEndPoint.ToString();
while (true)
{
try
{
byte[] buffer = new byte[1024];
int len = clientSocket.Receive(buffer);
//Console.WriteLine(len.ToString(), buffer);
if (len == 0) break;
string msg = Encoding.UTF8.GetString(buffer, 0, len);
Console.WriteLine("客戶端說:"+ msg);
}
catch(Exception ex)
{
Console.WriteLine(ex);
}
}
}
static void Send(object so)
{
Socket clientSocket = so as Socket;
while (true)
{
//獲取控制臺輸入
string input = Console.ReadLine();
byte[] msg = Encoding.UTF8.GetBytes(input);
clientSocket.Send(msg);
}
}
}
}
Client端代碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace socket_client
{
class Program
{
static Socket clientSocket;
static void Main(string[] args)
{
Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//連接
Connect();
}
//連接客戶端,連接后開始監聽發送過來的消息并且把輸入的信息發給服務端
static void Connect()
{
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
//連接
clientSocket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8888));
//獨立線程來接受來自服務端的數據
Thread receive = new Thread(Receive);
receive.Start(clientSocket);
//獨立線程來發送數據給服務端
Thread send = new Thread(Send);
send.Start(clientSocket);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
static void Receive(object so)
{
Socket clientSocket = so as Socket;
while (true)
{
Console.ForegroundColor = ConsoleColor.Green; // 修改文字顏色為綠色
try
{
byte[] buffer = new byte[1024];
int len = clientSocket.Receive(buffer);
if (len > 0)
{
string msg = Encoding.UTF8.GetString(buffer);
Console.WriteLine("服務端說:"+ msg);
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
break;
}
}
clientSocket.Close();
}
static void Send(object so)
{
Socket clientSocket = so as Socket;
while (true) // 監聽鍵盤輸入
{
Console.ForegroundColor = ConsoleColor.Red;
//獲取鍵盤輸入
string input = Console.ReadLine();
//編碼
byte[] buffer = Encoding.UTF8.GetBytes(input);
//發送
clientSocket.Send(buffer);
}
}
}
}

浙公網安備 33010602011771號