2017-01-09 117 views
1

我一直在觀看以下關於如何創建TCP/IP連接的視頻對:ServerClient 我需要做的是創建一個遊戲(flipcard)我只發送一個矩陣的2個座標。而已。或更少。TCP/IP在不關閉連接的情況下連續接收消息

(代碼將遵循)

從我所觀察到的,他關閉並重新打開連接,每次他發送消息。它正在工作。但是,在代碼中修改以保持連接打開並且在郵件到達時檢測到什麼

我所有的谷歌的搜索把我帶到了這2種方法:

  1. I have had luck using the socket object directly (rather than the TCP client).(但我不希望使用插座)
  2. Also uses sockets

當我點擊開始服務器

 private void bStartServer_Click(object sender, EventArgs e) 
    { 
     Thread tcpServerRunThread = new Thread(new ThreadStart(TCPServerRun)); 
     tcpServerRunThread.Start(); 
    } 

服務器運行並等待連接

private void TCPServerRun() 
    { 
     TcpListener tcpListener = new TcpListener(IPAddress.Any, 2016); 
     tcpListener.Start(); 
     updateUI("Listening"); 
     while (true) 
     { 

      TcpClient client = tcpListener.AcceptTcpClient(); 
      updateUI("Connected"); 
      Thread tcpHandlerThread = new Thread(new ParameterizedThreadStart(tcpHandler)); 
      tcpHandlerThread.Start(client); 
     } 
    } 

我處理我的消息

private void tcpHandler(object client) 
    { 
     TcpListener tcpListener = new TcpListener(IPAddress.Any, 5004); 
     TcpClient mClient = (TcpClient)client; 
     NetworkStream stream = mClient.GetStream(); 
     byte[] message = new byte[1024]; 
     stream.Read(message,0, message.Length); 
     updateUI("New message = " + Encoding.ASCII.GetString(message)); 
     stream.Close(); 
     mClient.Close(); 
    } 

注意updateUI是藉着他造的更新列表框項

功能客戶端 - 幾乎像服務器端 `private void button1_Click(object sender,EventArgs e) { Thread mThread = new Thread(new ThreadStart(ConnectAsClient)); mThread.Start(); }

private void ConnectAsClient() 
    { 
     //     aici putem inlocui cu adresa de IP dorita    
     //client.Connect(IPAddress.Parse(textBox.Text), 5004); 
     client = new TcpClient(); 
     //client.Connect(IPAddress.Parse("127.0.0.1"), 2016);  // for when I'm not connected to network 
     client.Connect(IPAddress.Parse("my_ip_here"), 2016); // for when I am connected to the network 
     updateUI("connected"); 
     NetworkStream stream = client.GetStream(); 
     string s = "Hello world!"; 
     byte[] message = Encoding.ASCII.GetBytes(s); 
     stream.Write(message, 0, message.Length); 
     this.updateUI("Message sent!"); 
     stream.Close(); 
     // client.Close(); 
    }` 

如果我沒有錯,每次他再次連接,他創造了一個新的連接,而不是打開舊的,對不對? (這是我第一次使用TCP/IP,自己學習,所以我寧可不使用套接字,如果可能的話)

----------------- -------------------------------------------------- ----

全部鏈接到我的代碼(從一開始提供的視頻略低修改):

  1. TCPClient
  2. TCPServer
+0

你不需要關閉它。但是如果我沒有記錯的話,您需要向客戶端發送響應消息,然後才能收到下一條消息 – Steve

回答

0

您每次發送消息時都重新連接。爲此使用兩種不同的方法;一個用於連接到服務器,然後是另一個用於實際發送消息。像這樣:

TcpClient client; 
private void ConnectAsClient() 
{   
    //client.Connect(IPAddress.Parse(textBox.Text), 5004); 
    client = new TcpClient(); 
    //client.Connect(IPAddress.Parse("127.0.0.1"), 2016); 
    client.Connect(IPAddress.Parse("my_ip_here"), 2016); 
    updateUI("connected"); 
} 
void SendMessage() 
{ 
    NetworkStream stream = client.GetStream(); 
    string s = "Hello world!"; 
    byte[] message = Encoding.ASCII.GetBytes(s); 
    stream.Write(message, 0, message.Length); 
    this.updateUI("Message sent!"); 
} 
+0

並且如何檢測消息何時到達?它已經設置的「tcpHandler」方法中的 – SnuKies

+0

。它會凍結在線「stream.Read(...」),直到它收到一條消息。 –