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

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

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

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

Q&A

解決済

4回答

1129閲覧

一つのポートで違うデータを受け取れない

besides-poit

総合スコア23

Python

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

0グッド

0クリップ

投稿2021/05/16 06:34

編集2021/05/16 07:06

python

1import socket 2from sys import flags 3import numpy 4import cv2 5 6PORT = 50000 7BUFFER_SIZE = 4096*10 8 9buf = b'' 10 11 12def main(): 13 global buf 14 with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: 15 while True: 16 s.bind(("0.0.0.0", PORT)) 17 try: 18 data,address = s.recvfrom(BUFFER_SIZE) 19 if not data: 20 break 21 buf = buf + data 22 23 finally: 24 s.close() 25 narray=numpy.frombuffer(buf,dtype='uint8') 26 return cv2.imdecode(narray,1) 27 28while True: 29 img = main() 30 cv2.imshow('Capture',img) 31 if cv2.waitKey(100) & 0xFF == ord('q'): 32 break 33 buf = b''

↑サーバー

python

1import socket 2import cv2 3 4cap = cv2.VideoCapture(0) 5cap.set(cv2.CAP_PROP_FPS, 30) 6cap.set(3,320) 7cap.set(4,240) 8PORT = 50000 9BUFFER_SIZE = 4096 10with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: 11 while True: 12 ret, frame = cap.read() 13 if not ret: 14 break 15 16 jpegstring=cv2.imencode('.jpg', frame)[1].tobytes() 17 18 s.sendto(id + jpegstring,("****",PORT))

↑クライアント

一つのサーバーに二つのクライアントが実行されると一つの画像表示ウィンドウに交互に二つのカメラの画像が移ってしまいます。クライアントごとにウィンドウを表示したいです。

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

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

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

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

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

AbeTakashi

2021/05/16 06:43

具体的に何をしたいのでしょうか? 「一つのポートで違うデータを受け取れない」「一つのサーバーに二つのクライアントが実行されると一つの画像表示ウィンドウに二つのカメラの画像が移ってしまいます。」は共に現状であって、何をどうしたいのかこの質問文では分かりません。プログラムをざっくり見る限りでは「そうだろうな」としか思えませんが(プログラムは書いたとおりにしか動きません)。なんとなくですがsocketの理解が足りていないようにも思えます。 参考) https://teratail.com/help/question-tips#questionTips3-3 このページいちど全部目を通してほしいのですが、とくに「質問詳細の最初に実現したいことを書きましょう」をしっかり質問文に追記してください。
guest

回答4

0

UDP 通信でも接続してきたクライアントの IP と PORT からクライアントを識別すればいいのではありませんか?

Python

1data,address = s.recvfrom(BUFFER_SIZE) 2print('ip: ', address[0]) 3print('port: ', address[1])

投稿2021/05/16 14:39

lehshell

総合スコア1147

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

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

0

ベストアンサー

UDPだと、同じIPアドレスから来たデータを、どのクライアントプログラムから来たかを区別することは出来ないので、データの中に区別する識別子を入れるしか無いでしょう。

投稿2021/05/16 10:02

otn

総合スコア84788

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

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

otn

2021/05/16 10:04

何故TCPじゃなくてUDPなんですかね?
besides-poit

2021/05/16 10:29

画像の通信速度がtcpより優れてるからです
besides-poit

2021/05/16 10:31

クライアントがサーバー側にid的な物を要求 そして画像の送信のヘッダーにidを貼り付ける的な?
otn

2021/05/16 10:44

> クライアントがサーバー側にid的な物を要求そして画像の送信のヘッダーにidを貼り付ける的な? そうですね。 データのサイズが大きいと自動的に分割されたりするので、処理が大変だと思いますけど。 そもそも画像を送るのだと途中が抜けると駄目では?連番の管理や抜けた時の再送の処理も必要ですね。 そういう処理を追加してまでUDPを使いたいのかどうかですが。
besides-poit

2021/05/16 10:49

友人にお願いして離れた場所からテストしましたが特にかくつくことはなかったので省いちゃいます
guest

0

投稿2021/05/16 09:45

ppaul

総合スコア24666

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

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

0

s.bind(("0.0.0.0", PORT))

どっからでもどんとこい!ってやってたらそうなって当然なんでは

投稿2021/05/16 07:45

y_waiwai

総合スコア87800

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

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

besides-poit

2021/05/16 10:29

どっからでもどんとこい!ってやりたいんです
y_waiwai

2021/05/16 10:32

どこからきたデータなのか、ってのを読んで、それで表示するところを変えましょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問