C#TCPサーバーは、Pythonクライアントから送信された2つのメッセージを同時に受信します

イワン・ズラタノフ

Python TCPクライアントからC#サーバーに送信された複数のメッセージを受信しようとしています。私はデータを受け取りますが、一度にすべてを受け取り、それが起こらないようにします。サーバーのバッファサイズを送信しているbyte []のサイズに設定しようとしましたが、機能しませんでした(source)。この問題を解決するにはどうすればよいですか?

クライアント送信コード:

import socket


def send_to_remote(sock, data):

data_bytes = bytearray()
data_bytes.extend(map(ord, data)) # appending the array with string converted to bytes

bytes_length = len(data_bytes) # length of the array that I am sending

sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bytes_length) #   setting the buffer size to the array length

print(bytes_length)

sock.send(data_bytes) # sending the data

サーバー受信コード:

 public static string ReadData(TcpClient connection)
    {
        StringBuilder receivedDataStr = new StringBuilder();
        NetworkStream connectionStream = connection.GetStream();

        if (connectionStream.CanRead)
        {
            byte[] connectionBuffer = new byte[connection.ReceiveBufferSize];

            Console.WriteLine(">> Reading from NODE");

            int bytesRead = 0;

            bytesRead = connectionStream.Read(connectionBuffer, 0, 1024);
            receivedDataStr.Append(Encoding.ASCII.GetString(connectionBuffer, 0, bytesRead));

            Console.WriteLine(">> " + connection.ReceiveBufferSize);

            return receivedDataStr.ToString();
        }
        else
        {
            Console.WriteLine(">> Can't read from network stream");
            return "none-read";
        }
    }

編集:

私がしていることは:

send_to_remote(socekt, "msg1")
send_to_remote(socekt, "msg1")

その後:

string msg1 = ReadData(client);
string msg2 = ReadData(client);

106200のバッファ配列を受け取ります。

結果は次のとおりです。

"msg1 (then new line) msg2"
"" (string msg2 is waiting for data)

前もって感謝します!!

マーク・グラヴェル

TCPはストリームプロトコルであり、パケットプロトコルではありません送信されたのとまったく同じチャンクでデータを取得するという保証まったくありません。保証されるのは、バイトを正しい順序(または失敗、タイムアウトなど)で取得することだけです。 。各バイトを個別に取得することも、一度に14個のメッセージを取得することもできます。または、1つの受信のメッセージの半分と、次の受信の残りの半分を含む、その間の何か。ユニコード(など)の場合、これは、1つの文字を複数の受信に分割できることも意味します。

TCPに基づくマルチメッセージプロトコルには、何らかのフレーミングを含める必要があります。つまり、個別のメッセージがどこで開始および終了するかを知るための何らかの方法が必要です。テキストベースのプロトコルを使用しているため、一般的なオプションは、論理メッセージをCR、LF、またはCR + LFで区切ることです。次に、メッセージ全体が得られるまでデータをバッファリングするのが仕事です。行末。完全を期すために:バイナリプロトコルの場合、ペイロード内のデータ量を示す何らかのヘッダーでペイロードの長さプレフィックスを付けるのが一般的です。その後、ヘッダーを解析し、長さを決定し、次のようになるまでバッファリングする必要があります。それだけのデータがあります。

テキストプロトコルを使用し、スケーラビリティに関する問題がない単純なアプリケーションでは、StreamReader(の上にNetworkStream)を使用してその部分を実行してから、ReadLineまたはを使用できる場合がありReadLineAsyncます。ただし、これは「本物」のサーバ(特にに悪い考えであろうとReadLine) -あなたは、悪意のあるまたはちょうどバギークライアントは、それが数文字を送ったという理由だけで永遠にスレッドをロックしたくない行末せず、その後のdidn他に何も送らないでください...今までに。もちろん、深刻なサーバーでは、とにかくクライアントごとにスレッドを使用することはありませ

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ソケットサーバーは、クライアントから送信されたメッセージを受信できませんでした

分類Dev

C# TCP クライアントはメッセージを送信しますが、サーバーはメッセージを受信していません

分類Dev

C#非同期ソケットサーバーはクライアントから1つのメッセージのみを受信します

分類Dev

C#TCPサーバーとC ++ TCPクライアントでメッセージを受信できません

分類Dev

Python:クライアントサーバー通信-同じサーバーポート上の異なるクライアントから同時にメッセージを受信する方法は?

分類Dev

TCPクライアント(java)がTCPサーバー(C#)からメッセージを受信しませんでした

分類Dev

TCPクライアント-不明/無制限のサイズからメッセージを受信します

分類Dev

1つのクライアントが受信したメッセージを、サーバーに接続されている他のすべてのクライアントに送信できません

分類Dev

gRPC Javaサーバー:クライアントから受信した元のメッセージバイトを取得する方法はありますか?

分類Dev

クライアントソケット入力ストリームがサーバーソケット出力ストリームから送信されたメッセージを受信しないのはなぜですか

分類Dev

CのTCPクライアントからメッセージを受信できませんでした

分類Dev

TCPサーバーがTCPクライアントからメッセージを受信しない(Java)

分類Dev

春の統合tcpサーバーはtcpクライアントにメッセージを送信します

分類Dev

C#クライアントからサーバーへのデータ転送サーバーは以前のクライアントメッセージを受信しています非同期サーバー-非同期クライアント

分類Dev

paho python mqttクライアントがサブスクライブされたトピックからメッセージを取得すると、受信したメッセージに常に「b」が追加されます

分類Dev

アウトバーンツイストWebSocketサーバーは、クライアントからメッセージを受信しない限り、クライアントにメッセージを送信しません

分類Dev

RabbitMQ:クライアントはクライアントの起動前に送信されたメッセージを受信しません

分類Dev

nettyでアプリケーションを作成し、クライアントからサーバーにメッセージを送信しましたが、サーバーがメッセージを受信できません

分類Dev

サーバーソケットがクライアントから送信されたパケットを受信しないのはなぜですか

分類Dev

C ++ソケットサーバーはJavaクライアントからメッセージを受信しますが、それ以外の場合は受信しません

分類Dev

TCP クライアントがサーバーのメッセージを受信しません

分類Dev

Golangで記述されたUDPクライアントがサーバーからのメッセージの受信に失敗する

分類Dev

MQTTサブスクライバーは、同じトピックの複数のメッセージを同時に受信できますか?

分類Dev

C#クライアント上のC ++サーバーから送信されたデータを受信します

分類Dev

TCPクライアントでサーバーからメッセージを受信し、TextViewで設定します

分類Dev

TCP:サーバーは、クライアントから[SYN]を受信した直後に[RST、ACK]を送信します

分類Dev

サーバーはクライアントからそれ以上のメッセージを受信しません

分類Dev

クライアントは、受信したのと同じJWTトークンを使用してサーバーにコールバックしますか?

分類Dev

クライアントサーバーPython:受信したメッセージを個別に印刷することはできません

Related 関連記事

  1. 1

    ソケットサーバーは、クライアントから送信されたメッセージを受信できませんでした

  2. 2

    C# TCP クライアントはメッセージを送信しますが、サーバーはメッセージを受信していません

  3. 3

    C#非同期ソケットサーバーはクライアントから1つのメッセージのみを受信します

  4. 4

    C#TCPサーバーとC ++ TCPクライアントでメッセージを受信できません

  5. 5

    Python:クライアントサーバー通信-同じサーバーポート上の異なるクライアントから同時にメッセージを受信する方法は?

  6. 6

    TCPクライアント(java)がTCPサーバー(C#)からメッセージを受信しませんでした

  7. 7

    TCPクライアント-不明/無制限のサイズからメッセージを受信します

  8. 8

    1つのクライアントが受信したメッセージを、サーバーに接続されている他のすべてのクライアントに送信できません

  9. 9

    gRPC Javaサーバー:クライアントから受信した元のメッセージバイトを取得する方法はありますか?

  10. 10

    クライアントソケット入力ストリームがサーバーソケット出力ストリームから送信されたメッセージを受信しないのはなぜですか

  11. 11

    CのTCPクライアントからメッセージを受信できませんでした

  12. 12

    TCPサーバーがTCPクライアントからメッセージを受信しない(Java)

  13. 13

    春の統合tcpサーバーはtcpクライアントにメッセージを送信します

  14. 14

    C#クライアントからサーバーへのデータ転送サーバーは以前のクライアントメッセージを受信しています非同期サーバー-非同期クライアント

  15. 15

    paho python mqttクライアントがサブスクライブされたトピックからメッセージを取得すると、受信したメッセージに常に「b」が追加されます

  16. 16

    アウトバーンツイストWebSocketサーバーは、クライアントからメッセージを受信しない限り、クライアントにメッセージを送信しません

  17. 17

    RabbitMQ:クライアントはクライアントの起動前に送信されたメッセージを受信しません

  18. 18

    nettyでアプリケーションを作成し、クライアントからサーバーにメッセージを送信しましたが、サーバーがメッセージを受信できません

  19. 19

    サーバーソケットがクライアントから送信されたパケットを受信しないのはなぜですか

  20. 20

    C ++ソケットサーバーはJavaクライアントからメッセージを受信しますが、それ以外の場合は受信しません

  21. 21

    TCP クライアントがサーバーのメッセージを受信しません

  22. 22

    Golangで記述されたUDPクライアントがサーバーからのメッセージの受信に失敗する

  23. 23

    MQTTサブスクライバーは、同じトピックの複数のメッセージを同時に受信できますか?

  24. 24

    C#クライアント上のC ++サーバーから送信されたデータを受信します

  25. 25

    TCPクライアントでサーバーからメッセージを受信し、TextViewで設定します

  26. 26

    TCP:サーバーは、クライアントから[SYN]を受信した直後に[RST、ACK]を送信します

  27. 27

    サーバーはクライアントからそれ以上のメッセージを受信しません

  28. 28

    クライアントは、受信したのと同じJWTトークンを使用してサーバーにコールバックしますか?

  29. 29

    クライアントサーバーPython:受信したメッセージを個別に印刷することはできません

ホットタグ

アーカイブ