Subversion Repositories HomeAutomation

Rev

Rev 452 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed

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