2015-09-06 3 views
1

Я использую этот класс пакета (DLL) для моего многопоточного приложения клиент-сервер. НО я не знаю, как отправить строки с моим кодом - Просьба помочь:Network .dll send string

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.IO; 
using System.Net; 
using System.Runtime.Serialization.Formatters.Binary; 
using System.Net.NetworkInformation; 

namespace ServerData 
{ 
    [Serializable] 
    public class Packet 
    { 
    public List<string> Gdata; 
    public int packetInt; 
    public bool packetBool; 
    public string senderID; 
    public PacketType packetType; 

    public Packet(PacketType type, string senderID) 
    { 
     Gdata = new List<string>(); 
     this.senderID = senderID; 
     this.packetType = type; 
    } 

    public Packet(byte[] packetbytes) 
    { 
     BinaryFormatter bf = new BinaryFormatter(); 
     MemoryStream ms = new MemoryStream(packetbytes); 
     Packet p = (Packet)bf.Deserialize(ms); 
     ms.Close(); 
     this.Gdata = p.Gdata; 
     this.packetInt = p.packetInt; 
     this.packetType = p.packetType; 
     this.senderID = p.senderID; 
     this.packetBool = p.packetBool; 

    } 

    public byte[] ToBytes() 
    { 
     BinaryFormatter bf = new BinaryFormatter(); 
     MemoryStream ms = new MemoryStream(); 

     bf.Serialize(ms, this); 
     byte[] bytes = ms.ToArray(); 
     ms.Close(); 
     return bytes; 

    } 

    public static string GetIP4Address() 
    { 
     IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName()); 

     foreach (IPAddress i in ips) 
     { 
      if (i.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) 
      { 
       return i.ToString(); 
      } 
     } 
     return "127.0.0.1"; 
    } 
    public static string GetIP6Address() 
    { 
     string macAddresses = string.Empty; 

     foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces()) 
     { 
      if (nic.OperationalStatus == OperationalStatus.Up) 
      { 
       macAddresses += nic.GetPhysicalAddress().ToString(); 
       break; 
      } 
     } 

     return macAddresses; 
    } 
} 
public enum PacketType 
{ 
    Registration, 
    Command, 
    Download, 
    Inquiry, 
    Reponse, 
    Confirmation 
} 
} 

функция отправки в сервер/клиент:

 public void SendRegistrationPacket() // for example this send an packet from the type registration but in this moment i can "know" whats in the packet by "asking" what type it is... 
    { 
     Packet p = new Packet(PacketType.Registration, id); 
     clientSocket.Send(p.ToBytes()); //clientSocket is the socket where the client is connected^^ 

    } 

менеджер для входящих данных (не чтение только обработка считанных данных):

void DataManager(Packet p) 
    { 
     switch (p.packetType) 
     { 
      case PacketType.Registration: 
       listBox1.Items.Add("Got Registration Packet"); 
       listBox1.Items.Add("Sending Registration..."); 
       break; 
     } 
    } 

Как я могу отправлять строки и «кодировать» их этими пакетами?

ответ

0

Этот класс предоставляет public List<string> Gdata;. Вы можете добавить любое количество строк к этому объекту, и сериализатор позаботится об этом. Так, например, вы могли бы написать

Packet p = new Packet(PacketType.Command, 123); 
p.Gdata.Add("SomeString which I want to execute"); 

clientSocket.Send(p.ToBytes()); 

На приемном конце, вы десериализация Packet объекта и использовать Gdata поле, как обычно.

byte[] received = new byte[1024]; 
int num_received = someSocket.Receive(received); 
Packet decoded = new Packet(received.Take(num_received).ToArray()); 
Console.WriteLine("The first string in the list: " + decoded.Gdata[0]); 
Смежные вопросы