質問編集履歴
3
訂正
title
CHANGED
File without changes
|
body
CHANGED
@@ -94,8 +94,6 @@
|
|
94
94
|
//Receiveメソッドの呼び出し
|
95
95
|
Receive(stream);
|
96
96
|
|
97
|
-
// TCPクライアントを閉じる
|
98
|
-
|
99
97
|
}
|
100
98
|
|
101
99
|
// 短時間だけ待機
|
2
追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -44,4 +44,85 @@
|
|
44
44
|
調べてみると使い捨て???みたいな事が書いてありましたが私にはよくわかりませんでした。
|
45
45
|
|
46
46
|
以上、どうすれば2回目以降も送受信ができるのか教えてください。
|
47
|
-
よろしくお願いいたします。
|
47
|
+
よろしくお願いいたします。
|
48
|
+
|
49
|
+
サーバーのコードです。(今回必要と思う箇所だけ抜粋)
|
50
|
+
```C#
|
51
|
+
//// 接続待ち開始ボタンのクリックイベント
|
52
|
+
private void button1_Click(object sender, EventArgs e)
|
53
|
+
{
|
54
|
+
if (SLTAlive == false)
|
55
|
+
{
|
56
|
+
// スレッド終了指示フラグを未終了に設定
|
57
|
+
SLTAlive = true;
|
58
|
+
|
59
|
+
// 接続待ち用スレッドを作成
|
60
|
+
ListeningCallbackThread =new Thread(Start);
|
61
|
+
|
62
|
+
// 接続待ち用スレッドを開始
|
63
|
+
ListeningCallbackThread.Start();
|
64
|
+
|
65
|
+
}
|
66
|
+
}
|
67
|
+
|
68
|
+
|
69
|
+
//=========================================
|
70
|
+
|
71
|
+
//接続要求受け入れ開始
|
72
|
+
public void Start()
|
73
|
+
{
|
74
|
+
|
75
|
+
// 接続要求受け入れ開始
|
76
|
+
server.Start();
|
77
|
+
form.label1.Text = "サーバー開始";
|
78
|
+
|
79
|
+
try
|
80
|
+
{
|
81
|
+
// 受信の受付を行なうための無限ループ
|
82
|
+
|
83
|
+
while (form.SLTAlive == true) // スレッド終了指示フラグでの終了指示がある場合はループ終了
|
84
|
+
{
|
85
|
+
// 受信接続キュー内で、接続待ちがあるか判断
|
86
|
+
if (server.Pending() == true)
|
87
|
+
{
|
88
|
+
// クライアントからの接続を受け付ける
|
89
|
+
TcpClient ClientSocket = server.AcceptTcpClient();
|
90
|
+
|
91
|
+
// 通信ストリームの取得
|
92
|
+
NetworkStream stream = ClientSocket.GetStream();
|
93
|
+
|
94
|
+
//Receiveメソッドの呼び出し
|
95
|
+
Receive(stream);
|
96
|
+
|
97
|
+
// TCPクライアントを閉じる
|
98
|
+
|
99
|
+
}
|
100
|
+
|
101
|
+
// 短時間だけ待機
|
102
|
+
|
103
|
+
Thread.Sleep(100);
|
104
|
+
|
105
|
+
}
|
106
|
+
}
|
107
|
+
catch (Exception ex)
|
108
|
+
{
|
109
|
+
form.label1.Text = "サーバー終了";
|
110
|
+
}
|
111
|
+
|
112
|
+
}
|
113
|
+
|
114
|
+
//=========================================
|
115
|
+
|
116
|
+
//クライアントからの受信
|
117
|
+
public void Receive(NetworkStream stream)
|
118
|
+
{
|
119
|
+
// クライアントからの電文の受信
|
120
|
+
byte[] ReceiveDate = new byte[2000];
|
121
|
+
stream.Read(ReceiveDate, 0, ReceiveDate.Length);
|
122
|
+
|
123
|
+
string str = new string(Encoding.Unicode.GetString(ReceiveDate, 0, ReceiveDate.Length).ToCharArray()); //オブジェクトの生成
|
124
|
+
str = str.TrimEnd("\0".ToCharArray());
|
125
|
+
|
126
|
+
・・・以下省略・・・
|
127
|
+
}
|
128
|
+
```
|
1
訂正
title
CHANGED
File without changes
|
body
CHANGED
@@ -12,6 +12,7 @@
|
|
12
12
|
```
|
13
13
|
のようにTcpClientをnewしてIPアドレスの指定をしてソケットをClose()していました。
|
14
14
|
サーバー側は、接続を受け付けて、クライアントから文字の受信が終わればソケットをClose()としていました。
|
15
|
+
その後、無限ループでまた接続を受け付け→処理→Close()の繰り返しです。
|
15
16
|
これでは何度も同じ作業をすることになるので、クライアントのTcpClientのnewとIPアドレスの指定を一度だけして2回目以降は文字の送受信だけを行いたいと思い、下記のようにしてみました。
|
16
17
|
|
17
18
|
```C#
|