C#實現服務端和客戶端互動
需要建兩個工程 、一個客戶端、一個服務端、
服務端程式碼:
using System;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Collections;
//服務端測試程式碼
namespace SimpleServer
{
class Program
{
static void Main(string[] args)
{
IpType();
}
private static void IpType()
{
//IP地址
IPAddress ipaddr = IPAddress.Parse("127.0.0.1");
IPEndPoint endPoint = new IPEndPoint(ipaddr, 33678);
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//繫結連線,一定要在監聽之前
socket.Bind(endPoint);
//開始監聽,最大支援同時5個連線
socket.Listen(5);
while(true)
{
//如果未檢測到連線,將阻塞,不再繼續執行
Socket clientSocket = socket.Accept();
byte[] data = new byte[512];
//第一次握手,接收到資料確認連結成功
clientSocket.Receive(data, 0, data.Length, SocketFlags.Partial);
string s = System.Text.Encoding.Default.GetString(data);
Console.WriteLine(s.Split('\0')[0]);
//啟動新執行緒處理客戶端的連線資訊
Task.Factory.StartNew(() =>
{
reciiveFromClient(clientSocket);
});
}
}
private static void reciiveFromClient(Socket client)
{
byte[] data;
try
{
while (true)
{
//第二次握手,告訴客戶端,服務端已準備好
client.Send(System.Text.Encoding.Default.GetBytes("GoOn"));
data = new byte[512];
//第三次握手,接受資料
client.Receive(data, SocketFlags.None);
string str = System.Text.Encoding.Default.GetString(data);
if (str.StartsWith("_quit"))
{
//如果檢測到_quit,關閉連線
client.Close();
Console.WriteLine("連線關閉");
break;
}
else
{
//控制檯列印資料
string info = str.Split('\0')[0];
Console.WriteLine("From Client :" + info);
}
}
} catch(SocketException e){
//處理異常
}
}
}
}
客戶端程式碼:
using System;
using System.Net;
using System.Net.Sockets;
//客戶端測試程式碼
namespace SimpleClient
{
class Program
{
static void Main(string[] args)
{
while(true)
{
Client();
//關閉連線後可提示繼續連線
Console.WriteLine("End Client");
Console.WriteLine("是否繼續?是[Y]/否[N]");
string ss = Console.ReadLine();
if(!(ss == "Y" || ss == "y"))
{
break;
}
}
}
private static void Client()
{
String guid = Guid.NewGuid().ToString();//唯一標識
//指定要連線的伺服器IP,本機是127.0.0.1
IPAddress ip = IPAddress.Parse("127.0.0.1");
//埠號
EndPoint ep = new IPEndPoint(ip, 33678);
Socket client = new Socket(SocketType.Stream, ProtocolType.Tcp);
//連線到指定主機
client.Connect(ep);
string s = "Hello, Server,我是:"+ guid;
byte[] data = System.Text.Encoding.Default.GetBytes(s);
//第一次握手,告訴伺服器我已經連線
client.Send(data, SocketFlags.Partial);
while (true)
{
byte[] dataReturn = new byte[512];
//第二次握手,確認服務端已準備好
client.Receive(dataReturn, 0, data.Length, SocketFlags.Partial);
Console.WriteLine("From Server:" + System.Text.Encoding.Default.GetString(dataReturn));
//第三次握手,從鍵盤讀取資料
string info = Console.ReadLine();
//轉換資料型別
data = System.Text.Encoding.Default.GetBytes(info);
//傳輸資料到伺服器
client.Send(data);
if (info.StartsWith("_quit"))
{
break;
}
}
//關閉連線
client.Close();
}
}
}