• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:簡単なネットワークプログラムなのですが・・・)

ネットワーク通信の基礎を学ぶための簡単なプログラムでSocket通信を行おうとしていますが、送信したメッセージを受信する際にsocketを閉じないと送信できません。解決策はありますか?

このQ&Aのポイント
  • ネットワーク通信の基礎を学ぶために、Socket通信の簡単なメッセージ送受信を行おうとしています。しかし、streamを使って送信したメッセージを受信する際にsocketを閉じないと送信できません。
  • 常に受信させたいため、socketを閉じているとnull例外が発生してしまいます。この問題を解決するための手段はありますか?
  • 現在のプログラムでは、サーバーを開始して待機し、クライアントとの接続後にメッセージの受信を行っています。受信時にはstreamを使ってデータを読み込みます。

質問者が選んだベストアンサー

  • ベストアンサー
  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.3

とりあえず作ってみました。エラー処理等は入っていません。 これを2つ起動して片方サーバに、もう片方をクライアントにすればいけると思います。 public partial class Form1 : Form { delegate void SetTextMessageHandler(String strMessage); SetTextMessageHandler eventRead; Thread threadRead; TcpListener tcpListener; TcpClient tcpClient; NetworkStream clientStream; public Form1() { InitializeComponent(); eventRead = new SetTextMessageHandler(setTextMessage); } private void threadStartWork() { if (tcpListener == null) { tcpListener = new TcpListener(IPAddress.Parse("127.0.0.1"), 30001); tcpListener.Start(); TcpClient tcpServer = tcpListener.AcceptTcpClient(); NetworkStream serverStream = tcpServer.GetStream(); Byte[] aryBuffer = new Byte[100]; int nRead = serverStream.Read(aryBuffer, 0, aryBuffer.Length); while (nRead > 0) { Object[] aryArgs = new Object[1]; aryArgs[0] = Encoding.UTF8.GetString(aryBuffer, 0, nRead); this.Invoke(eventRead, aryArgs); nRead = serverStream.Read(aryBuffer, 0, aryBuffer.Length); } } } private void setTextMessage(String strMessage) { textBox1.Text = strMessage; } private void button1_Click(object sender, EventArgs e) // 待受 { threadRead = new Thread(new ThreadStart(threadStartWork)); threadRead.Start(); } private void button2_Click(object sender, EventArgs e) // 接続 { tcpClient = new TcpClient(); tcpClient.Connect(IPAddress.Parse("127.0.0.1"), 30001); clientStream = tcpClient.GetStream(); } private void button3_Click(object sender, EventArgs e) // 送信 { Byte[] aryBuffer = Encoding.UTF8.GetBytes(textBox1.Text); clientStream.Write(aryBuffer, 0, aryBuffer.Length); } }

uryotti
質問者

お礼

ありがとうございました! 参考にさせていただきます!

その他の回答 (2)

  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.2

このコードはC#の簡易ソケット通信のサーバ側ですね。#1さんの言うように、言語環境などが書いてないと回答する方も回答できないでしょう。 で、送信できないということは、最初にクライアント側に問題があると考えると思うのですが、そのクライアント側のコードがないので、どこに問題があるのかがわかりません。 まずはクライアント側のコードを補足されてみては?

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.1

ソースのネストが全部つぶれてるためコード見るのが苦痛で あまりちゃんと見てませんが使ってる環境(コンパイラ・OS)は何でしょうか? 個人的に見慣れない環境のような気がしてるんですが (XPでVC6++環境の知識なので根本違ったらごめんなさい) 作ってるのはサーバ・クライアント両方ですか? サーバのほうで言えばLisn(だっけ?)接続待ちしてるのが どこか分かりませんがservrt.start() 関数なのでしょうか? 接続語コネクション張らないといけないはずですが そのあたりのコードが一切見当たらない気がします もしVC系統使われているのであればソケット通信の サンプルプログラムがCDにあるのではないかと思いますが (VC6にはあります) Socket通信の作り的には全てイベント定義の形で ソケット操作するはずです ACCEPT/READ/WRITE/CLOSE 全てイベントが飛ぶので 無限ループなんか作る必要ないはずです