気になった事を自由に書いてます。
      
TCP/IP タイムアウトを設定して受信すると・・・③
一年前、TCP接続しクライアントでReadすると固まってしまう。
その回避策としてサブスレッド内で受信するという方法をとりました。

前回はこちら
もっとシンプルにできないか?という思いを持ちつつサブスレッドで妥協してました。

さて、今回紹介する回避策2はサブスレッドを使いません。
サーバからデータが届いているかを判定した後、データがあれば受信するという
方法でこの問題を解決します。
ああ、あのときもっと調査していればよかった。

テストコード
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

using System;
using System.Windows.Forms;
using System.Net.Sockets;

namespace HP
{
    public partial class Form11 : Form
    {
        private TcpClient _tcp = null;
        private NetworkStream _ns = null;

        public Form11()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // TCP/IP接続
            _tcp = new TcpClient("192.168.24.52", 4567);
            // ストリーム取得
            _ns = _tcp.GetStream();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            // DataAvailable が true の場合、Read メソッドの実行はすぐに終了します。
            if (_ns.DataAvailable)
            {
                // 受信データの読み出し
                byte[] buf = new byte[100];
                int len = _ns.Read(buf, 0, buf.Length);
                string s = System.Text.Encoding.UTF8.GetString(buf, 0, len);
                Console.WriteLine(DateTime.Now + "|" + s);
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            _ns.Close();
            _tcp.Close();
        }
    }
}

      






Copyright (C) 2011 - 2017 猫の気ままなC#日記