從零開始學Socket:(三)服務端和客戶端簡單通訊
阿新 • • 發佈:2018-12-21
連線上服務端和客戶端之後,我們就要讓他們互動起來了。(到了現在,大家如果對下面程式碼不懂得地方可以去F12跟蹤至原始碼介面檢視,學習就是這樣)
先在服務端編寫傳送函式和接收函式
/// <summary> /// 傳送資料到客戶端 /// </summary> /// <param name="toClientsocket">用以連線客戶端的Socket</param> /// <param name="msg">要傳遞的資料</param> static void SendMessagesToClient(Socket toClientsocket,string msg) { //只能傳遞byte陣列 byte[] data = System.Text.Encoding.UTF8.GetBytes(msg); toClientsocket.Send(data); }
/// <summary> /// 接收來自客戶端的資料 /// </summary> /// <param name="toClientsocket">用以連線客戶端的Socket</param> static void ReceiveMessages(Socket toClientsocket) { byte[] data = new byte[1024]; int count = toClientsocket.Receive(data); string msg = Encoding.UTF8.GetString(data, 0, count); Console.WriteLine("{0} {1}", "收到來自客戶端的訊息:", msg); }
然後在客戶端編寫接收和傳送資訊的函式
/// <summary> /// 接收來自服務端的訊息 /// </summary> static void ReceiveMessages() { byte[] data = new byte[1024]; int count = clientSocket.Receive(data); string msg = Encoding.UTF8.GetString(data, 0, count); Console.WriteLine("{0} {1}", "收到來自伺服器的訊息:", msg); }
/// <summary>
/// 傳送資訊到服務端
/// </summary>
/// <param name="msg">要傳送的資訊</param>
static void SendMessagetoServer(string msg)
{
//將字串轉為byte陣列
byte[] data = System.Text.Encoding.UTF8.GetBytes(msg);
//傳送到伺服器
clientSocket.Send(data);
}
服務端程式碼
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace Server
{
class Program
{
static Socket serverSocket;
static void Main(string[] args)
{
StartServer();
//暫停
Console.ReadKey();
}
/// <summary>
/// 開啟一個Socket
/// </summary>
static void StartServer()
{
//例項化一個Socket
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//設定IP
IPAddress ipAdress = IPAddress.Parse("127.0.0.1");
//設定網路終結點
IPEndPoint iPEndPoint = new IPEndPoint(ipAdress, 88);
//繫結ip和埠號
serverSocket.Bind(iPEndPoint);
//等待佇列(開始監聽埠號)
serverSocket.Listen(0);
//非同步接受客戶端連線
serverSocket.BeginAccept(AcceptCallBack, serverSocket);
}
/// <summary>
/// 傳送資料到客戶端
/// </summary>
/// <param name="toClientsocket">用以連線客戶端的Socket</param>
/// <param name="msg">要傳遞的資料</param>
static void SendMessagesToClient(Socket toClientsocket,string msg)
{
//只能傳遞byte陣列
byte[] data = System.Text.Encoding.UTF8.GetBytes(msg);
toClientsocket.Send(data);
}
/// <summary>
/// 接收來自客戶端的資料
/// </summary>
/// <param name="toClientsocket"></param>
static void ReceiveMessages(Socket toClientsocket)
{
byte[] data = new byte[1024];
int count = toClientsocket.Receive(data);
string msg = Encoding.UTF8.GetString(data, 0, count);
Console.WriteLine("{0} {1}", "收到來自客戶端的訊息:", msg);
}
/// <summary>
/// 當客戶端連線到伺服器時執行的回撥函式
/// </summary>
/// <param name="ar"></param>
static void AcceptCallBack(IAsyncResult ar)
{
Console.WriteLine("一個客戶端連線進來了。");
//這裡獲取到的是向客戶端收發訊息的Socket
Socket toClientsocket = serverSocket.EndAccept(ar);
//要向客戶端傳送的訊息
string msg = "Hello client!你好。";
//傳送訊息
SendMessagesToClient(toClientsocket, msg);
//接收客戶端傳來的訊息
ReceiveMessages(toClientsocket);
}
}
}
客戶端程式碼
using System;
using System.Text;
using System.Net.Sockets;
using System.Net;
namespace ClientTest
{
class Program
{
//宣告客戶端
static Socket clientSocket;
static void Main(string[] args)
{
StartClient();
ReceiveMessages();
SendMessagetoServer("Hello Server!你好。");
Console.ReadKey();
}
/// <summary>
/// 開啟客戶端並連線到伺服器端
/// </summary>
static void StartClient()
{
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientSocket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 88));
}
/// <summary>
/// 接收來自服務端的訊息
/// </summary>
static void ReceiveMessages()
{
byte[] data = new byte[1024];
int count = clientSocket.Receive(data);
string msg = Encoding.UTF8.GetString(data, 0, count);
Console.WriteLine("{0} {1}", "收到來自伺服器的訊息:", msg);
}
/// <summary>
/// 傳送資訊到服務端
/// </summary>
/// <param name="msg">要傳送的資訊</param>
static void SendMessagetoServer(string msg)
{
//將字串轉為byte陣列
byte[] data = System.Text.Encoding.UTF8.GetBytes(msg);
//傳送到伺服器
clientSocket.Send(data);
}
}
}
執行結果