µWS v0.14 (“microWS”); client ve serverler için yüksek performanslı bir WebSocket ve HTTP kütüphanesidir. Node.js için kütüphanesi de bulunmaktadır. Yazıda Visual Studio için kurulum, proje ayarları ve örnek kodlar yer alacaktır.

 

uWebSockets için yapılmış örnek performans testleri:

 

1- Kurulum:

  • Öncelikle kurulum için Vcpkg aracını kullanacağız. ( Vcpkg kurulu değilse burdaki yazıdan kurulum işlemlerine ulaşabilirsiniz ). Yönetici olarak CMD’mizi başlatın, vcpkg’nin olduğu klasöre CD komutuyla gidin ve alttaki kodu girin:

 

vcpkg install uwebsockets:x64-windows

 

  • 64 bit için yapılmış olan kütüphaneyi kullanacağım için :x64-windows komutunu kullandım. Komutu girdikten sonra cmake, zlib ve openssl gibi araç ve kütüphaneleri otomatik olarak indirip işlemleri yapacaktır. İşlemlerin bitmesini bekleyin.

 

 

2- Proje Ayarları:

  • İşlemler bittikten sonra Visual Studio’da yeni bir Console Application projesi açın.
  • Yukardan x64 seçin.
  • Daha sonra Configuration Properties → C/C++ → Preprocessor kısmına gidin ve Preprocessor Definitions kısmına alttaki kodları ekleyin (orda daha önce yazanları silmeyin):

 

 

 

UWS_VCPKG;_USE_MATH_DEFINES;_CRT_SECURE_NO_WARNINGS;

 

Not: Yukarıda _USE_MATH_DEFINES eklememizin sebebi M_PI default olarak tanımlı olmamasındandır. _CRT_SECURE_NO_WARNINGS ise sprintf compile sırasında fonksiyonun güvenli kullanılmadığını belirten uyarıları gizlemek içinndir.

  • Proje yapılandırması tamamlanmıştır. Aşağıdaki örnek kodu projede ve html kodunu client olarak test için kullanalım:

 

C++ (server):

#include "stdafx.h"
#include <iostream>

#include <uWS/uWS.h>

using namespace uWS;
using namespace std;


char* substr(char* arr, int begin, int len)
{
	char* res = new char[len];
	for (int i = 0; i < len; i++)
		res[i] = *(arr + begin + i);
	res[len] = 0;
	return res;
}


int main() {

	Hub h;

	//Veri geldiginde
	h.onMessage([](WebSocket<SERVER> *ws, char *message, size_t length, OpCode opCode) {

		if (length && length > 0) {
			string mesaj = substr(message, 0, length);
			cout << "( " << ws->getUserData() << " ) Veri: " << mesaj << endl;

			//Echo (gelen mesajı geri gönderiyor)
			ws->send(message, length, opCode);
		}
	});

	//Http istekler için (isteğe bağlı)
	h.onHttpRequest([](HttpResponse *res, HttpRequest req, char *data,
		size_t, size_t) {
		const string s = "<h1>Merhaba Dunya!</h1>";
		if (req.getUrl().valueLength == 1) {
			res->end(s.data(), s.length());
		}
		else {
			res->end(nullptr, 0);
		}
	});

	//Bir client baglandiginda
	h.onConnection([&h](WebSocket<SERVER> *ws, HttpRequest req) {
		ws->setUserData(ws);
		cout << "( " << ws->getUserData() << " ) client baglandi!" << endl;
	});

	//Bir client cikis yaptiginda
	h.onDisconnection([&h](WebSocket<SERVER> *ws, int code,
		char *message, size_t length) {
		cout << "( " << ws->getUserData() << " ) client cikis yapti!" << endl;
		//ws->close();
	});

	//Port
	int port = 3000;

	if (h.listen(port)) {
		cout << port << " portu dinleniyor!" << endl;
	}
	else {
		cerr << "Port dinleme basarisiz!" << endl;
		return -1;
	}
	h.run();

}

Html (client):

<!DOCTYPE html>
<html>
    <head>
        <title>cppWebSockets echo example</title>
        <meta name="author"    value="[email protected]" />
        <meta name="licsense"  value="BSD" />
        <meta name="robots"    value="none" />
        <style type="text/css">
            * { margin: 5px; }
        </style>
    </head>
    <body>
        <h3>Send a message to the server</h3>
        <div>
            <p>This is a super basic example of how to connect to the websocket server.</p>
            <ul><br />
                <li>Compile and run the server in examples/echoServer.</li>
                <li>
                    Enter a message in the text box below; it will be sent to the server which 
                    will reply back with the same message.
                </li>
            </ul>
            <p><br />
                <i>Note: </i>
                There is no flash fallback, so make sure you have a modern browser with
                WebSocket support.
            </p>
        </div>
        <fieldset>
            <legend>Demo</legend>
            <input type="text" name="input" id="input" />
            <input type="button" name="inpuBtn" id="inputBtn" value="Send" />
            <div><u>Server responses</u></div>
            <div id="output"></div>
        </fieldset>
        
        <script type="text/javascript">
            // Putting the js here after the dom is available in the browser because not using a framework
            var PORT = 3000;
            var ws = new WebSocket("ws://localhost:" + PORT );
            var input    = document.getElementById("input");
            var inputBtn = document.getElementById("inputBtn");
            var output   = document.getElementById("output");

            inputBtn.onclick = function( evt ){
                sendMessage();
            };

            input.onkeypress = function( evt ){
                var code = evt.keyCode ? evt.keyCode : evt.which;
                if( code == 13 )
                    sendMessage();
            };

            ws.onmessage = function( evt ){
                addMessage( evt.data );
            };

            ws.onerror = function( evt ) { 
                addMessage( '<i>WebSocket error :(</i>' );
            };

            ws.onopen = function( evt ) { 
                addMessage( '<i>Connected</i>' );
            };

            ws.onclose = function( evt ) { 
                addMessage( '<i>Disconnected</i>' );
            };

            function sendMessage( ){
                ws.send(input.value);
                input.value = '';
            }

            function addMessage( msg ){
                output.innerHTML += msg + '<br />'; 
            }
        </script>
    </body>
</html>

 

  • Compile edip test ettiğimizde durum böyle gözükecektir.

 

 

Notlar: Projeyi compile ettiğinizde bazı uyarılarla karşılaşacaksınız. Bunun sebebi uWebSockets son versiyonundaki server parametreleri (uWS::WebSocket<uWS::SERVER> ws) pointer’dir. Buyüzden alttaki gibi bir preprocessor durumu kullanabiliriz.

 

#ifdef UWS_VCPKG
  // code fixed for latest uWebSockets
#else
  // leave original code here
#endif

 

 

Örnek kullanım biçimi:

 

 

 

 

 

Herşey bukadardı kolay gelsin..