2017-05-05 10 views
-1

私はC#、WinFormsで簡単なチャットを作成しようとしています。WinFormsでチャット用のクライアントアプリケーションを作成する

 TcpClient client; 
     public MainWindow() 
     { 
      InitializeComponent(); 
      client = new TcpClient("192.168.0.100", 1234); 
      AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnProcessExit); 
      ReadAsync(client,logbox); 
     } 

    private void sendButton_Click(object sender, EventArgs e) 
      { 
     string text = textBox.Text; 
     byte[] data = Encoding.ASCII.GetBytes(text); 
     NetworkStream stream = client.GetStream(); 
     stream.Write(data,0,text.Length); 
    } 
    static async void ReadAsync(TcpClient client, RichTextBox box) 
    { 
     NetworkStream stream = client.GetStream(); 
     byte[] buffer = new byte[1024]; 
     while (true) 
     { 
      await stream.ReadAsync(buffer, 0, 1024); 
      box.AppendText(Encoding.ASCII.GetString(buffer)); 
     } 
    } 
    private void MainWindow_Load(object sender, EventArgs e) 
    { 

    } 
    void OnProcessExit(object sender, EventArgs e) 
    { 
     client.Close(); 
    } 

sendButton_Clickに問題があり、送信機能が動作しません。 私は、それがストリームを待っていると思う.Close();データを送信するには、このストリームがデータを受信するために必要です。

+0

これは、任意の例外をスローか? – Gusman

+0

上記のコードには明らかな問題はありません。だからあなたの問題が何であれ、それはあなたが共有していないコードにあります。あなたの質問には、問題を確実に再現する良い[mcve]が含まれている必要があります。ネットワーキングコードでは、クライアントとサーバーの両方に[mcve]を含める必要があります。また、「動作しない」_よりも具体的な問題文を提供する必要があります。 –

+0

デバッガは何も表示しません。私のサーバー側: –

答えて

-1

あなたは、これは簡単なチャットのWinFormsの一例である、ソケットを使用する必要があります。

サーバー:

using System; 
using System.Threading; 
using System.Net.Sockets; 
using System.Text; 
using System.Collections; 

namespace ChatServer 
{ 
    class Program 
    { 
     public static Hashtable clientsList = new Hashtable(); 

     static void Main(string[] args) 
     { 
      TcpListener serverSocket = new TcpListener(8888); 
      TcpClient clientSocket = default(TcpClient); 
      int counter = 0; 

      serverSocket.Start(); 
      Console.WriteLine("Chat Server Started ...."); 
      counter = 0; 
      while ((true)) 
      { 
       counter += 1; 
       clientSocket = serverSocket.AcceptTcpClient(); 

       byte[] bytesFrom = new byte[1000025]; 
       string dataFromClient = null; 

       NetworkStream networkStream = clientSocket.GetStream(); 
       networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize); 
       dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom); 
       dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$")); 

       clientsList.Add(dataFromClient, clientSocket); 

       broadcast(dataFromClient + " Joined ", dataFromClient, false); 

       Console.WriteLine(dataFromClient + " Joined chat room "); 
       handleClinet client = new handleClinet(); 
       client.startClient(clientSocket, dataFromClient, clientsList); 
      } 

      clientSocket.Close(); 
      serverSocket.Stop(); 
      Console.WriteLine("exit"); 
      Console.ReadLine(); 
     } 

     public static void broadcast(string msg, string uName, bool flag) 
     { 
      foreach (DictionaryEntry Item in clientsList) 
      { 
       TcpClient broadcastSocket; 
       broadcastSocket = (TcpClient)Item.Value; 
       NetworkStream broadcastStream = broadcastSocket.GetStream(); 
       Byte[] broadcastBytes = null; 

       if (flag == true) 
       { 
        broadcastBytes = Encoding.ASCII.GetBytes(uName + " says : " + msg); 
       } 
       else 
       { 
        broadcastBytes = Encoding.ASCII.GetBytes(msg); 
       } 

       broadcastStream.Write(broadcastBytes, 0, broadcastBytes.Length); 
       broadcastStream.Flush(); 
      } 
     } 
    } 


    public class handleClinet 
    { 
     TcpClient clientSocket; 
     string clNo; 
     Hashtable clientsList; 

     public void startClient(TcpClient inClientSocket, string clineNo, Hashtable cList) 
     { 
      this.clientSocket = inClientSocket; 
      this.clNo = clineNo; 
      this.clientsList = cList; 
      Thread ctThread = new Thread(doChat); 
      ctThread.Start(); 
     } 

     private void doChat() 
     { 
      int requestCount = 0; 
      byte[] bytesFrom = new byte[100025]; 
      string dataFromClient = null; 
      Byte[] sendBytes = null; 
      string serverResponse = null; 
      string rCount = null; 
      requestCount = 0; 

      while ((true)) 
      { 
       try 
       { 
        requestCount = requestCount + 1; 
        NetworkStream networkStream = clientSocket.GetStream(); 
        networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize); 
        dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom); 
        dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$")); 
        Console.WriteLine("From client - " + clNo + " : " + dataFromClient); 
        rCount = Convert.ToString(requestCount); 

        Program.broadcast(dataFromClient, clNo, true); 
       } 
       catch (Exception ex) 
       { 
        Console.WriteLine(ex.ToString()); 
       } 
      }//end while 
     }//end doChat 
    } //end class handleClinet 
} 

はクライアント:

using System; 
using System.Windows.Forms; 
using System.Text; 
using System.Net.Sockets; 
using System.Threading; 
namespace ChatClientForms 
{ 
    public partial class Form1 : Form 
    { 
     System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient(); 
     NetworkStream serverStream = default(NetworkStream); 
     string readData = null; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      byte[] outStream = System.Text.Encoding.ASCII.GetBytes(textBox3.Text + "$"); 
      serverStream.Write(outStream, 0, outStream.Length); 
      serverStream.Flush(); 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      readData = "Conected to Chat Server ..."; 
      msg(); 
      clientSocket.Connect("127.0.0.1", 8888); 
      serverStream = clientSocket.GetStream(); 

      byte[] outStream = System.Text.Encoding.ASCII.GetBytes(textBox1.Text + "$"); 
      serverStream.Write(outStream, 0, outStream.Length); 
      serverStream.Flush(); 

      Thread ctThread = new Thread(getMessage); 
      ctThread.Start(); 
     } 

     private void getMessage() 
     { 
      while (true) 
      { 
       serverStream = clientSocket.GetStream(); 
       int buffSize = 0; 
       byte[] inStream = new byte[100025]; 
       buffSize = clientSocket.ReceiveBufferSize; 
       serverStream.Read(inStream, 0, buffSize); 
       string returndata = System.Text.Encoding.ASCII.GetString(inStream); 
       readData = "" + returndata; 
       msg(); 
      } 
     } 

     private void msg() 
     { 
      if (this.InvokeRequired) 
       this.Invoke(new MethodInvoker(msg)); 
      else 
       textBox2.Text = textBox2.Text + Environment.NewLine + " >> " + readData; 
     } 

    } 
} 
+2

これは質問に対する答えではありません。 OPのコードがなぜ機能しないのかは、決して説明できません。 OPがソケットを使用すべきであるというあなたの主張は愚かであることにも注意してください。彼らは 'TcpClient'を使用しています。これはソケット周りのラッパーであり、ネットワーク操作を行うための完璧な方法です。最後に、有用な説明なしでコードダンプだけである投稿は役に立ちません。 –

関連する問題