Skip to content

Instantly share code, notes, and snippets.

@SKalt
Last active June 9, 2022 13:51
Show Gist options
  • Save SKalt/1663f11b160040e30b67ab35fbd95de8 to your computer and use it in GitHub Desktop.
Save SKalt/1663f11b160040e30b67ab35fbd95de8 to your computer and use it in GitHub Desktop.
node.js client, python asyncio TCP server connection
__pycache__
node_modules

Experiments talking between python & node

  • using only the standard libraries of both.
const child_process = require('child_process'),
util = require('util'),
net = require('net')
const process = child_process.spawn('python', ['py.py'/*, '--port=8000'*/])
// class Foo {
// constructor(options){
// this.options = options
//
// }
// }
new Promise(resolve => {
let socket = net.connect(
{host: '127.0.0.1', port: '8888'}, () => resolve(socket)
)
}).then(socket => {
socket.on('data', (data) => {
console.log('>>>' + data.toString())
socket.end()
process.kill()
});
console.log('connected to server!')
socket.write(JSON.stringify({hello: 'world'}))
})
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
[dev-packages]
black = "==18.9b0"
python-language-server = "*"
pyls-black = "*"
[requires]
python_version = "3.6"
[pipenv]
allow_prereleases = true
{
"_meta": {
"hash": {
"sha256": "d3425bbe9c3869ddfb3e9d738e09c9d1a5f4cc01efa02b69c35a2d904b8230cd"
},
"pipfile-spec": 6,
"requires": {
"python_version": "3.6"
},
"sources": [
{
"name": "pypi",
"url": "https://pypi.org/simple",
"verify_ssl": true
}
]
},
"default": {},
"develop": {
"appdirs": {
"hashes": [
"sha256:9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92",
"sha256:d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e"
],
"version": "==1.4.3"
},
"attrs": {
"hashes": [
"sha256:10cbf6e27dbce8c30807caf056c8eb50917e0eaafe86347671b57254006c3e69",
"sha256:ca4be454458f9dec299268d472aaa5a11f67a4ff70093396e1ceae9c76cf4bbb"
],
"version": "==18.2.0"
},
"black": {
"hashes": [
"sha256:817243426042db1d36617910df579a54f1afd659adb96fc5032fcf4b36209739",
"sha256:e030a9a28f542debc08acceb273f228ac422798e5215ba2a791a6ddeaaca22a5"
],
"index": "pypi",
"version": "==18.9b0"
},
"click": {
"hashes": [
"sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13",
"sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7"
],
"version": "==7.0"
},
"future": {
"hashes": [
"sha256:67045236dcfd6816dc439556d009594abf643e5eb48992e36beac09c2ca659b8"
],
"version": "==0.17.1"
},
"jedi": {
"hashes": [
"sha256:571702b5bd167911fe9036e5039ba67f820d6502832285cde8c881ab2b2149fd",
"sha256:c8481b5e59d34a5c7c42e98f6625e633f6ef59353abea6437472c7ec2093f191"
],
"version": "==0.13.2"
},
"parso": {
"hashes": [
"sha256:6ecf7244be8e7283ec9009c72d074830e7e0e611c974f813d76db0390a4e0dd6",
"sha256:8162be7570ffb34ec0b8d215d7f3b6c5fab24f51eb3886d6dee362de96b6db94"
],
"version": "==0.3.3"
},
"pluggy": {
"hashes": [
"sha256:8ddc32f03971bfdf900a81961a48ccf2fb677cf7715108f85295c67405798616",
"sha256:980710797ff6a041e9a73a5787804f848996ecaa6f8a1b1e08224a5894f2074a"
],
"version": "==0.8.1"
},
"pyls-black": {
"hashes": [
"sha256:35bd9e81f487d3f8aa8b36164bbbbba0f3bc9c9e0fffda2375c1507c1d52ddb2",
"sha256:af4bfd73caeefd31f8035c20d30655fe26fa64e6e802d3c62e92465c13dc5e69"
],
"index": "pypi",
"version": "==0.3.0"
},
"python-jsonrpc-server": {
"hashes": [
"sha256:09b418e3b1ba9032aecc7aefdd185511dd230fb8dacf18ec195d14dfd89d9e54"
],
"version": "==0.1.2"
},
"python-language-server": {
"hashes": [
"sha256:46450805798dad2c1abe88cbf66b05db030265b232a5de456d0d3c6800edeb12"
],
"index": "pypi",
"version": "==0.22.0"
},
"toml": {
"hashes": [
"sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c",
"sha256:235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e"
],
"version": "==0.10.0"
}
}
}
# import asyncio
#
# loop = asyncio.new_event_loop()
#
#
# class EchoProtocol(asyncio.Protocol):
# def connection_made(self, transport):
# self.transport = transport
#
# def data_received(self, data):
# self.transport.write(data)
#
#
# async def main(host, port):
# loop = asyncio.get_running_loop()
# server = await loop.create_server(EchoProtocol, host, port)
# await server.serve_forever()
#
#
# loop.run_forever(main("127.0.0.1", 5000))
import asyncio
class EchoServerClientProtocol(asyncio.Protocol):
def connection_made(self, transport):
peername = transport.get_extra_info('peername')
print('Connection from {}'.format(peername))
self.transport = transport
def data_received(self, data):
message = data.decode()
print('Data received: {!r}'.format(message))
print('Send: {!r}'.format(message))
self.transport.write(data)
print('Close the client socket')
self.transport.close()
loop = asyncio.get_event_loop()
# Each client connection will create a new protocol instance
coro = loop.create_server(EchoServerClientProtocol, '127.0.0.1', 8888)
server = loop.run_until_complete(coro)
# Serve requests until Ctrl+C is pressed
print('Serving on {}'.format(server.sockets[0].getsockname()))
try:
loop.run_forever()
except KeyboardInterrupt:
pass
# Close the server
server.close()
loop.run_until_complete(server.wait_closed())
loop.close()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment