Socket多线程

shadow841112 2009-04-16 11:39:25
大家好,很久没有在CSDN上提问了。目前遇到了棘手的问题,请大家帮忙。
搞了四年B/S结构,最近公司有一个很紧的项目,是C/S结构的程序(具体需求我下面说),我不得不放下手中的项目,帮忙研究这个项目,公司居然没有人搞过多线程的Socket,不得已我就担负起了攻坚的责任,时间很紧,希望大家帮忙,原始的需求框架很简单,我大概描述下,希望有对这个熟悉的朋友能联系我,我感觉这个东西熟悉的人半个小时就弄出来了,不胜感谢。

服务端:(其实这个项目在技术角度没有所谓的服务端和客户端,具体请听我说完)
在本地开个端口监听,因为是窗体,所以要另开线程侦听,同时在有客户端请求连接时,为每个客户端新建线程,客户端在请求连接的时候,直接就向服务端发送消息,在服务端接收后断开这个TCP连接,这是个重点,要实现连接为瞬时。

客户端:
其实客户端也会有个端口做侦听,这就是为什么我说技术角度不分服务端和客户端的原因,服务端每过一段时间,会执行一段函数判断一些设备的状态,如果出现异常,那么循环向该网段下比如192.168.1.101-192.168.1.254这些客户端发送消息,每个向客户端的连接请求也新建一个线程,同时这个连接也是瞬时的,发送完消息就断开。

大概需求就是这样,希望懂的人给于帮助,实在没玩过C/S,找了些代码也没什么进展,有热心的朋友请加Q:56326931
...全文
957 51 打赏 收藏 转发到动态 举报
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
qmj150 2011-11-22
  • 打赏
  • 举报
回复
值得学习啊,各楼很多回复都很经典
LIMINLY520 2011-08-15
  • 打赏
  • 举报
回复
学习
虽然不是我正在研究的课题
但也学习一下啊
daneyzoujun 2010-12-31
  • 打赏
  • 举报
回复
正在学习C++开发这个东西,研究中
wangkuang5 2009-04-17
  • 打赏
  • 举报
回复
我有代码
发给你
共同研究中
justin麒麟 2009-04-17
  • 打赏
  • 举报
回复
值得学习啊,各楼很多回复都很经典
wuyq11 2009-04-17
  • 打赏
  • 举报
回复
hubofly 2009-04-17
  • 打赏
  • 举报
回复
顶一下,关注
c/s的这套东西还是有点搞的特别是和通信相关的
建议LZ 自己写socket的不要用.net封装的那套,.net封装的那个效率很低,而且开销很大,容易出问题
周药师 2009-04-17
  • 打赏
  • 举报
回复
lz目前的这个C/S构架, 对于做过通讯方面的C/S控制在平常不过了
个人觉得最重要的也是中断的算法和Socket通讯的稳定了
lsd123 2009-04-17
  • 打赏
  • 举报
回复
.
zzxap 2009-04-17
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20080623/08/4bbd2475-45f1-42e3-a613-16b094759ade.html
zhaozhiqiang0124 2009-04-17
  • 打赏
  • 举报
回复
突然发现,没有发言的我是个乞丐
zhaozhiqiang0124 2009-04-17
  • 打赏
  • 举报
回复
这个比较好理解,也比较好做。对于服务端:只需要一直进行监听,当监听到有连接请求的时候,调用函数生成一个新的线程,用与处理你的通讯(接收消息),接受完消息以后,该连接断开,然后将强制结束该线程,以便节约资源。
对于客户端,可以采取同样的手段进行。我以前做过相似的,如果需要可以直接联系。顺便说一点:一般的话,采取socket进行通讯,都要进行多线程的,要不然每次只能单线联系,没有更多的人通讯,感觉向特务。呵呵
kkun_3yue3 2009-04-17
  • 打赏
  • 举报
回复
我一直参考这篇文章来写异步socket的,精读细读多调试
http://www.cnblogs.com/idior/articles/147648.html
kkun_3yue3 2009-04-17
  • 打赏
  • 举报
回复
[img=http://images.cnblogs.com/cnblogs_com/idior/nioindotnet.JPG]http://images.cnblogs.com/cnblogs_com/idior/nioindotnet.JPG[/img]
gxj760998 2009-04-17
  • 打赏
  • 举报
回复
刚好手头上有一个,给你参考下吧。
运行还算问题,本地测试过100个终端连接,支持心跳检测。
/// <summary>
/// 启动帧听服务
/// </summary>
/// <returns></returns>
public bool StartServer()
{
if (serverThread == null)
{
serverThread = new Thread(new ThreadStart(Server));
serverThread.Start();
}
else
{
IsListener = true;
}
return true;
}
/// <summary>
/// 停止帧听服务
/// </summary>
/// <returns></returns>
public bool StopServer()
{
if (serverThread != null)
{
IsListener = false;
//必须等待下面的接收连接THREAD方法运行完毕后才能关闭STOP
//否则会出现错误 一个封锁操作被对WSACancelBlockingCall的调用阻塞
while (isRun == true)
{
Thread.Sleep(10);
}
localServer.Stop();
//并关闭所有已经启动的线程
if (current485List != null && current485List.Count > 0)
{
foreach (DealBuseness serv in current485List)
{
serv.Stop();
}
}
serverThread = null;
}
return true;
}

/// <summary>
/// 帧听服务
/// </summary>
private void Server()
{
localServer = new TcpListener((Dns.GetHostAddresses(Dns.GetHostName()))[0], port);
localServer.Start();
while (isListener)
{
System.Threading.Thread.Sleep(100);
isRun = true;
if (localServer.Pending())
{
Socket currentSocket = localServer.AcceptSocket();
IPEndPoint currPoint = (IPEndPoint)currentSocket.RemoteEndPoint;
Server485 current485 = new Server485(currPoint.Address.ToString(), currPoint.Port, currentSocket);
DealBuseness currDeal = new DealBuseness(ref current485, currentForm, delegtCard, delegt485);
currDeal.Start();
if (current485List == null)
{
current485List = new List<DealBuseness>();
}
current485List.Add(currDeal);
if (currentForm != null && delegt485 != null)
{
currentForm.Invoke(delegt485, currPoint.Address.ToString(), true);
}
}
}
isRun = false;
}

帧听后,对每一个SOCKET建立了三个线程,发送、接受、处理。主要是自己的程序要求,实现异步双通道!
总体来说,。NET的SOCKET还是比较好操作的,至于那些说要自己封装的,个人认为如果不是对底层非常熟悉,
还是用自带的好。
boywangliang 2009-04-17
  • 打赏
  • 举报
回复
修改一下昵称 2009-04-17
  • 打赏
  • 举报
回复
帮顶一下!
学习
homejiji 2009-04-17
  • 打赏
  • 举报
回复
同步的理解起来更容易,而且编码也更简单,但效率什么个人感觉都不如异步的,而且总感觉用异步比较帅哈哈哈
leehong0704 2009-04-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hubofly 的回复:]
顶一下,关注
c/s的这套东西还是有点搞的特别是和通信相关的
建议LZ 自己写socket的不要用.net封装的那套,.net封装的那个效率很低,而且开销很大,容易出问题
[/Quote]
me too
leehong0704 2009-04-17
  • 打赏
  • 举报
回复
网上很多,如果需要可以加我站内短信我。
加载更多回复(27)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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