黑马训练营-Socket与WebSocket的事例

---------------------- 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。

对于上面的代码:

View Code
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/

转载于:https://www.cnblogs.com/Mr-Jquery/articles/2403180.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值