---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------
前端时间,在论坛中提了个比较小白的问题(我就不引用了),大概就是问,我写了段web socket的js代码,如下:
1 var ws = new WebSocket('ws://localhost:8080/');
但是通过firebug调试,却报出一个无可显示内容的响应类型。
-》其实,这个问题是因为在localhost:8080下没有提供Socket服务器,因此无法通过客服端来进行连接/通信。
------------------------------------------------------------------------------------------------------------
Socket基于.Net的实现:
1.服务端:
using System.Net;
using System.Net.Sockets;
using System.Threading;
public partial class ChatServer : Window
{
//用于存储接受的消息
private static int ByteMaxLength = 1024 * 1024 * 2;
private byte[] RecBytes = new byte[ByteMaxLength];
public ChatServer()
{
//初始化
InitializeComponent();
}
//方法库
private Socket BindSocket()
{
Socket _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress _add = IPAddress.Parse(IP.Text);
IPEndPoint _endPoint = new IPEndPoint(_add, int.Parse(Port.Text));
_socket.Bind(_endPoint);
_socket.Listen(10);
return _socket;
}
private void AcceptSocket(Socket C_Socket)
{
while (true)
{
Socket T_Socket = C_Socket.Accept();
PushConsoleBox("已搜索到连接,来自" + T_Socket.RemoteEndPoint.ToString());
}
}
private void ReceiveSocket(Socket C_Socket)
{
while (true)
{
int length = C_Socket.Receive(RecBytes);
}
}
private void PushConsoleBox(string msg)
{
Dispatcher.Invoke((ThreadStart)delegate() { ConsoleBox.AppendText(msg + "\r\n"); });
}
//事件库
private void StartSocket_Click(object sender, RoutedEventArgs e)
{
//创建欢迎的Socket并绑定
Socket T_Socket = BindSocket();
ThreadPool.QueueUserWorkItem((state) =>
{
PushConsoleBox("服务已启动 - 200 ok!");
AcceptSocket(T_Socket);
});
}
private void CloseSocket_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
下面是关于Socket的一些基本描述:
首先是服务端要做的事,包括创建一个Socket对象,用于接受客服端的连接请求,然后将为了连接以后的通信创建一个额外的线程与通信Socket。
对于上面的代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 Socket _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2 IPAddress _add = IPAddress.Parse(IP.Text);
3 IPEndPoint _endPoint = new IPEndPoint(_add, int.Parse(Port.Text));
4 _socket.Bind(_endPoint);
5 _socket.Listen(10);
这段代码创建了一个连接客服端请求的Socket对象,但是此时无法接受客服端的请求,为了不阻碍应用的主线程(不一定是UI)的运行,我们同样需要一个异步操作来轮询地接受请求:
1 while (true)
2 {
3 Socket T_Socket = C_Socket.Accept();
4 PushConsoleBox("已搜索到连接,来自" + T_Socket.RemoteEndPoint.ToString());
5 }
通过Accept()方法,我们将获取一个新的Socket对象,这个对象将用于与客服端进行通讯,此时用于连接的服务端Socket将与本次客服端解耦。
下面来看看客服端:
(主要是html中的webSocket API)
var ws = new WebSocket('ws://[Socket服务器]');
还记得在服务端创建的用于连接用的那几行代码吗?如下:
1 //默认设置,AddressFamily.InterNetwork代表Ipv4
2 //SocketType.Stream代表流式连接
3 //ProtocolType.Tcp表示采用Tcp协议
4 Socket _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
5 //IPAddress.Parse(string)方法可以将你的服务器dns字符串生成为IPAddress对象
6 IPAddress _add = IPAddress.Parse(IP.Text);
7 //实例化IPEndPoint用于确定Socket服务器的端口号
8 IPEndPoint _endPoint = new IPEndPoint(_add, int.Parse(Port.Text));
9 //好了,这里将其绑定
10 _socket.Bind(_endPoint);
11 //这里表示服务器只能同时接收10个来自客服端的请求
12 _socket.Listen(10);
因此我们在客服端就用在服务端绑定好的dns和端口号进行连接请求!
经过测试,客服端可能与服务端建立连接,并正常工作!
--------------------------------------------------------------------------------------------------------------------------------------------
下面是对于html5 web Socket Api的一些吐槽:原本以为可以用Socket来轻松取代逆向ajax技术的,但看到这里才发现这个想法很简单。
对于web Socket Api,性能方面毋庸置疑,但与逆向ajax相比的话,我个人认为是简化了前端的开发,取而代之的是在服务端,要构建一个复杂切美观的Socket服务器,用于取代原有的ajax轮询。但对于,追求性能的web开发中,是必不可少的过程!
---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------
详细请查看:http://net.itheima.com/