source: 2015/koodauskerho/sieerinn/TasohyppelyNettipeli/TasohyppelyNettipeli/TasohyppelyNettipeli/NetworkConnection.cs @ 7142

Revision 7142, 4.6 KB checked in by sieerinn, 3 years ago (diff)

Serialisoinnin assembly nimiriippuvuus korjattu NetworkConnectionissa?. Bin ja obj kansiot lisätty ignore listalle.

Line 
1using System;
2using System.IO;
3using System.Linq;
4using System.Net.Sockets;
5using System.Reflection;
6using System.Runtime.Serialization;
7using System.Threading;
8using System.Runtime.Serialization.Formatters.Binary;
9
10
11public class NetworkConnection
12{
13    sealed class AssemblyBinder : SerializationBinder
14    {
15        public override Type BindToType(string assemblyName, string typeName)
16        {
17            return Type.GetType(String.Format("{0}, {1}", typeName, Assembly.GetExecutingAssembly().FullName));
18        }
19    }
20
21    private const int BLOCK_SIZE = 2048;
22
23    private readonly byte[] guidBytes;
24    private readonly TcpClient client;
25    private readonly CancellationTokenSource cancelSource;
26    private NetworkStream stream;
27    private Thread receiveThread;
28    private string gameName;
29
30    public delegate void MessageReceived(Guid id, string message);
31    public delegate void ConnectionChanged(Guid id);
32
33    public event MessageReceived OnMessageReceive;
34    public event ConnectionChanged OnConnect;
35    public event ConnectionChanged OnDisconnect;
36
37    public bool Connected { get; private set; }
38
39    public enum MessageType
40    {
41        Connected = 0, Disconnected, Message
42    }
43
44    public NetworkConnection(string gameName)
45    {
46        Connected = false;
47        this.gameName = gameName;
48        var guid = Guid.NewGuid();
49        guidBytes = guid.ToByteArray();
50        cancelSource = new CancellationTokenSource();
51        client = new TcpClient();
52    }
53
54    public void Connect(string ip, int port)
55    {
56        client.Connect(ip, port); // TODO: try
57        stream = client.GetStream();
58        receiveThread = new Thread(() => ReceiveThread(cancelSource.Token));
59        receiveThread.Start();
60        Connected = true;
61        Send(MessageType.Connected);
62    }
63
64    public void Close()
65    {
66        if (!Connected) return;
67        Send(MessageType.Disconnected);
68        cancelSource.Cancel();
69        receiveThread.Join();
70        stream.Close();
71        client.Client.Close();
72        client.Close();
73        Connected = false;
74    }
75
76    private void Send(MessageType type, string message="")
77    {
78        var mstream = new MemoryStream();
79        var writer = new BinaryWriter(mstream);
80
81        writer.Write((byte)type);
82        writer.Write(guidBytes, 0, guidBytes.Length);
83        writer.Write(gameName);
84        if (message.Length > 0)
85            writer.Write(message);
86
87        var sendBytes = mstream.ToArray();
88        stream.Write(sendBytes, 0, sendBytes.Length);
89        stream.Flush();
90    }
91
92    public void SendMessage(string message)
93    {
94        Send(MessageType.Message, message);
95    }
96
97    public T DeserializeFromString<T>(string settings) where T : class
98    {
99        var bytes = Convert.FromBase64String(settings);
100        using (var mstream = new MemoryStream(bytes))
101        {
102            var formatter = new BinaryFormatter();
103            formatter.Binder = new AssemblyBinder();
104            mstream.Seek(0, SeekOrigin.Begin);
105            return formatter.Deserialize(mstream) as T;
106        }
107    }
108
109    public void SendObject(object serializableObject)
110    {
111        using (var mstream = new MemoryStream())
112        {
113            var formatter = new BinaryFormatter();
114            formatter.Serialize(mstream, serializableObject);
115            mstream.Flush();
116            mstream.Position = 0;
117            SendMessage(Convert.ToBase64String(mstream.ToArray()));
118        }
119    }
120
121    private void ReceiveThread(CancellationToken cancelToken)
122    {
123        while (!cancelToken.IsCancellationRequested)
124        {
125            if (client.Available == 0) continue;
126
127            var receivedBytes = new byte[BLOCK_SIZE];
128            stream.Read(receivedBytes, 0, BLOCK_SIZE);
129            var mstream = new MemoryStream(receivedBytes);
130            var reader = new BinaryReader(mstream);
131           
132            var messageType = (MessageType)reader.ReadByte();
133            var senderGuid = new Guid(reader.ReadBytes(guidBytes.Length));
134            var game = reader.ReadString();
135
136            if (messageType == MessageType.Message && OnMessageReceive != null)
137            {
138                var message = reader.ReadString();
139                OnMessageReceive(senderGuid, message);
140            }
141            else if (messageType == MessageType.Connected && OnConnect != null)
142            {
143                OnConnect(senderGuid);
144            }
145            else if (messageType == MessageType.Disconnected && OnDisconnect != null)
146            {
147                OnDisconnect(senderGuid);
148            }
149        }
150    }
151}
Note: See TracBrowser for help on using the repository browser.