質問: conn.recv(30000) if not data: break print(data.decode('utf-8')+"\n") ```
回答: kunif さんのコメントにもありますが、あなたがサーバ側のコードで使用している`conn.recv(30000)`と言うコードでは、(例え送信されたメッセージのバイト長が30000以下でも)送信メッセージ全体を確実に全部受信できると言う保証はありません。 TCP通信では、送信されるメッセージは通信方式やネットワーク状況などで決まる最大パケットサイズで分割されて送信されます。 (「TCP パケットサイズ」辺りで検索すれば、いろいろな解説記事が見つかると思います。例えばGoogleではこんな記事がトップに表示されました。「第16回 信頼性のある通信を実現するTCPプロトコル(3) (2/4)」) 上記の記事では具体例にイーサネットを想定していますが、TCP/IPの下層に使用されている通信方式によっては、もっと短いパケットサイズになる可能性もあります。 生のTCPソケットを扱うのであれば、「どこまでがひとまとまりのメッセージ」であるのかは、送信側と受信側で約束事として決めておかないといけません。例えばあなたの現在のSwift側コードのように、「メッセージの末尾には必ず改行コード(`\n`)を付ける」と言う約束にするのであれば、受信側のPythonコードでは「`\n`が受信されるまで、複数回にわたる`recv`の結果をつなぎ合わせる」と言った処理が必要です。 本題とは離れますが、あなたが参考にされた記事は、Swiftのコーディングルールに則っていないだけでなく、**不必要で冗長な処理の書き方をしている部分が多数ある**、**ポインターの使い方に致命的な誤りがある**など、「そのまま使ったり真似したりしちゃダメ」なコード例になっています。 これからTCP通信のコードを書いてみようと思うのであれば、Networkフレームワークを使用した方が良いでしょう。(もう登場して数年になるフレームワークなのに、日本語の両記事が見つかりませんでしたが...。)