Subversion Repositories HomeAutomation

Rev

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

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