多核平台下的代码优化。

zhangyixian525 2007-10-21 04:53:25
以下是一段C#代码,主要功能客户端不停的发数据。在服务器端进行侦听,然后把接收到的数据保存。如果在多核的平台下如何对以下的代码段进行优化呢?或者如果提高服务器端接收数据的数量呢?
客户端代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Net.Sockets;
using System.Net;
namespace SenderApp
{
class Program
{
private static int portnum = 10000;
private static string host = "localhost";
static void Main(string[] args)
{
Console.WriteLine("Send data");
//#region Main
//for (int i = 0; i < 1000; i++)
//{
// Work();
//}
//#endregion
portnum = int.Parse(System.Configuration.ConfigurationManager.AppSettings["port"]);
host = System.Configuration.ConfigurationManager.AppSettings["host"];
Work();
Console.Read();
}
static void Work()
{


string returndata="";
int errorcount = 0;
do
{
if (errorcount > 3)
break;
try
{
TcpClient tcpclient = new TcpClient();
tcpclient.Connect(host, portnum);
NetworkStream networkstream = tcpclient.GetStream();
if (networkstream.CanWrite && networkstream.CanRead)
{
returndata = "";
Random r = new Random();
StringBuilder sb = new StringBuilder();
sb.Append(r.Next(10));
sb.Append(",");
sb.Append(r.Next(10));
sb.Append(",");
sb.Append(r.Next(100));
string datatosend = sb.ToString();

Byte[] sendbytes = Encoding.ASCII.GetBytes(datatosend);
networkstream.Write(sendbytes, 0, sendbytes.Length);
// Reads the networkstream into byte buffer.
byte[] bytes = new byte[tcpclient.ReceiveBufferSize];
int bytesread = networkstream.Read(bytes,0,(int)tcpclient.ReceiveBufferSize);
//Returns the data received from the host to the console.
returndata = Encoding.ASCII.GetString(bytes, 0, bytesread);
//Console.WriteLine("Host returned to you : \r\n{0}", returndata);
networkstream.Close();
tcpclient.Close();
}
else if (!networkstream.CanRead)
{
Console.WriteLine("You can not write data to this stream");
tcpclient.Close();
}
else if (!networkstream.CanWrite)
{
Console.WriteLine("You can not read data from this stream");
tcpclient.Close();
}
}
catch (SocketException)
{
Console.WriteLine("Server not available.");
errorcount++;
}
catch (System.IO.IOException)
{
Console.WriteLine("Server not available.");
errorcount++;
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
errorcount++;
}
}
while (returndata == "OK");
}

}
}
服务器端代码:
using System;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;


namespace ServerClient
{
class Program
{

static void Main()
   {

Thread thread = new Thread(new ThreadStart(Run));
thread.Start();
}

public static void Run()
{
Console.WriteLine("Wait for connect");
int port = 10000;
IPEndPoint ipe = new IPEndPoint(IPAddress.Any, port);//IPEndPoint将网络端点表示为 IP 地址和端口号。
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket类
s.Bind(ipe);

string sendStr = "OK";

while (true)
{
try
{
s.Listen(10000);//开始监听
Socket temp = s.Accept();//为新建连接创建新的Socket。

System.Net.IPAddress addr;
// 获得本机局域网IP地址
addr = new System.Net.IPAddress(Dns.GetHostByName(Dns.GetHostName()).AddressList[0].Address);

string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;


bytes = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
recvStr = recvStr + addr + " ";
string dt = DateTime.Now.ToString() + " ";
recvStr = recvStr + dt;
recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
//Console.WriteLine("Server Get Message:{0}",recvStr);//把客户端传来的信息显示出来


WriteField(recvStr);

byte[] bs = Encoding.ASCII.GetBytes(sendStr);
temp.Send(bs,bs.Length,0);//返回客户端成功信息

}
catch (ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException: {0}", e);

}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}
}
}

#region 保存接收到的信息
private static void WriteField(string strInfo)
{
string filename = "file.txt";
StreamWriter sw;
if (File.Exists(filename))
{
sw = File.AppendText(filename);
}
else
{
sw = File.CreateText(filename);
}
sw.WriteLine(strInfo);
sw.Close();
}
#endregion
}
}

请高手指点!
...全文
101 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyx0507 2007-10-28
  • 打赏
  • 举报
回复
楼主的代码是一段收发包的小程序.我觉得在这种功能需求的情况下.最能体现出多线程和多核的优势.
首先是客户端,如果用多线程发包的话,就可以提高发包的效率.
同样在服务器端,如果用多线程收包的话,就可以提高收包的效率.
如果收发包的效率都提高了,那么整个小程序的功能自然就提高.

在多核的条件下,不知道资源调度是否可以由开发人员来控制?
snow_tengwl 2007-10-25
  • 打赏
  • 举报
回复
现在zhangyixian525给出的程序已经是多线程的了吧?

个人觉得现在多核技术还没有普及到用什么样的计算机语言都可以实现的程度,
但是有可能OS会自动把其中的一些线程分到其他的核上。
milex 2007-10-25
  • 打赏
  • 举报
回复
直接优化C#代码?估计够呛吧。

但是我觉得,如果LZ能够把代码由串行改成并行,由单线程改成多线程,就应该能很好的利用多核平台的优点了。

高人指点指点...
snow_tengwl 2007-10-24
  • 打赏
  • 举报
回复
现在大部分与多核相关的程序都是用c++/c或者fortran(openMP)写的,不知道C#行不行?

566

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧