第二章、C#控制檯實現一對一聊天&C#使用socket一對一通訊&C#socket類的簡單封裝
阿新 • • 發佈:2020-12-25
技術標籤:C#網路通訊系列學習筆記c#socket網路通訊網路
C#網路通訊系列學習筆記
第二章、C#控制檯實現一對一聊天
前言
在上一章中,我們只實現了最簡單的socket通訊,只有單次收發過程,在這一篇文章中,將會通過對Socket簡單封裝實現控制檯的多發多收通訊
一、socket簡單封裝
using System;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;
namespace ConsoleTest
{
class SocketTest
{
private Socket MySocket;
//開啟一個執行緒迴圈執行接收方法來實時接收資料
private Thread ReceiveThread;
//用於客戶端連線服務端
public bool Connect(IPAddress iP, int port)
{
try
{
MySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint endPoint = new IPEndPoint(iP, port);
MySocket.Connect(endPoint);
return true;
}
catch
{
return false;
}
}
//用於服務端監聽
public void Listen(IPAddress ip, int port)
{
Socket socketwatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint endPoint = new IPEndPoint(ip, port);
socketwatch.Bind(endPoint);
socketwatch.Listen(1);//開始監聽,引數表示最大允許幾臺主機連線我
Console.WriteLine("開始監聽 埠號:" + port);
MySocket = socketwatch.Accept();//如果有客戶端連線,就會返回這個客戶端的sockeet物件
}
public bool Send(string str)
{
try
{
byte[] arrsendmsg = Encoding.UTF8.GetBytes(str);
if (MySocket.Send(arrsendmsg) != arrsendmsg.Length)
return false;
return true;
}
catch
{
return false;
}
}
public void recmsg()
{
while (true)
{
try
{
byte[] arrserverrecmsg = new byte[1024];
int length = MySocket.Receive(arrserverrecmsg);
if (length > 0)
{
Console.WriteLine("對方:" + Encoding.UTF8.GetString(arrserverrecmsg, 0, length));
}
}
catch
{
Console.WriteLine("對方連線已斷開");
return;
}
Thread.Sleep(200);
}
}
public void StartReceive()
{
ReceiveThread = new Thread(recmsg);
ReceiveThread.Start();
}
public void ColseSocket()
{
//如果接收執行緒正在執行那麼先關閉執行緒在關閉socket
if (ReceiveThread.ThreadState == ThreadState.Running)
ReceiveThread.Abort();
MySocket.Close();
}
}
}
二、使用步驟
1.客戶端
程式碼如下(示例):
using System;
using System.Net;
namespace ConsoleTest
{
class Program
{
static void Main(string[] args)
{
SocketTest mySocket = new SocketTest();
if (!mySocket.Connect(IPAddress.Parse("127.0.0.1"), 20000))
{
Console.WriteLine("網路連線失敗");
return;
}
mySocket.StartReceive();
string myMsg;
while ((myMsg = Console.ReadLine()) != "exit")
{
mySocket.Send(myMsg);
}
mySocket.ColseSocket();
}
}
}
2.服務端
程式碼如下(示例):
using System;
using System.Net;
namespace ConsoleTest
{
class Program
{
static void Main(string[] args)
{
SocketTest socketTest = new SocketTest();
socketTest.Listen(IPAddress.Any, 20000);
Console.WriteLine("有客戶端連線了,開始聊天吧");
socketTest.StartReceive();
string myMsg;
while ((myMsg = Console.ReadLine()) != "exit")
{
socketTest.Send(myMsg);
}
socketTest.ColseSocket();
}
}
}
三、演示
小提示:輸入exit是會直接退出的哦!
總結
以上就是今天分享的內容,這篇文章通過對socket進行了簡單的封裝實現了客戶端和服務端都可以同時使用並且支援多發多收。
只是有一個小缺點,當你正在打字的時候,對方突然給你發一條訊息,那麼你打字的這一行後面就會追加上對方的訊息哦,不過這樣並不影響傳送,只是顯得不太優雅。
在下一篇文章中,將會繼續在這一篇程式碼的基礎上修改,實現一個簡單的介面聊天室,讓多個人參與到聊天當中!