Subversion Repositories HomeAutomation

Rev

Rev 452 | Blame | Last modification | View Log | SVN | RSS feed

  1. using System;
  2. using System.Net;
  3. //using System.Net.;
  4. using System.Net.Sockets;
  5. using System.Text;
  6. using System.Threading;
  7. using System.Collections;
  8. using System.IO;
  9.  
  10. public class TcpServer {
  11.     private TcpListener listener;
  12.     private bool running;
  13.     private int port;
  14.     private ArrayList clients;
  15.     const byte DEBUG_LEVEL = 2; //0, 1, 2, 3
  16.    
  17.     private Queue tcpPackets = Queue.Synchronized(new Queue());
  18.    
  19.     public TcpServer(int port) {
  20.         running = true;
  21.         listener = new TcpListener(IPAddress.Parse("127.0.0.1"),port);
  22.         //listener = new TcpListener(port);
  23.         listener.Start();
  24.         this.port = port;
  25.         clients = new ArrayList();
  26.     }
  27.  
  28.     public bool getData(out string data) {
  29.         data = null;
  30.         if (tcpPackets.Count>0) {
  31.             data = (string)tcpPackets.Dequeue();
  32.             return true;
  33.         }
  34.         return false;
  35.     }
  36.    
  37.     public void thread() {
  38.         if (DEBUG_LEVEL>1) { Console.WriteLine("Waiting for clients on port {0}", port); }
  39.         while (running) {
  40.             Thread.Sleep(1);
  41.             foreach (Connection client in clients) {
  42.                 //... hämta data från client...
  43.                 //om ny data så skicka till alla i clients utom client
  44.                 string tcpdata;
  45.                 bool hasData = client.getData(out tcpdata);
  46.                 if (hasData) {
  47.                    
  48.                     //lägg data på kö så demonen kan hämta för vidare process
  49.                     tcpPackets.Enqueue(tcpdata);
  50.                    
  51.                     //skicka data till övriga klienter, senare ska datat parsas innan så man bara skickar ut can-paket
  52.                     foreach (Connection sendclient in clients) {
  53.                         if (sendclient != client) {
  54.                             sendclient.sendDataDummy(tcpdata);
  55.                         }
  56.                     }
  57.                 }
  58.             }
  59.            
  60.             foreach (Connection client in clients) {
  61.                 if (!client.isConnected()) {
  62.                     clients.Remove(client);
  63.                     if (DEBUG_LEVEL>1) { Console.WriteLine("Client dropped"); }
  64.                     break;
  65.                 }
  66.             }
  67.            
  68.             if (running && listener.Pending()) {
  69.                 TcpClient handler = listener.AcceptTcpClient();
  70.                 Connection newconn = new Connection(handler);
  71.                 clients.Add(newconn);
  72.                 Thread t = new Thread(newconn.thread);
  73.                 t.Start();
  74.                 EndPoint ipend = handler.Client.RemoteEndPoint;
  75.                 string sipend = ipend.ToString();
  76.                 //string sipend = IPAddress.Parse(handler.Client.RemoteEndPoint.Address.ToString());
  77.                 if (DEBUG_LEVEL>1) { Console.WriteLine("Client {0} connected on port {1}",sipend ,port); }
  78.             }
  79.         }
  80.     }
  81.    
  82.     public void stop() {
  83.         running = false;
  84.         foreach (Connection client in clients) {
  85.             client.stop();
  86.         }
  87.     }
  88.    
  89.     public void sendCanPacket(CanPacket cp) {
  90.         foreach (Connection client in clients) {
  91.             client.sendData(cp);
  92.         }
  93.     }
  94.  
  95. }
  96.  
  97. class Connection {
  98.     private TcpClient client;
  99.     private NetworkStream ns;
  100.     private bool connected;
  101.    
  102.     private Queue tcpPackets = Queue.Synchronized(new Queue());
  103.    
  104.     public Connection(TcpClient client) {
  105.         this.client = client;
  106.         ns = client.GetStream();
  107.         //this.id = id;
  108.     }
  109.    
  110.     public bool getData(out string data) {
  111.         data = null;
  112.         if (tcpPackets.Count>0) {
  113.             data = (string)tcpPackets.Dequeue();
  114.             return true;
  115.         }
  116.         return false;
  117.     }
  118.    
  119.     public void thread() {
  120.         //läs och lagra så att en funktion kan läsa från mig
  121.         byte[] data = new byte[1024];
  122.         int recv;
  123.         connected = true;
  124.         while (connected) {
  125.             Thread.Sleep(1);
  126.             if (ns.DataAvailable) {
  127.                 recv = ns.Read(data, 0, data.Length);
  128.                 if (recv == 0)
  129.                     break;
  130.                
  131.                 string tcpdata = Encoding.ASCII.GetString(data, 0, recv);
  132.                 //string [] split = null;
  133.                 //split = tcpdata.Split(" ");
  134.  
  135.                 //if (split.Length ) {
  136.                     tcpPackets.Enqueue(tcpdata);
  137.                 //}
  138.                 //Console.WriteLine(System.Text.Encoding.ASCII.GetString(data));
  139.             }
  140.         }
  141.         connected = false;
  142.         ns.Close();
  143.         client.Close();
  144.     }
  145.    
  146.     public bool isConnected() {
  147.         return connected;
  148.     }
  149.    
  150.     public void stop() {
  151.         connected = false;
  152.     }
  153.    
  154.     public void sendData(CanPacket cp) {
  155.         if (connected) {
  156.             try {
  157.                 byte[] data = new byte[1024];
  158.                
  159.                 data = Encoding.ASCII.GetBytes(cp.toRawString()+"\n");
  160.                 ns.Write(data, 0, data.Length);
  161.             }
  162.             catch (Exception) {
  163.                 connected = false;
  164.             }
  165.         }
  166.     }
  167.    
  168.     public void sendDataDummy(string senddata) {
  169.         if (connected) {
  170.             try {
  171.                 byte[] data = new byte[1024];
  172.                
  173.                 data = Encoding.ASCII.GetBytes(senddata+"\n");
  174.                 ns.Write(data, 0, data.Length);
  175.             }
  176.             catch (Exception) {
  177.                 connected = false;
  178.             }
  179.         }
  180.     }
  181.        
  182. }