WebKit之WebSocket模块的代码层初步分析

来源:互联网 发布:神魔诛天宠物进阶数据 编辑:程序博客网 时间:2024/06/06 14:12

## 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);}## 连接servervoid WebSocket::connect(const String& url, const Vector<String>& protocols, ExceptionCode& ec){m_channel->connect(m_url, protocolString);ActiveDOMObject::setPendingActivity(this);}


0 0