2017-09-22 17 views
1

ソケット(TCP/IP)から受け取った値を変数に代入する必要があるため、フォームのラベルに使用することができます。 私は何時間も探していて何かを見つけることができなかったので、ここで質問しています。この値をC#のグローバル変数に設定するにはどうすればよいですか?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net; 
using System.Net.Sockets; 
using System.Windows.Forms; 

namespace ConsoleApp1 
{ 
class Exemys 
{ 
     static byte[] Buffer { get; set; } 
     static Socket sck; 
     [STAThread] 
     public static void Conectar(/*string[] args*/) 
     { 
      sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      IPEndPoint localEndpoint = new IPEndPoint(IPAddress.Parse("192.168.34.230"), 5202); 
      try 
      { 
       sck.Connect(localEndpoint); 
       Console.WriteLine("Exemys connected!\r\n"); 
      } 
      catch 
      { 
       Console.Write("Unable to connect to Exemys\r\n"); 
       Conectar(/*args*/); 
      } 
     while (true) 
     { 
      Buffer = new byte[sck.SendBufferSize]; 
      int bytesRead = sck.Receive(Buffer); 
      byte[] formatted = new byte[bytesRead]; 
      for (int i = 0; i < bytesRead; i++) 
      { 
       formatted[i] = Buffer[i]; 
      } 
      string mensaje = Encoding.ASCII.GetString(formatted); 
      Console.Write(mensaje + "\r\n"); 

     } 
    }  
} 
} 

このコードはクラスで書かれており、フォームは別の場所にあります。 私はasignする必要がある値はmensajeです、私はフォームのテキストボックスでそれを見ることができます。 私の英語のために申し訳ありません、そしてありがとう!

+0

''フォームは他の場所にあります " - 他の場所は何ですか?このコードはどのようにフォームに関連していますか? – David

+0

@David申し訳ありませんが自分自身を表現していないと、フォームは同じプロジェクトにあります。私はこのコードがFormのコードにないことを意味します。 – Joaco

+0

このコードは、これがコンソールアプリケーション全体であることを示しています。それは...ですか?どのようにフォームはそれに関連していますか? – David

答えて

0

まず第一に、グローバル変数は悪いデザインのような匂いがします。とにかく、ConsoleApplicationの例を挙げているようですが、おそらくWindowsフォームアプリケーションがありますか?明らかに、コンソールアプリケーションからフォームを実行することはできませんので、すべてをWindowsフォームアプリケーションに変換して開始してください。あなたがフォームの作業をした後Conectar()は、我々は実際に我々はConnectAndGetMessage()のような、より良い名前を与えることができるように

とにかく、あなたはおそらく、実際にメッセージを返すために、あなたのコードを変更することができます。その後、フォームからそのメソッドを呼び出します。おそらくLoadハンドラで呼び出されます。

簡単に言えば、あなたはこのような何か行うことができます:

class Exemys { 

    public static string ConnectAndGetMessage() { 
     // Here your code! ;) 
     return mensaje; 
    } 
} 

class FormWithTextbox { 

    private void FormWithLabel_Load(object sender, System.EventArgs e) 
    { 
     Textbox1.Text = Exemys.ConnectAndGetMessage(); 
    } 
} 

をあなたはとにかく、代わりに依存関係としてExemysを注入する必要があるため、後で改善のためになること、これが最善の解決策ではないことに注意してください。

あなたのコードについてもう一つ指摘しますが、おそらくすぐに知ることができるのは、whileループを終了していないということです。無限ループに終わるでしょう。

+0

を使ってフォームに静的にアクセスできました。ありがとうございます、これを試してみて、これが私に役立つかどうか教えてください! whileループを参照すると、受信したデータを常に読み取る必要があるため、そのように設定しました。それ以外は見つけられませんでした。 – Joaco

+0

その場合は、接続して、Exemysクラス以外のwhileループからデータを取得しようとするため、受信したものを返すことができます。さて、助けてくれることを希望します。 –

+0

申し訳ありませんが、あなたが私に与えたコードを試しましたが、うまくいきませんでした。値はまだテキストボックスに表示されません。とにかくありがとう! – Joaco

関連する問題