求服务器程序设计思路:GPRS终端与服务器通信,采用TCP/IP协议,Socket,多线程 我也在做这个方面的。不过现在用的是DELPHI。如果用C#,线程和委托是分不开的。而且你说的很笼统,似乎你已经把思路说的很清楚了。如果实现上有问题,还是具体问题具体分析吧。我的QQ:16178508。也许可以互相讨论以下。不过我的C#也是菜鸟级别的 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 看你的介绍思路已经是清晰的啊?再细化的话就是技术实现的细节性问题了。身份认证看你采取的认证方式,安全性可靠性都和你使用的实际技术有直接关联。严格些的话做CA认证。简单点直接MD5认证就行。TCP监听就简单了,SOCKET搞定。事务通讯的话看实际需求。也会用到SOCKET,当然你也可以用其他技术。socket多线程的实际应用MSDN里其实有很多例子。我记得有个wintalk就是用socket通讯的demo.msdn附带的。 我现在做的就是这个,不过是用UDP通信。LZ说得太笼统,不太明白。愿与LZ交流 hoho,这么多人做这个。我写了一个设备类,处理线程和socket都是成员,还有一些其他信息。每有一个客户端链接,就创建这样一个对象。所有的设备对象放在一个动态数组中,由主线程对这个数组进行管理,如果发现设备掉线,就清理资源。不过我的设备类只处理数据接收,发送还是由主线程检测待发数据然后直接发送的。感觉不是很好,不过没想到什么更合适的办法。 谢谢大家的回复,对,系统设计已经很明确了,就是对Socket和多线程有些不熟悉。我的MSN:[email protected]QQ:173318008 欢迎熟悉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); } } } .net异步处理就是多线程把 可以参考.NET4。0的SocketAsyncEventArgs类,这个类的模型为异步的完成端口模型,而且使用方便简单! 晕。做的人还真多。刚帮一家公司做了一个WINCE的. asp.net 备份数据库,总提示语法错误 谁有CRM的源码,最好C#,要求以邮件为主线。付费!帮顶给分!!!!谢谢兄弟们。 我的线程不调用我定义的方法 在C#,能把数组作为集合中的元素么? 如何解决耗光cpu资源的问题 Facebook Api 提供了哪些功能? 求教怎么把XML文件里配置好的表结构中所有字段的总长度计算出来? modbus tcp 怎么编码解码,最好给出例子,谢谢 用C#下载图片的问题 如何读取服务器端的 CPU主频,内存,显示卡和其它硬件信息 inherits的问题,高手来帮忙啊 求助:如何在代码中获取listview中的某行数据的索引并修改该行中的数据啊?
身份认证看你采取的认证方式,安全性可靠性都和你使用的实际技术有直接关联。严格些的话做CA认证。简单点直接MD5认证就行。
TCP监听就简单了,SOCKET搞定。
事务通讯的话看实际需求。也会用到SOCKET,当然你也可以用其他技术。socket多线程的实际应用MSDN里其实有很多例子。我记得有个wintalk就是用socket通讯的demo.msdn附带的。
愿与LZ交流
我的MSN:[email protected]
QQ:173318008
2 .net异步除了
3 GPRS模块一般通过tcp客户传递过来,没有多少关系的
2 .net异步处理(vwinsock)
3 GPRS模块一般通过tcp客户传递过来,没有多少关系的
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);
}
}
}
就是多线程把