質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JupyterLab

JupyterLabは、Jupyter notebookの後継の対話型開発環境(IDE)です。データの可視化がインタラクティブで、プラグイン作成により新しいコンポーネントの追加および既存のコンポーネントも統合可能。サーバに閉じているため、データ分析に向いています。

ソケット

TCP/IPにおいて、IPアドレスとサブアドレスであるポート番号を組み合わせたネットワークアドレスのことを呼びます。また、ソフトウェアアプリケーションにおいて、TCP/IP通信を行う為の仮想的なインターフェースという意味もある。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2188閲覧

JupyterNotebookでソケット通信

a700700

総合スコア30

JupyterLab

JupyterLabは、Jupyter notebookの後継の対話型開発環境(IDE)です。データの可視化がインタラクティブで、プラグイン作成により新しいコンポーネントの追加および既存のコンポーネントも統合可能。サーバに閉じているため、データ分析に向いています。

ソケット

TCP/IPにおいて、IPアドレスとサブアドレスであるポート番号を組み合わせたネットワークアドレスのことを呼びます。また、ソフトウェアアプリケーションにおいて、TCP/IP通信を行う為の仮想的なインターフェースという意味もある。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/10/13 13:43

Jypyter Notebookのセルに
ソケット通信(サーバー部)のコードを書いて実行すると
waitせずに、すぐに終了してしまいます。

他の端末から、curlコマンドを実行して
文字列を受信できるようにしたいです。

socket通信が無理でしたら、
websocketやその他でも良いです。
curlコマンドとやり取りできる方法を教えてください。

セルに記載したソケット通信(サーバー部)のコードです。

from datetime import datetime import socket print('The server started at', datetime.now()) print('Waiting...') with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind(('127.0.0.1', 50000)) s.listen(1) while True: conn, addr = s.accept() with conn: while True: data = conn.recv(1024) if not data: break print('data: ', data, 'addr: ', addr) conn.sendall(b'Receive: ' + data)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dameo

2021/10/15 06:10

問題の有無はわかりませんが、前提として不可能ではないと思います。 お手数ですが、環境の詳細と実際に実行したcurlのコマンドラインとエラー表示などを載せて頂けないでしょうか? 普通にHTTPで通信してない(HTTP/1.1 200 OKみたいなのを返す)みたいなので。
dameo

2021/10/15 13:42

一応Ubuntu 20.04のpython 3.8.10で $ python3 -m venv env $ . env/bin/activate (env)$ pip install jupyterlab (env)$ jupyter notebook し、起動したブラウザから新規notebook(python3)を起動して質問コードを貼り付けて実行したところ、 The server started at 2021-10-15 22:15:40.855082 Waiting... で実行中になりました。その後別端末からcurlを実行したら $ curl --verbose -H "Content-Type: application/json" -d '{"id":"hoge", "value":"1"}' 127.0.0.1:50000 * Trying 127.0.0.1:50000... * TCP_NODELAY set * Connected to 127.0.0.1 (127.0.0.1) port 50000 (#0) > POST / HTTP/1.1 > Host: 127.0.0.1:50000 > User-Agent: curl/7.68.0 > Accept: */* > Content-Type: application/json > Content-Length: 26 > * upload completely sent off: 26 out of 26 bytes * Received HTTP/0.9 when not allowed * Closing connection 0 curl: (1) Received HTTP/0.9 when not allowed $ となりました。レスポンスにステータスラインがないためHTTP/0.9と判定されているようですが、送信は出来ているようです。notebook上でも data: b'POST / HTTP/1.1\r\nHost: 127.0.0.1:50000\r\nUser-Agent: curl/7.68.0\r\nAccept: */*\r\nContent-Type: application/json\r\nContent-Length: 26\r\n\r\n{"id":"hoge", "value":"1"}' addr: ('127.0.0.1', 48716) のように表示されており、受け取れているようでした。私の環境でとりあえずcurlでレスポンスを見るにはそれっぽいHTTPレスポンスを返す必要があり、 conn.sendall(b'Receive: ' + data) を conn.sendall(b'HTTP/1.1 200 OK\r\nReceive: ' + data) に書き換えればReceiveやリクエストの変なヘッダは付いちゃいますが、curlが受け取れる形で返せるようです。HTTPを扱うためのPython標準のモジュールはhttp.serverなので、これを使ったサンプルコードも載せておきます。 from http.server import HTTPServer, BaseHTTPRequestHandler class EchoHandler(BaseHTTPRequestHandler):   def _handle(self):     binary = self.rfile.read(int(self.headers.get('content-length', 0)))     self.protocol_version = "HTTP/1.1"     self.send_response(200)     self.send_header("Content-Type", "application/octet-stream")     self.send_header("Content-Length", len(binary))     self.end_headers()     print(binary)     self.wfile.write(binary)   def do_GET(self):     self._handle()   def do_POST(self):     self._handle() with HTTPServer(('127.0.0.1',50000), EchoHandler) as httpd:     try:       httpd.serve_forever()     except KeyboardInterrupt:       pass ※全角空白で半角空白2個を表しています これを使うと、パケットの乗り方に関係なく安定してデータを受け取れると思います。より高度なHTTPを使いたい場合はまた別のライブラリを使った方がいいと思いますが、notebook上のセルに記述するコードとして適切かは疑問かもしれません。また、http.server自体はそれほど堅牢ではないので、ローカルで動かすのでなければやめたほうがいいでしょう。 私から言えることは以上です。あとはご自分で調べてください。
a700700

2021/10/16 23:52

ありがとうございます!!! 諦めていた所です。助かりました!!!
a700700

2021/10/16 23:57

dameoさんへの「ベストアンサー」の付け方がわかりません。ありがとうございました!!!
guest

回答1

0

ベストアンサー

普通に、python ファイル名で実行すれば動きました。
JupyterNotebookでの実行を諦めてはどうでしょうか。

投稿2021/10/13 14:10

otn

総合スコア84505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

a700700

2021/10/13 20:46

セルで完結させたいという要望があって調べてました。説得するほうが早いかも知れません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問