рд╕рднреА рдХреЛ рд╢реБрдн рджрд┐рди!
рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдЬрдм рд╣рдо рдЙрддреНрдкрд╛рдж рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реБрдИ: рдкрд╛рдпрдерди рдФрд░ рд╕реА ++ рдХреЗ рдЧреНрд▓реВрдЗрдВрдЧ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдерд╛ рдХрд┐ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдкрд░ рдореБрдЦреНрдп рдХреЛрдб рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдкрд╛рдпрдерди рдореЗрдВ рд▓рд┐рдЦрд┐рдд рдмрд╛рд╣рд░реА рд╡реЗрдмрд╕реЛрдХреЗрдЯреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ (рдЙрд╕ рд╕рдордп рдХреЛрдИ рд╕рдВрдмрдВрдзрд┐рдд рд╕реА ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдирд╣реАрдВ рдереА)ред рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдпреЛрдЬрдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп (рдЕрдЬрдЧрд░ рдореЗрдВ) C ++ рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдкрддрд╛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдЬрдм рдХреЛрдИ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдкрд╛рдпрдерди рдЗрд╕реЗ C ++ рд╡рд┐рдзрд┐ рдореЗрдВ рд╡рд╛рдкрд╕ рднреЗрдЬ рджреЗрддрд╛ рд╣реИред
рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╕рдордп, рдСрдЯреЛрдмрд╛рди (
http://www.tavendo.de/autobahn/clientlbooks.html ) рд╕реЗ рд╡реЗрдмрд╕реЛрдХреЗрдЯ рдкрд╛рдпрдерди рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕реЗ C ++ рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдерд╛ред рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, Python Python C-API (
http://docs.python.org/extending/index.html ) рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдХрдИ рд╕рд░рд▓ рдХреНрд░рд┐рдпрд╛рдПрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рдВрд╕, рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХреА рдЬрд╛рддреА рд╣реИрдВред рдереЛрдбрд╝рд╛ рдЧреБрдЧрд▓реА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдРрд╕реА рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпреЛрдВ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдкрд╛рдпрд╛ рдЧрдпрд╛: Boost.Python (
http://www.boost.org/doc/libs/1_39_0/libs/python/doc.index.html ), SWIG (
http: // www.swig.org/ ), Py ++, Pybindgen, Pyrex ... рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, Boost.Python рдХреЛ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╛рдпрдерди рдореЗрдВ рдПрдХ рд╕рд░рд▓ рдЗрдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЬреЛ рдПрдХ рд╕реЗрдХрдВрдб рдореЗрдВ рдПрдХ рдмрд╛рд░ рдЦреБрдж рдХреЛ "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб" рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдЧрд╛, рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ C ++ рдореЗрдВ рднреЗрдЬ рджреЗрдЧрд╛ред
cppMethods рдХреЛ C ++ рдХреЛрдб рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛,
cppMethods.printMessage (msg) рдХреЗрд╡рд▓ рдкрд╛рдпрдерди рд╕рд╛рдЗрдб рд╕реЗ gluing рдХреА рдЬрдЧрд╣ рд╣реИ, рд╕реАрдзреЗ C ++ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ рдЬреЛ рдкреНрд░рд╛рдкреНрдд рд╕рдВрджреЗрд╢ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдЧрд╛ред
рдпрд╣рд╛рдБ рдкрд╛рдпрдерди рдХреЛрдб рд╣реИ -
echo-client.py :
from twisted.internet import reactor from autobahn.websocket import WebSocketClientFactory, WebSocketClientProtocol, connectWS import cppMethods class EchoClientProtocol(WebSocketClientProtocol): def sendHello(self): self.sendMessage("Hello, world!") def onOpen(self): self.sendHello() def onMessage(self, msg, binary): cppMethods.printMessage(msg) reactor.callLater(1, self.sendHello) def Connect(addressStr): factory = WebSocketClientFactory(addressStr) factory.protocol = EchoClientProtocol connectWS(factory) reactor.run()
рдЕрдм рд╣рдо C ++ рдХреЛрдб рдореЗрдВ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЕрдЬрдЧрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред Python C-API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ Python.h рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╣рдо рдЕрднреА рддрдХ
Boost.Python рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдореВрд▓
рдкрд╛рдпрдерди C-API рд╣реА рд╣реИ ред
PrintEmb.cpp :
#include <Python.h> #include <iostream> #include <string> static PyObject * printString(PyObject * self, PyObject* args) { const char * toPrint; if(!PyArg_ParseTuple(args, "s", &toPrint)) { return NULL; } std::cout << toPrint << std::endl; Py_RETURN_NONE; } static PyMethodDef EmbMethods[] = { {"printMessage", printString, METH_VARARGS, "Return the string recieved from websocket server"}, {NULL, NULL, 0, NULL} };
рдЕрдВрддрд┐рдо рдШреЛрд╖рдгрд╛ рдореЗрдВ, рд╣рдордиреЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдХрд┐ рдкрд╛рдпрдерди рд╕реЗ
рдкреНрд░рд┐рдВрдЯрдореЗрд╕реЗрдЬ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп, C ++
рдкреНрд░рд┐рдВрдЯрд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЗрд╕реЗ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред рдЗрдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдЕрд▓рд╛рд╡рд╛, websockets рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП html5labs рдХреЗ рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
WebSocketConnect.cpp :
#include <Python.h> #include <boost/python.hpp> #include <iostream> #include <string> #include "PrintEmb.cpp" void WebSocketConnect() { using namespace boost::python; Py_Initialize(); Py_InitModule("cppMethods", EmbMethods); PyObject * ws = PyImport_ImportModule("echo_client"); std::string address = "ws://html5labs-interop.cloudapp.net:4502/chat"; call_method<void>(ws, "Connect", address); Py_Finalize(); }
рдЗрд╕ рд╕реНрдерд╛рди рдкрд░, рд╣рдордиреЗ рдлрд┐рд░ рднреА Boost рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдпрд╛, рдЕрд░реНрдерд╛рддреН
call_method рдлрд╝рдВрдХреНрд╢рди, рдЕрдиреНрдпрдерд╛ рд╣рдореЗрдВ рдХрд╛рдлреА рдЕрдзрд┐рдХ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдЦреИрд░, рдРрд╕рд╛ рд╣реА рдХреБрдЫред рдпрд╣рд╛рдВ рд╣рдордиреЗ рдЕрдЬрдЧрд░ рдХреЗ рд▓рд┐рдП
EmbMethods рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛, рдЙрдиреНрд╣реЗрдВ
cppMethods рдХрд╣рд╛, рдФрд░ рдлрд┐рд░ рд╣рдордиреЗ рдкрд╛рдпрдерди рд╕реЗ
рдХрдиреЗрдХреНрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ "рдПрдбреНрд░реЗрд╕" рдкрд╛рд╕ рдХрд┐рдпрд╛ред рдирддреАрдЬрддрди, рд╣рдорд╛рд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреВрд╕рд░реА рдмрд╛рд░ рдПрдХ рдмрд╛рд░ "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб" (рдЬреЛ рдЕрдЬрдЧрд░ рдЦреБрдж рднреЗрдЬрддрд╛ рд╣реИ) рдФрд░ рд╕рд╛рде рд╣реА рд╕рд╛рде рд╡реЗрдмрд╕реЛрдХреЗрдЯ рд╕рд░реНрд╡рд░ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╕рдВрджреЗрд╢ рдХреЛ рд▓рд╛рдЗрди рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рддрд░рд╣ рдЖрдк рдкрд╛рдпрдерди рдФрд░ C ++ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ред
Updред рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХреЛрдб рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ред