求服务器程序设计思路:GPRS终端与服务器通信,采用TCP/IP协议,Socket,多线程
现在有两种GPRS设备,都是多个,多个客户端,通过TCP连接访问服务器。可以看作是三个通信模块,三个通信控制模块的程序结构基本一致,可以进一步划分为:TCP监听、身份认证、事务通信3个子模块,每个子模块为一个线程,每一个子模块中最主要的对象就是SOCKET,因此每个子模块的功能描述可以用其处理的SOCKET对象来描述。初步打算用C#来写。对Socket编程预计多线程不是很熟悉,请教大家这个服务器程序的详细设计思路,多谢! --------------------编程问答-------------------- 我也在做这个方面的。不过现在用的是DELPHI。
如果用C#,线程和委托是分不开的。
而且你说的很笼统,似乎你已经把思路说的很清楚了。
如果实现上有问题,还是具体问题具体分析吧。
我的QQ:16178508。也许可以互相讨论以下。不过我的C#也是菜鸟级别的 --------------------编程问答-------------------- 看你的介绍思路已经是清晰的啊?再细化的话就是技术实现的细节性问题了。
身份认证看你采取的认证方式,安全性可靠性都和你使用的实际技术有直接关联。严格些的话做CA认证。简单点直接MD5认证就行。
TCP监听就简单了,SOCKET搞定。
事务通讯的话看实际需求。也会用到SOCKET,当然你也可以用其他技术。
socket多线程的实际应用MSDN里其实有很多例子。我记得有个wintalk就是用socket通讯的demo.msdn附带的。 --------------------编程问答-------------------- 我现在做的就是这个,不过是用UDP通信。LZ说得太笼统,不太明白。
愿与LZ交流 --------------------编程问答-------------------- hoho,这么多人做这个。我写了一个设备类,处理线程和socket都是成员,还有一些其他信息。每有一个客户端链接,就创建这样一个对象。所有的设备对象放在一个动态数组中,由主线程对这个数组进行管理,如果发现设备掉线,就清理资源。不过我的设备类只处理数据接收,发送还是由主线程检测待发数据然后直接发送的。感觉不是很好,不过没想到什么更合适的办法。 --------------------编程问答-------------------- 谢谢大家的回复,对,系统设计已经很明确了,就是对Socket和多线程有些不熟悉。
我的MSN:stcrane1228@hotmail.com
QQ:173318008 --------------------编程问答-------------------- UP --------------------编程问答-------------------- 欢迎熟悉Socket和多线程的朋友过来交流一下 --------------------编程问答-------------------- 多看看委托和线程间的通信就可以了。你可以先写个多线程的小程序,再写个多线程间使用委托通信的小程序试试,具体代码可以在网上找找,或者参见msdn上的代码。 --------------------编程问答-------------------- 这么多人做这个。我写了一个设备类,处理线程和socket都是成员,还有一些其他信息。每有一个客户端链接,就创建这样一个对象。所有的设备对象放在一个动态数组中,由主线程对这个数组进行管理,如果发现设备掉线,就清理资源。不过我的设备类只处理数据接收,发送还是由主线程检测待发数据然后直接发送的。感觉不是很好,不过没想到什么更合适的办法。
--------------------编程问答-------------------- 欢迎熟悉Socket和多线程的朋友过来交流! --------------------编程问答-------------------- 学习中... 欢迎加入ASP.NET(C#)学习交流QQ群号:32801051 --------------------编程问答-------------------- 1 TCP/TP中的服务器端和客户端要比较清晰
2 .net异步除了
3 GPRS模块一般通过tcp客户传递过来,没有多少关系的 --------------------编程问答-------------------- 1 TCP/TP中的服务器端和客户端要比较清晰
2 .net异步处理(vwinsock)
3 GPRS模块一般通过tcp客户传递过来,没有多少关系的
--------------------编程问答-------------------- 在java里是线程池,这种线程由用户控制比较简陋,异步的socket编程便是多线程的,不过这种多线程的声明周期是由系统控制,楼主可以看看我以前给你的代码。下边是使用范例
class DispatchServer
{
private TcpWorkServer server;
ProtocolResolve resolver;
string OSIP;
string ASIP;
public DispatchServer()
{
OSIP=ASIP=Dns.GetHostAddresses(Dns.GetHostName())[0].ToString();
server= new TcpWorkServer(7458);
resolver = new ProtocolResolve();
server.OnAccept+=new TcpEvent(inform);
server.OnError+=new TcpErrorEvent(errorHandle);
server.OnReceive+=new TcpEvent(rcvHandle);
server.OnStart += new TcpErrorEvent(server_OnStart);
server.OnEndSend += new TcpEvent(server_OnSend);
}
void ConnToOS_OnReceive(object sender, Session session)
{
server.Send(session);
}
void ConnToOS_OnSend(object sender, Session session)
{
throw new Exception("The method or operation is not implemented.");
}
void ConnToOS_OnConnect(object sender, Session session)
{
Console.WriteLine("连接上业务服务器!");
}
static void Main(string[] args)
{
DispatchServer s = new DispatchServer();
s.startJob();
}
public void startJob()
{
Console.WriteLine("服务器开始启动");
//ProtocolResolve pr = new ProtocolResolve("TST 0.1 CF test,hello%25world END");
//Console.WriteLine("{0},{1},{2},{3}", pr.Command, pr.Version, pr.CounterFoil,pr.Param.Count);
//Console.WriteLine(pr.BuildRequest("CHG", "1.0", "CF"));
server.StartListening();
}
void server_OnSend(object sender, Session state)
{
}
void server_OnStart(object sender, string msg)
{
Console.WriteLine(msg);
}
public void errorHandle(Object sender,string code)
{
Console.WriteLine(code);
}
public void inform(object sender,Session session)
{
Console.WriteLine("Connect with"+session.WorkSocket.RemoteEndPoint.ToString());
}
/// <summary>
/// 会话接收响应函数
/// </summary>
public void rcvHandle(Object sender, Session session)
{
resolver.SetCommand(session.Message.ToString());
resolver.ProtocolResolving();
Console.WriteLine("Recive!读取客户端信息::"+resolver.FullCmd);
MessageResolve(session);//调用消息处理控制台
//server.SendData(session);//返回处理过的Session到客户端
}
/// <summary>
/// 会话处理函数
/// </summary>
public void MessageResolve(Session _session)
{
ProtocolResolve pr = new ProtocolResolve(_session.Message.ToString());
switch (pr.Command)
{
case "LIN":
AuthenticationSender(_session);
break;
default:
OperationSender(_session);
break;
}
}
/// <summary>
/// 将消息发送到AS中
/// </summary>
public void AuthenticationSender(Session _session)
{
TcpClient ConnToAS = new TcpClient(ASIP, 7459);
string remoteip=_session.WorkSocket.RemoteEndPoint.ToString().Split(':')[0];
byte[] t = Encoding.UTF8.GetBytes(_session.Message.ToString()+"|"+remoteip);//DS将客户端IP附加在消息后边发送给AS
NetworkStream ns = ConnToAS.GetStream();
ns.Write(t, 0, t.Length);
if (ns.CanRead)
{
byte[] r = new byte[ConnToAS.ReceiveBufferSize];
int size = ns.Read(r, 0, ConnToAS.ReceiveBufferSize);
string cr = Encoding.UTF8.GetString(r, 0, size);
_session.Message.Remove(0, _session.Message.Length);
_session.Message.Append(cr);
Console.WriteLine(cr);
server.Send(_session);
//server.ExitSession(_session);
}
}
void ConnToAS_OnSend(object sender, Session session)
{
Console.WriteLine("发送消息{0}到AS",session.Message.ToString());
}
void client_OnReceive(object sender, Session session)
{
Console.WriteLine("接收到{0}送来的消息{1},送往{2}", session.WorkSocket.RemoteEndPoint, session.WorkSocket.ToString(), session.WorkSocket.RemoteEndPoint);
//server.SendData(session);
}
void client_OnConnect(object sender, Session session)
{
Console.WriteLine("作为客户端Connect!与AS交互在"+session.WorkSocket.LocalEndPoint.ToString());
}
/// <summary>
/// 将消息发送到OS中
/// </summary>
public void OperationSender(Session _session)
{
TcpClient ConnToOS = new TcpClient(OSIP, 7457);
byte[] t = Encoding.UTF8.GetBytes(_session.Message.ToString());
NetworkStream ns = ConnToOS.GetStream();
ns.Write(t, 0, t.Length);
if (ns.CanRead)
{
byte[] r = new byte[ConnToOS.ReceiveBufferSize];
int size = ns.Read(r, 0, ConnToOS.ReceiveBufferSize);
string cr = Encoding.UTF8.GetString(r, 0, size);
_session.Message.Remove(0, _session.Message.Length);
_session.Message.Append(cr);
Console.WriteLine("OS返回消息"+cr);
ConnToOS.Close();
server.Send(_session);
//server.ExitSession(_session);
}
}
} --------------------编程问答-------------------- 我也在做这个,不过服务器端我用的完成端口模型,用VC写的 --------------------编程问答-------------------- .net异步处理
就是多线程把
--------------------编程问答-------------------- 不知道你想自己控制线程还是 让别人控制
你这个适合用异步的,你可以不考虑线程问题,本身内部就带线程
可以发给你一个稳定的例子
msn:feilixie@hotmail.com
qq:75786749 --------------------编程问答-------------------- 十分感谢大家的热情,因为工作忙好久没来了,继续向大家请教…… --------------------编程问答-------------------- 过两年了 依然有用 --------------------编程问答-------------------- 可以参考.NET4。0的SocketAsyncEventArgs类,这个类的模型为异步的完成端口模型,而且使用方便简单! --------------------编程问答-------------------- 路过
学习学习 --------------------编程问答-------------------- 晕。做的人还真多。刚帮一家公司做了一个WINCE的.
补充:.NET技术 , C#