/// 作者:陈希章 ///
///
//创建一个Socket
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//连接到指定服务器的指定端口 //方法参考:
http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.connect.aspx
socket.Connect(\, 4530);
Console.WriteLine(\); Console.Read();
} } }
依次选择SocketServer和SocketClient这两个项目,分别将其启动为调试状态(右键菜单,Debug=>Start new instance)
我们看到两个程序都工作正常。
但是,在客户端怎么没有收到服务器发过来的消息呢?那是因为,我们没有在客户端提供这方面的功能。
第五步:在客户端中实现接受消息的方法
using System;
using System.Collections.Generic;
using System.Linq; using System.Text;
//导入的命名空间
using System.Net.Sockets;
namespace SocketClient {
class Program {
///
/// Socket Server 演示 /// 作者:陈希章 ///
///
//创建一个Socket
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//连接到指定服务器的指定端口 //方法参考:
http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.connect.aspx
socket.Connect(\, 4530);
//实现接受消息的方法
var buffer = new byte[1024];//设置一个缓冲区,用来保存数据
//方法参考:
http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginreceive.aspx
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback((ar) => {
//方法参考:
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);
}), null);
Console.WriteLine(\); Console.Read();
} } }
请注意以上红色的部分,我们用了BeginReceive方法进行异步的消息侦听,如果收到了,我们就打印出来
看起来已经实现了我们需求了:服务器给客户端发了一个消息,而客户端也已经收到了。 但是,这远远不够,因为它们之间的通讯不仅仅是一次性的,那么如果服务器要不断地给客户端发消息,例如每隔两秒钟就发送一个消息,如何实现呢?
第六步:实现服务器定期向客户端发消息
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) =>
{
client.Send(Encoding.Unicode.GetBytes(\ +DateTime.Now.ToString())); };
timer.Start();
}), null);
Console.WriteLine(\); Console.Read(); } } }
我们还要实现在客户端一直监听消息的机制,而不是一次性接收.请注意下面红色的部分
using System;
using System.Collections.Generic; using System.Linq; using System.Text;
//导入的命名空间
using System.Net.Sockets;
namespace SocketClient {
class Program {
///
/// Socket Server 演示 /// 作者:陈希章 ///
///
//创建一个Socket
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);