Subversion Repositories HomeAutomation

Rev

Rev 460 | 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.                 if (DEBUG_LEVEL>1) { Console.WriteLine("Client {0} connected on port {1}",ipend.ToString() ,port); }
  76.             }
  77.         }
  78.     }
  79.    
  80.     public void stop() {
  81.         running = false;
  82.         foreach (Connection client in clients) {
  83.             client.stop();
  84.         }
  85.     }
  86.    
  87.     public void sendCanPacket(CanPacket cp) {
  88.         foreach (Connection client in clients) {
  89.             client.sendData(cp);
  90.         }
  91.     }
  92.  
  93. }
  94.  
  95. class Connection {
  96.     private TcpClient client;
  97.     private NetworkStream ns;
  98.     private bool connected;
  99.    
  100.     private Queue tcpPackets = Queue.Synchronized(new Queue());
  101.    
  102.     public Connection(TcpClient client) {
  103.         this.client = client;
  104.         ns = client.GetStream();
  105.         //this.id = id;
  106.     }
  107.    
  108.     public bool getData(out string data) {
  109.         data = null;
  110.         if (tcpPackets.Count>0) {
  111.             data = (string)tcpPackets.Dequeue();
  112.             return true;
  113.         }
  114.         return false;
  115.     }
  116.    
  117.     public void thread() {
  118.         //läs och lagra så att en funktion kan läsa från mig
  119.         byte[] data = new byte[1024];
  120.         int recv;
  121.         connected = true;
  122.         while (connected) {
  123.             Thread.Sleep(1);
  124.             if (ns.DataAvailable) {
  125.                 recv = ns.Read(data, 0, data.Length);
  126.                 if (recv == 0)
  127.                     break;
  128.                
  129.                 string tcpdata = Encoding.ASCII.GetString(data, 0, recv);
  130.                 //string [] split = null;
  131.                 //split = tcpdata.Split(" ");
  132.  
  133.                 //if (split.Length ) {
  134.                     tcpPackets.Enqueue(tcpdata);
  135.                 //}
  136.                 //Console.WriteLine(System.Text.Encoding.ASCII.GetString(data));
  137.             }
  138.         }
  139.         connected = false;
  140.         ns.Close();
  141.         client.Close();
  142.     }
  143.    
  144.     public bool isConnected() {
  145.         return connected;
  146.     }
  147.    
  148.     public void stop() {
  149.         connected = false;
  150.     }
  151.    
  152.     public void sendData(CanPacket cp) {
  153.         if (connected) {
  154.             try {
  155.                 byte[] data = new byte[1024];
  156.                
  157.                 data = Encoding.ASCII.GetBytes(cp.toRawString()+"\n");
  158.                 ns.Write(data, 0, data.Length);
  159.             }
  160.             catch (Exception) {
  161.                 connected = false;
  162.             }
  163.         }
  164.     }
  165.    
  166.     public void sendDataDummy(string senddata) {
  167.         if (connected) {
  168.             try {
  169.                 byte[] data = new byte[1024];
  170.                
  171.                 data = Encoding.ASCII.GetBytes(senddata+"\n");
  172.                 ns.Write(data, 0, data.Length);
  173.             }
  174.             catch (Exception) {
  175.                 connected = false;
  176.             }
  177.         }
  178.     }
  179.        
  180. }