您的位置:首页 > 编程语言 > C#

C# Socket编程 服务端与客户端(二)

2016-11-16 09:22 351 查看
在(一)中已经有了客户端,这里就不再介绍,这一篇中我们在服务端中加上多线程,结果会与(一)中有很大的不同,仔细比较,体会。与(一)不同的是每接收到一个socket连接,服务端就将处理的操作抛到一个新的线程里去执行,这样就不会产生(一)中的排队现象。

本篇客户端结果:



本篇服务端结果:



改变后的服务端代码:

static void Main(string[] args)
{
Socket m_svrSock = null;
IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 3800);
m_svrSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
m_svrSock.Bind(endPoint);
m_svrSock.Listen(100);
Console.WriteLine("Listen Up...");

while (true)
{
Socket client;
client = m_svrSock.Accept();
if (!client.Poll(-1, SelectMode.SelectRead))
{
continue;
}
new Thread(new ParameterizedThreadStart(serverThread)).Start(client);
}
}
volatile static int customerCount = 1;

[ThreadStatic]
private static string threadId;

static void serverThread(object client)
{
threadId = Thread.CurrentThread.GetHashCode() + "";
Socket clientSocket = (Socket)client;
Console.WriteLine(threadId + "Customer:" + customerCount);
customerCount++;
int lineCount = 0;
byte[] receive = new byte[7];
while (true)
{
Thread.Sleep(500);
Console.WriteLine(threadId + "line:" + lineCount);
if (!clientSocket.Poll(-1, SelectMode.SelectRead))
{
lineCount++;
continue;
}
if (clientSocket.Receive(receive, 7, SocketFlags.None) == 0)
{
Console.WriteLine(threadId + "no data here!The customer has closed his client!");
break;
}
Console.WriteLine(threadId + "socket here...");
string lengthStr = Encoding.UTF8.GetString(receive, 4, 3);
int length = int.Parse(lengthStr);
byte[] receiveBody = new byte[length];
clientSocket.Receive(receiveBody, length, SocketFlags.None);
Console.WriteLine(threadId + "line:" + lineCount + Encoding.UTF8.GetString(receiveBody));
lineCount++;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息