“C#”要怎么推送消息到客户端?
服务器端:
namespace SocketServer
{
class Program
{
private static byte[] result = new byte[1024];
private static int myProt = 8885; //端口
static Socket serverSocket;
static void Main(string[] args)
{
//服务器IP地址
IPAddress ip = IPAddressParse("127001");
serverSocket = new Socket(AddressFamilyInterNetwork, SocketTypeStream, ProtocolTypeTcp);
serverSocketBind(new IPEndPoint(ip, myProt)); //绑定IP地址:端口
serverSocketListen(10); //设定最多10个排队连接请求
ConsoleWriteLine("启动监听{0}成功", serverSocketLocalEndPointToString());
//通过Clientsoket发送数据
Thread myThread = new Thread(ListenClientConnect);
myThreadStart();
ConsoleReadLine();
}
/// <summary>
/// 监听客户端连接
/// </summary>
private static void ListenClientConnect()
{
while (true)
{
Socket clientSocket = serverSocketAccept();
clientSocketSend(EncodingASCIIGetBytes("Server Say Hello"));
Thread receiveThread = new Thread(ReceiveMessage);
receiveThreadStart(clientSocket);
}
}
/// <summary>
/// 接收消息
/// </summary>
/// <param name="clientSocket"></param>
private static void ReceiveMessage(object clientSocket)
{
Socket myClientSocket = (Socket)clientSocket;
while (true)
{
try
{
//通过clientSocket接收数据
int receiveNumber = myClientSocketReceive(result);
ConsoleWriteLine("接收客户端{0}消息{1}", myClientSocketRemoteEndPointToString(), EncodingASCIIGetString(result, 0, receiveNumber));
}
catch(Exception ex)
{
ConsoleWriteLine(exMessage);
myClientSocketShutdown(SocketShutdownBoth);
myClientSocketClose();
break;
}
}
}
}
}
客户端:
namespace SocketClient
{
class Program
{
private static byte[] result = new byte[1024];
static void Main(string[] args)
{
//设定服务器IP地址
IPAddress ip = IPAddressParse("127001");
Socket clientSocket = new Socket(AddressFamilyInterNetwork, SocketTypeStream, ProtocolTypeTcp);
try
{
clientSocketConnect(new IPEndPoint(ip, 8885)); //配置服务器IP与端口
ConsoleWriteLine("连接服务器成功");
}
catch
{
ConsoleWriteLine("连接服务器失败,请按回车键退出!");
return;
}
//通过clientSocket接收数据
int receiveLength = clientSocketReceive(result);
ConsoleWriteLine("接收服务器消息:{0}",EncodingASCIIGetString(result,0,receiveLength));
//通过 clientSocket 发送数据
for (int i = 0; i < 10; i++)
{
try
{
ThreadSleep(1000); //等待1秒钟
string sendMessage = "client send Message Hellp" + DateTimeNow;
clientSocketSend(EncodingASCIIGetBytes(sendMessage));
ConsoleWriteLine("向服务器发送消息:{0}" + sendMessage);
}
catch
{
clientSocketShutdown(SocketShutdownBoth);
clientSocketClose();
break;
}
}
ConsoleWriteLine("发送完毕,按回车键退出");
ConsoleReadLine();
}
}
}
所谓的消息推送就是从服务器端向移动终端发送连接,传输一定的信息。比如一些新闻客户端,每隔一段时间收到一条或者多条通知,这就是从服务器端传来的推送消息;还比如常用的一些IM软件如微信、GTalk等,都具有服务器推送功能。
推送方法如下:
1)通过SMS进行服务器端和客户端的交流通信。
在Android平台上,你可以通过拦截SMS消息并且解析消息内容来了解服务器的意图,可以实现完全的实时操作。但是问题是这个方案的成本相对比较高,且依赖于运营商。
2)循环主动定时获取
这种方法需要客户端来做一个定时或者周期性的访问服务器端接口,以获得最新的消息。轮询的频率太慢可能导致某些消息的延迟,太快则会大量消耗网络带宽和电池。
3)持久连接
这个方案可以解决由轮询带来的性能问题,但是还是会消耗手机的电池。我们需要开一个服务来保持和服务器端的持久连接(苹果就和谷歌的C2DM是这种机制)。但是对于Android系统,当系统可用资源较低,系统会强制关闭我们的服务或者是应用,这种情况下连接会强制中断。(Apple的推送服务之所以工作的很好,是因为每一台手机仅仅保持一个与服务器之间的连接,事实上C2DM也是这么工作的。即所有的推送服务都是经由一个代理服务器完成的,这种情况下只需要和一台服务器保持持久连接即可。C2DM=Cloud to Device Messaging)。
0条评论