你得学会并且学得会的Socket编程基础知识(3)

2019-02-15 17:22

//连接到指定服务器的指定端口 //方法参考:

http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.connect.aspx

socket.Connect(\, 4530);

Console.WriteLine(\);

//实现接受消息的方法

//方法参考:

http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginreceive.aspx

socket.BeginReceive(buffer, 0, buffer.Length,

SocketFlags.None, new AsyncCallback(ReceiveMessage),socket);

Console.Read();

}

static byte[] buffer = new byte[1024];

public static void ReceiveMessage(IAsyncResult ar) {

try {

var socket = ar.AsyncState as Socket;

//方法参考:

http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx

var length = socket.EndReceive(ar); //读取出来消息内容 var message = Encoding.Unicode.GetString(buffer, 0, length);

//显示消息

Console.WriteLine(message);

//接收下一个消息(因为这是一个递归的调用,所以这样就可以一直接收消息了)

socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket); }

catch(Exception ex){

Console.WriteLine(ex.Message); } } } }

重新调试起来,看起来的效果如下图所示

我们继续做下面的实验,一步一步地研究Socket通讯中可能遇到的一些问题 请先关闭掉客户端这个程序,而不要关闭服务端程序,这时会发现一个错误

这个错误很容易理解,因为客户端已经关闭,也就是客户端那个Socket已经不存在了,服务器还继续向它发送消息当然会出错。所以,从可靠性方面的考虑,我们必须在发送消息之前检测Socket的活动状态

第七步:检测客户端的活动状态

using System;

using System.Collections.Generic; using System.Linq; using System.Text;

//额外导入的两个命名空间 using System.Net.Sockets; using System.Net;

namespace SocketServer {

class Program {

///

/// Socket Server 演示 /// 作者:陈希章 ///

///

//创建一个新的Socket,这里我们使用最常用的基于TCP的Stream Socket(流式套接字)

var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//将该socket绑定到主机上面的某个端口 //方法参考:

http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspx

socket.Bind(new IPEndPoint(IPAddress.Any, 4530));

//启动监听,并且设置一个最大的队列长度 //方法参考:

http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspx socket.Listen(4);

//开始接受客户端连接请求 //方法参考:

http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspx

socket.BeginAccept(new AsyncCallback((ar) => {

//这就是客户端的Socket实例,我们后续可以将其保存起来 var client = socket.EndAccept(ar);

//给客户端发送一个欢迎消息

client.Send(Encoding.Unicode.GetBytes(\I accept you request at \+DateTime.Now.ToString()));

//实现每隔两秒钟给服务器发一个消息 //这里我们使用了一个定时器

var timer = new System.Timers.Timer(); timer.Interval = 2000D; timer.Enabled = true;

timer.Elapsed += (o, a) => {

//检测客户端Socket的状态 if(client.Connected) {

try {

client.Send(Encoding.Unicode.GetBytes(\ + DateTime.Now.ToString())); }

catch(SocketException ex) {

Console.WriteLine(ex.Message); } } else {

timer.Stop();

timer.Enabled = false; Console.WriteLine(\is disconnected, the timer is stop.\); } };

timer.Start();

}), null);

Console.WriteLine(\); Console.Read(); } } }

上面代码的逻辑很清楚,但有时候还是会触发那个SocketException。为什么呢?这是因为我们的Timer是每隔两秒钟检查一次,那么就很可能有一种情况,我们检查的时候,它还是连接状态,消息发出去之后,它断开了。这种情况肯定是存在的。所以要用Try..catch的结构

目前我们实现的场景很简单,服务器只管发消息,客户端只管收消息。但实际工作中,可能希望服务器和客户端都能收发消息。请看下一节

第八步:实现双向收发消息

先看服务端的修改

using System;

using System.Collections.Generic; using System.Linq; using System.Text;

//额外导入的两个命名空间 using System.Net.Sockets; using System.Net;

namespace SocketServer {

class Program {

///

/// Socket Server 演示


你得学会并且学得会的Socket编程基础知识(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:[初中语文]2011-2012学年度七年级上册第四单元语文测试卷 语文版

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: