## WebSocket的js代码
var socket = new WebSocket('ws://localhost:8080');
socket.onopen = function(event)
{
socket.send('I am the client and I\'m listening!');
}
socket.onmessage = function(event)
{
console.log('Client received a message',event);
}
socket.onclose = function(event)
{
console.log('Client notified socket has closed',event);
//socket.close()
}
## WebCore中WebSocket模块实现核心代码
## WebSocket的构造函数
WebSocket::WebSocket(ScriptExecutionContext* context):ActiveDOMObject(context)
{
...
}
## 统一的create接口
PassRefPtr<WebSocket> WebSocket::create(ScriptExecutionContext* context)
{
RefPtr<WebSocket> webSocket(adoptRef(new WebSocket(context)));
webSocket->suspendIfNeeded();
return webSocket.release();
}
## ws.connect("ws://192.168.2.99:8080/")
void WebSocket::connect(const String& url, const Vector<String>& protocols, ExceptionCode& ec)
{
}
## 获取执行上下文
ScriptExecutionContext* WebSocket::scriptExecutionContext() const
{
return ActiveDOMObject::scriptExecutionContext();
}
## 销毁上下文
void WebSocket::contextDestroyed()
{
ActiveDOMObject::contextDestroyed();
}
## 暂停与挂起
void WebSocket::suspend(ReasonForSuspension)
{
if (m_channel)
m_channel->suspend();
}
## 恢复通信
void WebSocket::resume()
{
m_channel->resume();
}
void WebSocket::stop()
{
m_channel->disconnect();
ActiveDOMObject::stop();
}
## 连接上事件
void WebSocket::didConnect()
{
dispatchEvent(Event::create(eventNames().openEvent, false, false));
}
void WebSocket::didReceiveMessage(const String& msg)
{
dispatchEvent(MessageEvent::create(msg, SecurityOrigin::create(m_url)->toString()));
}
void WebSocket::didReceiveBinaryData(PassOwnPtr<Vector<char> > binaryData)
{
dispatchEvent(MessageEvent::create(ArrayBuffer::create(binaryData->data(), binaryData->size()), SecurityOrigin::create(m_url)->toString()));
//RefPtr<Blob> blob = Blob::create(blobData.release(), size);
//dispatchEvent(MessageEvent::create(blob.release(), SecurityOrigin::create(m_url)->toString()));
}
void WebSocket::didReceiveMessageError()
{
dispatchEvent(Event::create(eventNames().errorEvent, false, false));
}
void WebSocket::didClose(unsigned long unhandledBufferedAmount, ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsigned short code, const String& reason)
{
RefPtr<CloseEvent> event = CloseEvent::create(wasClean, code, reason);
dispatchEvent(event);
...
m_channel->disconnect();
...
ActiveDOMObject::unsetPendingActivity(this);
}
## 事件时机修改状态
void WebSocket::didUpdateBufferedAmount(unsigned long bufferedAmount) //m_bufferedAmount = bufferedAmount;
void WebSocket::didStartClosingHandshake() //m_state = CLOSING;
## close时机
void WebSocket::close(int code, const String& reason, ExceptionCode& ec)
{
m_channel->close(code, reason);
}
## 发送Message
//void WebSocket::send(ArrayBuffer* binaryData, ExceptionCode& ec)
//void WebSocket::send(ArrayBufferView* arrayBufferView, ExceptionCode& ec) //适配转换
void WebSocket::send(Blob* binaryData, ExceptionCode& ec)
{
m_channel->send(*binaryData);
}
## 连接server
void WebSocket::connect(const String& url, const Vector<String>& protocols, ExceptionCode& ec)
{
m_channel->connect(m_url, protocolString);
ActiveDOMObject::setPendingActivity(this);
}