本文共 3100 字,大约阅读时间需要 10 分钟。
## 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接口PassRefPtrWebSocket::create(ScriptExecutionContext* context){ RefPtr 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 & 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> binaryData){ dispatchEvent(MessageEvent::create(ArrayBuffer::create(binaryData->data(), binaryData->size()), SecurityOrigin::create(m_url)->toString())); //RefPtr 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 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);}## 连接servervoid WebSocket::connect(const String& url, const Vector & protocols, ExceptionCode& ec){ m_channel->connect(m_url, protocolString); ActiveDOMObject::setPendingActivity(this);}
转载地址:http://mbvbi.baihongyu.com/