質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

1回答

2173閲覧

C# 通信の仕方

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/05/16 09:31

https://note.chiebukuro.yahoo.co.jp/detail/n1657?__ysp=YyMg44K144O844OQ44O8IOWPgueFpw%3D%3Dを参考にサーバーとクライアントを作成しました。

質問ですが、サーバー側にstring a = "あいうえお";というフィールドを作成し、クライアント側でボタンをクリックするとサーバー側からデータを読んで来て、テキストボックスに「あいうえお」と表示させるにはどうすればよいのでしょうか?
NetworkStreamを使わないと出来ないのでしょうか?
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

クライアントからサーバに適当なリクエストを送り、サーバはそれを受けてクライアントに文字列を返し、クライアントはそれを受信してテキストボックスに入れたらできます。

投稿2017/05/16 09:43

Zuishin

総合スコア28656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/05/16 09:46

素早いご回答ありがとうございます。 私、プログラミングを初めて1か月程度なのでやり方がさっぱりわかりません。 お手数をおかけしますが、よろしければ初心者にわかりやすく教えていただけませんでしょうか? よろしくお願いいたします。
Zuishin

2017/05/16 09:47

作ったサンプルの動きは理解しましたか?
Zuishin

2017/05/16 09:56

サーバのコードを見ると、クライアントからのリクエストを受けてそのメッセージをテキストボックスに入れ、返信を作成してクライアントに返しています。ならばサーバはその返信を「あいうえお」にし、クライアントはその返信を自分のテキストボックスに入れたらいいだけではないですか? コピペするだけではなく処理を追いましょう。
退会済みユーザー

退会済みユーザー

2017/05/16 09:57

時間はかかりましたがなんとか理解はできました。
退会済みユーザー

退会済みユーザー

2017/05/16 10:01

サーバーのソースコード using System; using System.Text; using System.Windows.Forms; using System.Net.Sockets; using System.Threading; using System.Text.RegularExpressions; using System.Collections.Generic; namespace サーバーアプリ { public partial class Form1 : Form { public Form1() { InitializeComponent(); // スレッドからテキストボックスをアクセスすることを指定             CheckForIllegalCrossThreadCalls = false; } //=========================== // メンバー変数 private TcpListener server; // リスナー(接続待ちや受信等を行なうオブジェクト) private Thread ListeningCallbackThread;   // 接続待ちスレッド private volatile bool SLTAlive; // 接続中か未接続か(volatile が指定されていることに注意)  string StrList; //クライアントから入力された文字を入れておく変数(フィールド) string NumList; //クライアントから入力された数字を入れておく変数(フィールド) //=========================== private void Form1_Load(object sender, EventArgs e) { SLTAlive = false; //未接続 textBox1.Text = "\r\n" + "\r\n"; textBox2.Text = "\r\n" + "\r\n"; } //=========================== //フォーム閉鎖時イベント private void Form1_FormClosed_1(object sender, FormClosedEventArgs e) { // サーバアプリを終了するにもかかわらず、接続待ちスレッドを終了していない場合の処理 if (SLTAlive) { // スレッド終了指示フラグを終了に設定 SLTAlive = false; //接続要求の受け入れの終了 server.Stop(); //念のためスレッドをnull設定 ListeningCallbackThread = null; } } //=========================== //// 接続待ち開始ボタンのクリックイベント private void button1_Click(object sender, EventArgs e) { if (SLTAlive == false) { // 接続待ち用スレッドを作成 ListeningCallbackThread =new Thread(ListeningCallback); // 接続待ち用スレッドを開始 ListeningCallbackThread.Start(); // スレッド終了指示フラグを未終了に設定 SLTAlive = true; } } //=========================== // 接続待ち終了ボタンのクリックイベント private void button2_Click(object sender, EventArgs e) { if (SLTAlive == true)  // 接続待ちスレッドが作成されていて使える場合             { if (server != null) { // 接続要求受け入れの終了 server.Stop(); } // スレッド終了指示フラグを終了に設定                 SLTAlive = false; label1.Text = "サーバー終了"; } } //============         // 接続待ちスレッド用メソッド private void ListeningCallback() { // リスナー(接続要求受け入れ待機)を生成 server = new TcpListener(System.Net.IPAddress.Parse("127.0.0.1"), 9000); // 接続要求受け入れ開始 server.Start(); label1.Text = "サーバー開始"; try { // 受信の受付を行なうための無限ループ while (SLTAlive == true) // スレッド終了指示フラグでの終了指示がある場合はループ終了 { // 受信接続キュー内で、接続待ちがあるか判断 if(server.Pending() == true) { // クライアントからの接続を受け付ける TcpClient ClientSocket = server.AcceptTcpClient(); //TCPクライアント // 通信ストリームの取得 NetworkStream stream = ClientSocket.GetStream(); // クライアントからの電文の受信 byte[] ReceiveDate = new byte[2000]; int DateLength = stream.Read(ReceiveDate, 0, ReceiveDate.Length); //電文の列長 string str = new string(Encoding.Unicode.GetString(ReceiveDate, 0, ReceiveDate.Length).ToCharArray()); //オブジェクトの生成 if (str[0] == 49) //49は10進数でいうと「1」 { str = str.Remove(0, 1); //最初の1文字(1)を削除 if (Regex.IsMatch(str, @"[0-9]")) { MessageBox.Show("半角数字が入力されています", "エラー"); } else { StrList += str; //クライアントから入力された文字が文字 textBox1.Text += StrList; textBox1.Text += "\r\n"; //改行 } } else if(str[0] == 50) //50は10進数でいうと「2」 { str = str.Remove(0, 1); //最初の1文字(2)を削除 if (Regex.IsMatch(str, @"\d")) { NumList += str; //クライアントから入力された文字が数字 textBox2.Text += NumList; textBox2.Text += "\r\n"; } else { MessageBox.Show("数字以外が入力されています", "エラー"); } } // 返信電文をクライアントへ送信 byte[] SendBuffer = Encoding.Unicode.GetBytes("Thank you"); stream.Write(SendBuffer, 0, SendBuffer.Length); stream.Flush(); // フラッシュ(強制書き出し)                         // TCPクライアントを閉じる                         ClientSocket.Close(); } // 短時間だけ待機 Thread.Sleep(100); } } catch(Exception ex) { label1.Text = "サーバー終了"; } } } }
退会済みユーザー

退会済みユーザー

2017/05/16 10:01

クライアントのソースコード using System; using System.Text; using System.Windows.Forms; using System.Net.Sockets; using System.Threading; using System.Text.RegularExpressions; using System.Collections.Generic; namespace サーバーアプリ { public partial class Form1 : Form { public Form1() { InitializeComponent(); // スレッドからテキストボックスをアクセスすることを指定             CheckForIllegalCrossThreadCalls = false; } //=========================== // メンバー変数 private TcpListener server; // リスナー(接続待ちや受信等を行なうオブジェクト) private Thread ListeningCallbackThread;   // 接続待ちスレッド private volatile bool SLTAlive; // 接続中か未接続か(volatile が指定されていることに注意)  string StrList; //クライアントから入力された文字を入れておく変数(フィールド) string NumList; //クライアントから入力された数字を入れておく変数(フィールド) //=========================== private void Form1_Load(object sender, EventArgs e) { SLTAlive = false; //未接続 textBox1.Text = "\r\n" + "\r\n"; textBox2.Text = "\r\n" + "\r\n"; } //=========================== //フォーム閉鎖時イベント private void Form1_FormClosed_1(object sender, FormClosedEventArgs e) { // サーバアプリを終了するにもかかわらず、接続待ちスレッドを終了していない場合の処理 if (SLTAlive) { // スレッド終了指示フラグを終了に設定 SLTAlive = false; //接続要求の受け入れの終了 server.Stop(); //念のためスレッドをnull設定 ListeningCallbackThread = null; } } //=========================== //// 接続待ち開始ボタンのクリックイベント private void button1_Click(object sender, EventArgs e) { if (SLTAlive == false) { // 接続待ち用スレッドを作成 ListeningCallbackThread =new Thread(ListeningCallback); // 接続待ち用スレッドを開始 ListeningCallbackThread.Start(); // スレッド終了指示フラグを未終了に設定 SLTAlive = true; } } //=========================== // 接続待ち終了ボタンのクリックイベント private void button2_Click(object sender, EventArgs e) { if (SLTAlive == true)  // 接続待ちスレッドが作成されていて使える場合             { if (server != null) { // 接続要求受け入れの終了 server.Stop(); } // スレッド終了指示フラグを終了に設定                 SLTAlive = false; label1.Text = "サーバー終了"; } } //============         // 接続待ちスレッド用メソッド private void ListeningCallback() { // リスナー(接続要求受け入れ待機)を生成 server = new TcpListener(System.Net.IPAddress.Parse("127.0.0.1"), 9000); // 接続要求受け入れ開始 server.Start(); label1.Text = "サーバー開始"; try { // 受信の受付を行なうための無限ループ while (SLTAlive == true) // スレッド終了指示フラグでの終了指示がある場合はループ終了 { // 受信接続キュー内で、接続待ちがあるか判断 if(server.Pending() == true) { // クライアントからの接続を受け付ける TcpClient ClientSocket = server.AcceptTcpClient(); //TCPクライアント // 通信ストリームの取得 NetworkStream stream = ClientSocket.GetStream(); // クライアントからの電文の受信 byte[] ReceiveDate = new byte[2000]; int DateLength = stream.Read(ReceiveDate, 0, ReceiveDate.Length); //電文の列長 string str = new string(Encoding.Unicode.GetString(ReceiveDate, 0, ReceiveDate.Length).ToCharArray()); //オブジェクトの生成 if (str[0] == 49) //49は10進数でいうと「1」 { str = str.Remove(0, 1); //最初の1文字(1)を削除 if (Regex.IsMatch(str, @"[0-9]")) { MessageBox.Show("半角数字が入力されています", "エラー"); } else { StrList += str; //クライアントから入力された文字が文字 textBox1.Text += StrList; textBox1.Text += "\r\n"; //改行 } } else if(str[0] == 50) //50は10進数でいうと「2」 { str = str.Remove(0, 1); //最初の1文字(2)を削除 if (Regex.IsMatch(str, @"\d")) { NumList += str; //クライアントから入力された文字が数字 textBox2.Text += NumList; textBox2.Text += "\r\n"; } else { MessageBox.Show("数字以外が入力されています", "エラー"); } } // 返信電文をクライアントへ送信 byte[] SendBuffer = Encoding.Unicode.GetBytes("Thank you"); stream.Write(SendBuffer, 0, SendBuffer.Length); stream.Flush(); // フラッシュ(強制書き出し)                         // TCPクライアントを閉じる                         ClientSocket.Close(); } // 短時間だけ待機 Thread.Sleep(100); } } catch(Exception ex) { label1.Text = "サーバー終了"; } } } }
Zuishin

2017/05/16 10:05

私ではなくあなたが読むんですよ。理解できているなら初心者でも簡単に書き換えられます。 本当に理解しましたか?
退会済みユーザー

退会済みユーザー

2017/05/16 10:05

長々と失礼いたします。 クライアントの新たなForm(Form2)のテキストボックスに表示させたいのですがここからがよくわからないのです。。。 どうかよろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2017/05/16 10:06

わかりました。 もう一度見直してみます。 ありがとうござました!
Zuishin

2017/05/16 10:07

何がわからないんでしょう? テキストボックスへの表示の仕方はサーバのものを真似てください。 サーバでテキストボックスに表示している部分がどこかわかりますか?
退会済みユーザー

退会済みユーザー

2017/05/16 10:10

はい、わかります。 私がわからないのは、NetworkStreamを使わずに、サーバのフィールドの値をどうやってゲットするのかがわからないのです。
Zuishin

2017/05/16 10:13

サーバのフィールドの値を直接ゲットはできません。 サーバからクライアントへ返信電文を送っていますね? クライアントからサーバに「フィールドの値を送ってください」とリクエストを送り、サーバはそれを見てフィールドの値を返信電文としてクライアントに送ってください。 この手続きでゲットできます。
退会済みユーザー

退会済みユーザー

2017/05/16 10:18

そのようにすればよいのですね。。やり方は理解できました。ありがとうございます。 クライアントからサーバに「フィールドの値を送ってください」というリクエストはどのように書けばよいのでしょうか? 何度もお手数をおかけしてすみません。。。
Zuishin

2017/05/16 10:21

「フィールドの値を送ってください」と書けばいいです。 というかなんでもいいです。適当に決めてください。 クライアントからのリクエストの内容とサーバからのレスポンスの取り決め、これをプロトコルと言います。 サーバもクライアントも自分で作るので、プロトコルは自分で決めて大丈夫です。
退会済みユーザー

退会済みユーザー

2017/05/16 10:23

Zuishinさん、ありがとうございました!! やってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問