2009-04-27 16 views
0

私はリモートでクライアントを制御できるように、メッセージをコマンドとして受け入れるC#で自分のサーバーのクライアントを作成しようとしています。私はmasterServer.Connectに問題があった後、負荷をかけていました。アプリケーションを閉じるたびに、完全に停止するまで10秒待たなければなりません。私はこれを止めるためにあらゆることを試みました...運がない。だから、私はそれをあきらめて、今私はmasterConverter =新しいTcpClient()を使用している別の問題を修正するために、かなりうまくCreateConnection()スレッド内で動作するようです。スレッドが実行されたときしかし、私はどこかにラインの下)SendClientInfo(呼び出し、それは、このランタイムエラーになり:C#新しいキーワードで作成した別のスレッドでTcpClientオブジェクトを破棄しないようにするにはどうすればよいですか?

に配置されたオブジェクトにアクセスすることはできません、System.Net.Sockets.TcpClient

だから私は処分する前にオブジェクトを保存する方法を見つけ出すために最善を尽くしましたが、何かを行う方法を見つけることができません。

  1. mainServer =新しいTcpClient()が破棄されないようにするにはどうすればよいですか?SendClientInfo()でそれを使用できますか?
  2. 誰でもCreateConnection()メソッドを再作成して、正しい方法を知ることができますか?私はそのことを何千回書き直してきましたが、まだそれは非常にバギーに見え、masterServer.connect()はサーバにまだ接続していない場合にはそれをやります。
  3. その他の変更や修正については、こちらをご覧ください。私は何百ものチュートリアルのように読んでソケットを使う方法を自分で教えようとしているだけで何時間も何度も出入りしてきました。あなたが私が間違っていることを私に示しているものは、いつでも覚えて、次回は正しく覚えます。

これ以上情報が必要な場合はお知らせください...本当にありがとうございます。あなたがusingブロックを使用してはならない。この場合

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Net; 
using System.Net.Sockets; 
using System.Threading; 
using System.IO; 

namespace RemoteClient 
{ 
    public partial class Form1 : Form 
    { 
     private int MyPort = 56789; 
     private IPAddress myIp = IPAddress.Parse("210.232.115.79"); 
     private IPAddress serverIp = IPAddress.Parse("72.216.18.77"); // Master Server's IP Address 
     public static TcpClient masterServer = new TcpClient(); 

     private StreamWriter responseWriter; 
     private StreamReader commandReader; 

     private Thread connectionThread; 
     private Thread commandsThread; 

     private bool RequestExitConnectionThread { get; set; } 

     private delegate void AddMessageDelegate(string message, int category); 
     private delegate void ConnectedDelegate(); 

     private bool isConnected { get; set; } 

     public Form1() 
     { 
      InitializeComponent(); 
      isConnected = false; 
     } 

     private void LogMessage(string message, int category) 
     { 
      if (category == 1) 
      { 
       ListViewItem item = new ListViewItem(message); 
       item.BackColor = Color.LightGreen; 
       item.UseItemStyleForSubItems = true; 
       Log.Items.Add(item).SubItems.Add(DateTime.Now.ToString()); 
      } 
      if (category == 2) 
      { 
       ListViewItem item = new ListViewItem(message); 
       item.BackColor = Color.Orange; 
       item.UseItemStyleForSubItems = true; 
       Log.Items.Add(item).SubItems.Add(DateTime.Now.ToString()); 
      } 
      if (category == 3) 
      { 
       ListViewItem item = new ListViewItem(message); 
       item.BackColor = Color.Yellow; 
       item.UseItemStyleForSubItems = true; 
       Log.Items.Add(item).SubItems.Add(DateTime.Now.ToString()); 
      } 
      if (category == 0) 
      { 
       Log.Items.Add(message).SubItems.Add(DateTime.Now.ToString()); 
      } 
     } 

     private void Connected() 
     { 
      LogMessage("Found and Accepted Master Server's connection. Waiting for reply...",1); 
      Status.Text = "Connected!"; 
      Status.ForeColor = Color.Green; 

      commandsThread = new Thread(new ThreadStart(RecieveCommands)); 

      sendClientInfo(); 
     } 

     private void exitButton_Click(object sender, EventArgs e) 
     { 
      Disconnect(); 
      exitButton.Enabled = false; 
      exitButton.Text = "Closing..."; 

      if (connectionThread != null) 
      { 
       while (connectionThread.IsAlive) 
       { 
        Application.DoEvents(); 
       } 
      } 

      this.Close(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      Connect(); 
     } 

     private void Disconnect() 
     { 
      RequestExitConnectionThread = true; 

      if (masterServer != null) 
       masterServer.Close(); 

      if (connectionThread != null) 
       connectionThread.Abort(); 

      LogMessage("Closing Client. Please wait while Program threads end.", 2); 
     } 

     private void Disconnected() 
     { 
      Status.Text = "Disconnected"; 
      Status.ForeColor = Color.Red; 
      Connect(); 
     } 

     private void Connect() 
     { 
      LogMessage("Attempting to connect to Master Server...", 1); 

      connectionThread = new Thread(new ThreadStart(CreateConnection)); 
      connectionThread.Start(); 
     } 

     private void CreateConnection() 
     { 
      int i = 1; 
      bool success = false; 

      while (!success) 
      { 
       try 
       { 
        using (masterServer = new TcpClient()) 
        { 
         IAsyncResult result = masterServer.BeginConnect(serverIp, MyPort, null, null); 
         success = result.AsyncWaitHandle.WaitOne(1000, false); 
        } 

        if (success) 
        { 
         BeginInvoke(new ConnectedDelegate(this.Connected), new object[] {}); 
         break; 
        } 
        else 
        { 
         Thread.Sleep(2000); 
         BeginInvoke(new AddMessageDelegate(LogMessage), new object[] { "Connection Retry # " + i.ToString() + ". Master Server hasn't been started yet.", 3 }); 
        } 
       } 
       catch 
       { 
        MessageBox.Show("Error!"); 
       } 
       i++; 
      } 

     } 

     private void RecieveCommands() 
     { 
      MessageBox.Show("Hello!"); 
      commandReader = new StreamReader(masterServer.GetStream()); 

      string CommandResponse = commandReader.ReadLine(); 
      string Command = null; 

      if (CommandResponse != null) 
       MessageBox.Show("Recieved Command that was NOT null!"); 

      if (CommandResponse != null) 
      { 
       MessageBox.Show("Recieved null response!"); 
       BeginInvoke(new AddMessageDelegate(LogMessage), new object[] { "Disconnected From Master Server. Reason: Recieved Null response.", 1 }); 
       Disconnected(); 
      } 
      else if (CommandResponse.StartsWith("0")) 
      { 
       MessageBox.Show("Recieved 0 as a response!"); 
       Command = CommandResponse.Substring(2).Trim(); 

       isConnected = false; 
       BeginInvoke(new AddMessageDelegate(LogMessage), new object[] { "Disconnected From Master Server. Reason: " + Command, 1 }); 
      } 
      else if (CommandResponse.StartsWith("1")) 
      { 
       MessageBox.Show("Recieved 1 as a response!"); 
       isConnected = true; 
       BeginInvoke(new AddMessageDelegate(LogMessage), new object[] { "Connected to Master Server Successfully.", 1 }); 
      } 
     } 


     //************************** RESPONSE'S BELOW HERE ************************* \\ 

     private void sendClientInfo() 
     { 
      responseWriter = new StreamWriter(masterServer.GetStream()); 

      responseWriter.WriteLine(myIp.ToString()); 
      responseWriter.Flush(); 
     } 

    } 
} 
+0

「すなわち前に、Cの後を除いて」(「あなたがここに見ることができる任意の他の変更や修正」に関してで): - ] –

答えて

4

。実際に、気にならないいくつかの野生のシナリオがない限り、は、そのスコープの外で宣言された変数にブロックusingを決して使用しません。ブロックの完了時にusingブロックがDispose()メソッドを呼び出すため、サーバーが廃棄されています。ブロックを削除するコードを変更するだけで、すべての設定を行う必要があります。このように:

masterServer = new TcpClient(); 

IAsyncResult result = masterServer.BeginConnect(serverIp, MyPort, null, null); 
success = result.AsyncWaitHandle.WaitOne(1000, false); 
+0

ハハ、ありがとう。私のmasterServer.connect()を再加工する方法についてもう別の質問をするつもりです – OneShot

関連する問題