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++;
}
}
本篇客户端结果:
本篇服务端结果:
改变后的服务端代码:
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++;
}
}
相关文章推荐
- C# socket编程 异步服务端 同步客户端
- C# socket编程 异步服务端 同步客户端(转)
- C# Socket编程 服务端与客户端(一)
- C#Socket编程多客户端基于同一服务端通信
- 最基本的Socket编程(服务端跟客户端通信) C#版
- C# Socket编程 服务端与客户端(三) 异步客户端
- C#服务端判断客户端socket是否已断开的方法
- C#网络编程之客户端编程与服务端的一般步骤(8)
- 仿QQ聊天程序SOCKET编程服务端与客户端,成功通信
- 【黑马程序员】Socket编程实现服务端和客户端的交互
- C++ socket编程 实现服务端与客户端的通讯
- Boost socket 同步编程示例(服务端,客户端)
- Linux/Unix服务端和客户端Socket编程入门实例(含源码下载)
- c# WINFORM SOCKET编程-简单聊天程序(服务端)(转载)
- C# SOCKET编写的简单聊天通信程序(客户端+服务端)
- socket 通信 入门3 android 客户端 C# 服务端
- java网络编程--socket服务端客户端(1:1)
- c# 下 socket 客户端 编程
- C#中面向连接的客户端与服务端编程
- C# Socket聊天程序(一个服务端,多个客户端)