本記事(記事カラム)には広告が含まれています。

TCPでデータを送信(固定長バイト)|Python 練習 13

ハッシュタグバナー
「#fxなぜ勝てない」人気ブログランキング「#FXで勝てない人」人気ブログランキング「#FXで負けている人」人気ブログランキング「#FXで損切できない人」人気ブログランキング
PythonPython練習
記事内に広告が含まれています。

TCP を使ってデータを送信します。 自宅無線LANのローカルで通信します。

PC からスマホに文字データ「abcdefg」を送信します。

PCをクライアント、スマホをサーバーとします。データの終了の見極めは、バイト長とします。

PC側コード(送信側 / クライアント)

【試してみる際のお願い】

  • プログラミングは、お使いのパソコンの環境(OSやアプリのバージョン)によって、同じコードでもエラーが出るケースがよくあります。
  • 外部での実行や利用を想定して作られていないため、万が一、動作を試されたことにより不具合等の損害が生じても、当方は一切の責任を負いかねます。
  • 自分用のメモにつき、質問やバグ修正などの個別サポートは一切行っておりません。試す場合は完全な自己責任でお願いいたします。
# 送信側(TCP クライアント)
import socket

TARGET_IP = "192.168.0.235"  # ←受信側のIP
TARGET_PORT = 5000

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((TARGET_IP, TARGET_PORT))

message = b"abcdefg"
sock.sendall(message)

print("送信:", message, "→", TARGET_IP, TARGET_PORT)

sock.close()

PC側 コードの解説

全体の流れ

この送信プログラムは、

TCP ソケットを作る → 接続する → メッセージを送る → 終わり

という構成です。 UDP と違い、TCP は「接続してから送る」必要があります。

コードの分解と解説

1. import socket

Python の標準ライブラリ。 ネットワーク通信の基本機能が入っています。

2. 送信先の設定

TARGET_IP = "192.168.0.235"
TARGET_PORT = 5000
  • TARGET_IP:受信側(サーバ)の IP
  • TARGET_PORT:受信側が bind() して待っているポート番号

TCP も UDP と同じく、相手の IP とポート番号が必要です。

3. TCP ソケットを作る

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  • AF_INET → IPv4
  • SOCK_STREAM → TCP を使う

UDP の SOCK_DGRAM と違い、TCP はストリーム通信です。

4. サーバに接続する

sock.connect((TARGET_IP, TARGET_PORT))

TCP は「接続してから送る」方式なので、 まずサーバに接続します。

5. 送るデータを作る

message = b"abcdefg"

TCP も UDP と同じく バイト列を送ります。

6. データを送信

sock.sendall(message)
  • sendall() はデータをすべて送るまでブロックする
  • TCP はパケット分割を OS が自動で行うため、sendall() が安全

7. 送信ログ

print("送信:", message, "→", TARGET_IP, TARGET_PORT)

8. ソケットを閉じる

sock.close()

TCP は接続型なので、最後に必ず閉じます。

スマホ側コード(受信側 / サーバ)

【試してみる際のお願い】

  • プログラミングは、お使いのパソコンの環境(OSやアプリのバージョン)によって、同じコードでもエラーが出るケースがよくあります。
  • 外部での実行や利用を想定して作られていないため、万が一、動作を試されたことにより不具合等の損害が生じても、当方は一切の責任を負いかねます。
  • 自分用のメモにつき、質問やバグ修正などの個別サポートは一切行っておりません。試す場合は完全な自己責任でお願いいたします。
import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("0.0.0.0", 5000))
sock.listen(1)

print("waiting...")

conn, addr = sock.accept()
print("connect:", addr)

# Receive a fixed-length message of 7 bytes
expected = 7
received = b""

while len(received) < expected:
    chunk = conn.recv(expected - len(received))
    if not chunk:
        break
    received += chunk

print("received:", received.decode(), "from", addr)

conn.close()
sock.close()

スマホ側 コードの解説

全体の流れ

  • TCP ソケットを作る
  • ポート 5000 を開けて待ち受ける
  • クライアント(PC)が接続してくる
  • データを受信する
  • 表示する

UDP と違い、TCP は 接続(accept) が必要です。

コードの分解と解説

1. ソケットライブラリを読み込む

import socket

2. TCP ソケットを作る

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  • SOCK_STREAM → TCP
  • 「TCP 用の受信箱」を作るイメージ

3. ポート 5000 を開けて待ち受ける

sock.bind(("0.0.0.0", 5000))
  • "0.0.0.0" → すべてのネットワークインターフェースで受信
  • 5000 → このスマホ(または PC)の受信ポート番号

4. 接続待ち行列を作る

sock.listen(1)
print("waiting...")

sock.listen(1) の「1」は、接続待ち行列の長さ。

5. クライアントからの接続を受け付ける

conn, addr = sock.accept()
print("connect:", addr)

accept() は クライアントからの接続要求が来るまで待つ(ブロックする) 関数です。 クライアントが connect() を呼ぶと接続が成立し、accept() が解除されて次の行へ進みます。

addr には (クライアントIPアドレス, クライアント側ポート番号) のタプルが入ります。

(補足)クライアント側のポート番号は OS が毎回自動的に割り当てるため、接続のたびに異なるポート番号になるのが普通です(固定ではありません)。

6. データを受信(固定長バイト)

# Receive a fixed-length message of 7 bytes
expected = 7
received = b""

while len(received) < expected:
    chunk = conn.recv(expected - len(received))
    if not chunk:
        break
    received += chunk
固定長受信が必要になる背景

TCP は ストリーム(バイトの流れ) であり、次の性質があります。

  • 送信したデータは 分割されることがある
  • 複数の send が まとめられることがある
  • recv() は「届いた分だけ返す」
  • メッセージの終わりは TCP が教えてくれない
  • しかし 順番は必ず保証される

そのため、アプリ側で「どこまでが1メッセージか」を決める必要があります。 固定長方式はその最もシンプルで堅牢な方法です。

コードの各行が果たす役割
1. 必要なバイト数を決める
expected = 7
received = b""
  • 今回は 7 バイトが 1 メッセージ と決めている
  • received は受信した断片(chunk)をつなげていくバッファ
2. 必要なバイト数が揃うまでループする
while len(received) < expected:
  • TCP は分割されるため、1 回の recv で 7 バイト揃うとは限らない
  • だから 必要な長さに達するまで繰り返す
3. 足りない分だけ recv する
chunk = conn.recv(expected - len(received))
  • すでに受け取った分を除いた「残りの必要バイト数」だけ要求する
  • ただし実際に届く量は OS が決めるので、もっと少ないこともある
  • これが chunk(断片)
4. if not chunk: の意味
if not chunk:
    break

ここが最も誤解されやすい部分ですが、意味はこうです。

recv() が空の b”” を返すのは「相手が切断した」時

Python では次の値は「偽(False)」とみなされます。

  • 0
  • ""
  • b"" ← 今回これ
  • []
  • None

つまり if not chunk: は

chunk が空(b””)なら True → 相手が切断したのでループを終了する

という意味です。

これがないと無限ループになる

相手が 7 バイト送る前に切断した場合:

  • recv → b”ABC”
  • recv → b””(切断)

if not chunk: がないと、 len(received) < expected が永遠に True のままになり、無限ループします。

5. 断片をつなげていく
received += chunk
  • TCP は分割されるので、断片をつなげて 7 バイトにする
  • 順番は TCP が保証してくれるので安心して連結できる

7. 受信内容を表示

print("received:", received.decode(), "from", addr)

8. 接続を閉じる

conn.close()
sock.close()

TCP は接続型なので、最後に必ず閉じます。

結果

最初にスマホ側(サーバ)を起動。 次に PC 側(クライアント)を起動します。

PC から送信した「abcdefg」が表示されます。

スマホ側(受信)画面

フォローバナー
踊るFX CS - にほんブログ村 人気ブログランキングでフォロー
外部サイト広告

高額です。ご覚悟をぉぉぉ!!!

迷ったらこちら ▶ 東京ディズニーランド

この枠内は、広告(PR)を含みます。
※FXは元本保証のない金融商品です。相場変動により損失が生じる可能性がありますので、ご理解のうえでご覧ください。



(PR)Trade Trainer FX検証用ソフト
(PR)MT4裁量トレード練習君プレミアム2
(PR)ワンクリックFXトレーニングMAX/OneClickFX training MAX 裁量トレードの練習用トレーニングEA、24時間365日いつでも練習することができます!
(PR)ぷーさん式FX トレンドフォロー手法トレードマニュアル輝
(PR)ぷーさん式FX 逆張りトレードマニュアル 火花~ひばな~
(PR)ぷーさん式FX デイトレード手法 炎-えん-
(PR)スキャルピングプロ ~プロも使う追撃シグナルで短期安全資産運用~
(PR)FXライントレード大全
(PR)FX歴38年の重鎮!岡安盛男のFX極

ワンクリックFX WINNERS

シリーズ全5製品を1つにまとめたオールインワンの統合トレード環境

「ワンクリックFX WINNERS」は、MT4/MT5向けの「ワンクリックFX」シリーズ全5製品を1つにまとめたオールインワンの統合トレード環境(パッケージ商品)です。

単体のツールではなく、練習・検証からリアルトレード、自動売買、リスク管理までをワンストップで行えるようにセット化されています。

  1. ワンクリックFX MAX(リアルトレード支援)
    • ワンクリックでの注文・一括決済や、柔軟なトレーリングストップ、リスク%に応じたロット自動計算などで実戦トレードをアシスト。
  2. ワンクリックFXトレーニング(練習&検証シミュレーター)
    • 土日や深夜でも過去チャートを再現してノーリスクで練習可能。トレード結果のAI分析・評価機能も搭載。
  3. ワンクリックFXクローザー(口座リスク管理・決済アシスト)
    • 複数通貨ペアや他社EAも含めた全ポジションの損益をリアルタイムでチャート可視化し、一括・部分決済で資金を防衛。※MT5版は、現在準備中
  4. ワンクリックFX検証withAI(テクニカル検証支援)
    • トレードの振り返りや手法のバックテスト結果を生成AI等を活用して分析・検証するツール。
  5. ワンクリックFXアローズ(シグナル自動売買&検証)
    • 手持ちのサインツール(矢印インジケーター)を連動させ、自動売買化や過去データでの勝率シミュレーションを行うツール。※MT5版は、現在準備中

※MT5版は順次追加、2026年末には対応予定の全商品がリリースされる予定です。購入者の方は追加費用無しでご利用いただけます。

\ 公式サイトで詳細を見る /
ワンクリックFX WINNERS
本の広告

本を読む

この枠内は、広告(PR)を含みます。
※FXは元本保証のない金融商品です。相場変動により損失が生じる可能性がありますので、ご理解のうえでご覧ください。

『火車』宮部みゆき 

本好きの先輩も絶賛!移動中の時間を忘れる傑作ミステリー

出張に出かける先輩から「電車の中で暇だから何か貸して」と言われ、この本を渡しました。戻ってきた開口一番、「ずいぶん面白い本読んでるじゃねーか!」と大絶賛。

クレジットカード破産と女性の失踪をめぐる重厚なストーリーで、一度読み始めるとページをめくる手が止まらなくなります。通勤や長距離移動のお供にぜひ。

\ Amazonで詳細・口コミを見る /

火車 (新潮文庫)

『ゾーン — 相場心理学入門』マーク・ダグラス

投資家の精神(メンタル)を鍛え上げるバイブル

FXを始めてすぐの時期に買いました。私は本にあまり書き込みをしないタイプなのですが、なぜかこの本には書き込みをしています。それだけ「本気で理解したい」と思わせる深さがありました。

……ただ、正直に言うと内容がかなり難解で、「読み終わった」という実感がありません。

「今度こそ」と思ってたまに手には取るものの、やっぱり難しくて途中で閉じてしまう。それでも手放す気になれない、不思議な魅力を持った一冊です。

\ Amazonで詳細・口コミを見る /
『デイトレード』オリバー・ベレス / グレッグ・カプラ

トレードのメンタル面や心得について書かれた名著と言われる本

通勤電車の中で2回がっつり読み込みました。ただ、正直なところ「この本がトレードの役に立ったか」と言われると、全くそんな感じがしていません。

Amazonなどで他の方の口コミを見ると大絶賛ばかりで、その熱量にドン引きです。「自分はみんなと感覚が違うんだな」と痛感させられました。それでもまだ手元に置いてあります。

\ Amazonで詳細・口コミを見る /
『投資マスターガイド』株式会社FPO

FXを始める前に読んでおきたかった無料の電子書籍

FXのトレードがある程度できるようになってから、「そういえば入門書を1冊も持っていないな」とふと思ったんです。 そこで本を買おうと探してみたものの、どれもピンとこず……結局手にしたのは無料のこの電子書籍でした。

実際に読んでみた感想としては、正直そこまで役立ったわけではありませんでした。というのも、すでに自分の中で情報の取捨選択ができる状態になっていたからです。読むタイミングが遅すぎました。 FXを始める前や、まだ手探りの段階で読んでおくのが一番効果的だと思います。


\ メールアドレス登録だけで今すぐ読めます /
FX投資マスターガイド無料提供中!(図解オールカラー128ページ)

\ 詳しく解説しました /
自分使用口座広告

口座をまだ選べていない人へ

私が利用している口座を公開しています(広告・PRを含みます)。※タップで開閉

以下はサイト運営者が利用・検討中の口座情報です。

サイト運営者が開設・利用している口座(広告(PR)リンクを含みます)
DMM FX 外国為替証拠金取引らくらくFX【外為ファイネスト】国内MT4・NDDカリネックスブリッジ
ぶっちゃけメイン口座は、FXTFです。SBI FXトレードは最初に開設した口座です。DMM FXは、5番目くらいに開設した口座ですが、使い始めた時に1番最初に開設しておけばよかったと思った口座です。ヒロセ通商とJFXは両方同時に開設、どっちのキャンペーンで迷わない、ダブルキャンペーン作戦。他にも開設したい口座はありますが、管理的にお腹一杯です。
(PR)FXトレード・フィナンシャル
(PR)DMM FX
(PR)ヒロセ通商、(PR)JFX

サイト運営者がGMOクリック証券を利用していない理由は、審査に落ちたからです。口座開設時、資金運用方針に強気の回答をしたのが原因だと思います。もちろん反省しています。

MT4でEA稼働口座は、FXTF、外為ファイネスト、楽天FXです。
(PR)FXトレード・フィナンシャル
(PR)業界最狭水準スプレッドの国内MT4!カリネックスブリッジ採用
楽天証券 FX

架空キャラ「麻美」による開設迷い中の口座(広告(PR)リンクを含みます)
DMM FX 外国為替証拠金取引らくらくFX【外為ファイネスト】国内MT4・NDDカリネックスブリッジ

架空キャラ「深雪」による使用中の架空証券会社

サイト運営者が利用したことがある口座(広告(PR)リンクを含みます)

人気ブログランキングの説明

人気ブログランキングのメリット

このサイトでは、下のようなバナーを置いています。他のサイトでも同じようなものを見かけたことがあるかもしれません。

「#為替」人気ブログランキング「#fx」人気ブログランキング「#python」人気ブログランキング「#fx生活」人気ブログランキング「#fxブログ」人気ブログランキング「#fxなぜ勝てない」人気ブログランキング「#FXで勝てない人」人気ブログランキング「#FXで負けている人」人気ブログランキング「#FXで損切できない人」人気ブログランキング

これらは、外部サイト『人気ブログランキング』を開くためのリンクです。

人気ブログランキングとは、ネット上にあるたくさんのブログが集まり、カテゴリ別に順位を競っているポータルサイトです。

なぜこんなバナーを置いてあるのか?

一番の理由は、サイトの「宣伝」と「ポイント獲得」のためです。 バナーをクリックして外部サイトへ移動してもらうことで、当ブログにポイントが入り、ランキングでの露出が増える仕組みになっています。

読者にとって何かメリットはあるのか?

実はこの「人気ブログランキング」、Googleなどの検索エンジンではなかなか見つけにくい個人ブログやマニアックな記事を探すのにすごく役立ちます。

同じカテゴリ(為替・FXなど)で「今どんな記事が読まれているのか」「他の人はどんな分析をしているのか」を一覧で探したい時のポータルサイトとして、ぜひ活用してみてください。

フォローバナーとは?

人気ブログランキングでフォロー


こちらのバナーは、特殊なバナーで、人気ブログランキングを開くと同時に、人気ブログランキング内で、当ブログを「お気に入り登録(フォロー)」します。後で登録解除は可能です。

他のブログランキングについて

当サイトでは『日本ブログ村』や『FC2ブログランキング』にも参加しています。基本的な仕組みや設置目的は同じです。