2017-10-03 6 views
0

J'essaie de créer un système de messagerie instantanée bidirectionnel, l'un qui envoie un message et l'autre partie l'obtient et renvoie un message et l'autre partie peut également répondre. J'ai trouvé un code que j'ai pu utiliser pour faire le mien et ça marche bien mais c'est seulement un système de message unidirectionnel donc je voulais quelque chose que le client puisse envoyer un message au serveur et au serveur au client.Système de messagerie bidirectionnel en C# utilisant des sockets

Mon code ressemble à ceci, quoique c'est un sens unique

serveur

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Net.Sockets; 
using System.Threading; 
using System.IO; 

namespace Sever 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      TcpListener serverSocket = new TcpListener(4523); 
      serverSocket.Start(); 
      Console.WriteLine("Started!"); 
      while (true) 
      { 
       TcpClient clientSocket = serverSocket.AcceptTcpClient(); 
       handleClient clientx = new handleClient(); 
       clientx.startClient(clientSocket); 
      } 
     } 
    } 

    public class handleClient 
    { 
     TcpClient clientSocket; 
     public void startClient(TcpClient inClientSocket) 
     { 
      this.clientSocket = inClientSocket; 
      Thread ctThread = new Thread(Chat); 
      Thread xthread = new Thread(msg); 
      ctThread.Start(); 
     } 

     private void Chat() 
     { 
      byte[] buffer = new byte[100]; 
      while (true) 
      { 
       NetworkStream ns = clientSocket.GetStream(); 
       BinaryReader reader = new BinaryReader(clientSocket.GetStream()); 
       Console.WriteLine(reader.ReadString()); 
      } 
     } 

     private void msg() 
     { 
      byte[] buf2 = new byte[100]; 
      while (true) 
      { 
       TcpClient client = new TcpClient("localhost", 4523); 
       NetworkStream ns = client.GetStream(); 
       string str = Console.ReadLine(); 
       BinaryWriter bw = new BinaryWriter(client.GetStream()); 
       bw.Write(str); 
      } 
     } 
    } 
} 

Maintenant, c'est le client.

class Program 
{ 
    static void Main(string[] args) 
    { 
     while (true) 
     { 
      TcpClient client = new TcpClient("localhost",4523); 
      NetworkStream ns = client.GetStream(); 
      byte[] buffer = new byte[100]; 
      string str = Console.ReadLine(); 
      BinaryWriter bw = new BinaryWriter(client.GetStream()); 
      bw.Write(str); 
     } 
    } 
} 

Que suis-je vraiment manquant, le client reste le même?

+1

Vous avez besoin de deux tâches/tâches dans vos programmes: Sur qui reçoit en permanence des messages de discussion, et l'autre qui demande l'entrée de l'utilisateur et envoie le message de discussion. Un thread émetteur et récepteur. Regardez dans 'System.Threading.Tasks' –

+0

Vous pouvez simplement recevoir des messages sur l'autre thread lors de l'envoi de messages à la demande. Et n'oubliez pas de 'Close()' et 'Dispose()' vos flux après avoir fini de les utiliser. –

+0

@ m.rogalski pensait utiliser le même scripteur binaire dans le ** serveur **, fonctionne de cette façon? – Thomas

Répondre

0

Ok je me suis finalement résolu il, son maintenant une conversation 2 voies, fait avec StreamWriter et le lecteur en même temps .. fonctionne comme un charme

serveur

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Net.Sockets; 
using System.Threading; 
using System.IO; 

namespace Sever 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      TcpListener serverSocket = new TcpListener(4523); 
      serverSocket.Start(); 
      Console.WriteLine("Started!"); 
      while (true) 
      { 
       TcpClient clientSocket = serverSocket.AcceptTcpClient(); 
       handleClient clientx = new handleClient(); 
       clientx.startClient(clientSocket); 
      } 
     } 
    } 

    public class handleClient 
    { 
     TcpClient clientSocket; 
     public void startClient(TcpClient inClientSocket) 
     { 
      this.clientSocket = inClientSocket; 
      Thread ctThread = new Thread(Chat); 
      ctThread.Start(); 
     } 

     private void Chat() 
     { 
      byte[] buffer = new byte[100]; 
      while (true) 
      { 
       NetworkStream ns = clientSocket.GetStream(); 
       BinaryReader reader = new BinaryReader(clientSocket.GetStream()); 
       Console.WriteLine(reader.ReadString()); 

       BinaryWriter bw = new BinaryWriter(clientSocket.GetStream()); 
       string str = Console.ReadLine(); 
       bw.Write(str); 
      } 
     } 
    } 
} 

client

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Net.Sockets; 
using System.IO; 

namespace Client 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      while (true) 
      { 
       TcpClient client = new TcpClient("localhost",4523); 
       NetworkStream ns = client.GetStream(); 
       byte[] buffer = new byte[100]; 
       string str = Console.ReadLine(); 
       BinaryWriter bw = new BinaryWriter(client.GetStream()); 
       bw.Write(str); 

       BinaryReader br = new BinaryReader(client.GetStream()); 
       Console.WriteLine(br.ReadString()); 
      } 
     } 
    } 
}