Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Ниже приведены сегменты кода. Сегменты разделены комментариями.
- //server цикл обработки клиента
- private void worker(object data)
- {
- string lastMessage = "";
- if (data != null)
- {
- var cvars = (connectionVars) data;
- NetworkStream local_ns = cvars.user.TcpClient.GetStream();
- systemMessages.Add("starting worker for " + cvars.user.TcpClient.Client.RemoteEndPoint + ", id = " +
- cvars.user.id);
- systemMessages.Add("Call login for " + cvars.user.id);
- if (login(cvars.user, local_ns)) //if success login
- {
- cvars.controls.currentOwner = users[cvars.user.user].login;
- systemMessages.Add("User logged in " + users[cvars.user.user].login);
- var loginData = new loginSC(cvars.user.access, cvars.user.id);
- cvars.user.message = string.Empty;
- Functions.SendData(local_ns, loginData);
- char oldCmd = 'C';
- #region цикл обработки
- while (cvars.user.avalible() && CarsServer_enabled && !users[cvars.user.user].banned)
- {
- //reserve commands, send commands to commands list.
- //like this:
- try
- {
- var s = (char) 0;
- var datacs = Functions.ReserveData<dataCS>(local_ns);
- s = datacs.cmd;
- if (cvars.user.id == datacs.id)
- {
- if (oldCmd != s)
- {
- oldCmd = s;
- turn.Add(s);
- //systemMessages.Add("Reserved " + s + " from " + cvars.user.id);
- }
- var datasc = new dataSC(true, "ok");
- if (users[cvars.user.user].message != string.Empty)
- {
- lastMessage = users[cvars.user.user].message;
- datasc = new dataSC(true, users[cvars.user.user].message);
- users[cvars.user.user].message = string.Empty;
- }
- Functions.SendData(local_ns, datasc);
- }
- else
- {
- var datasc = new dataSC(false,
- "Personal id corrupt. (Got " + datacs.id + "), user " +
- users[cvars.user.user].login);
- Functions.SendData(local_ns, datasc);
- break;
- }
- }
- catch (Exception ex)
- {
- systemMessages.Add("Видимо, пользователь " + users[cvars.user.user].login + " отключился: " +
- ex.Message);
- cvars.controls.currentOwner = "nobody";
- local_ns.Close();
- cvars.controls.free = true;
- cvars.user.TcpClient.Close();
- users[cvars.user.user].loggedIn = false;
- }
- }
- #endregion
- if (users[cvars.user.user].banned)
- {
- var datacs = Functions.ReserveData<dataCS>(local_ns); //заглушка для бана
- systemMessages.Add("Соединение будет закрыто по причине бана пользователя " +
- users[cvars.user.user].login + ", причина: " + lastMessage);
- var datasc = new dataSC(false, users[cvars.user.user].message);
- Functions.SendData(local_ns, datasc);
- }
- cvars.controls.currentOwner = "noobody";
- local_ns.Close();
- cvars.controls.free = true;
- cvars.user.TcpClient.Close();
- users[cvars.user.user].loggedIn = false;
- return;
- }
- else
- {
- var loginData = new loginSC(false, 0);
- //byte[] loginDataB = Functions.ObjectToByteArray(loginData);
- //local_ns.Write(loginDataB, 0, loginDataB.Length);
- Functions.SendData(local_ns, loginData);
- systemMessages.Add("Login failed for " + cvars.user.id);
- var message = new dataSC(false,
- "You are not allowed to play. May be wrong login/password or u banned.");
- Functions.SendData(local_ns, message);
- //byte[] messageB = Functions.ObjectToByteArray(message);
- //local_ns.Write(messageB, 0, messageB.Length);
- }
- local_ns.Close();
- cvars.controls.free = true;
- }
- }
- //server
- где
- //классы
- internal class connectionVars //переменные подключения для обработки клиента
- {
- public controller controls;
- public NetworkStream stream;
- public client user;
- public connectionVars(controller c, client u, NetworkStream s)
- {
- controls = c;
- user = u;
- stream = s;
- }
- }
- //"пакеты"
- [Serializable]
- public class dataCS //от клиента к серверу
- {
- public char cmd;
- public int id;
- public dataCS(char c, int i)
- {
- cmd = c;
- id = i;
- }
- }
- [Serializable]
- public class dataSC //от сервера к клиенту
- {
- public bool access;
- public string message;
- public dataSC(bool a, string m)
- {
- message = m;
- access = a;
- }
- }
- //классы
- //функции
- public class functions
- {
- public long getSizeOf(object element)
- {
- long size = 0;
- object obj = element;
- using (Stream stream = new MemoryStream())
- {
- var formatter = new BinaryFormatter();
- formatter.Serialize(stream, obj);
- size = stream.Length;
- }
- return size;
- }
- public byte[] ObjectToByteArray(Object obj)
- {
- if (obj == null)
- return null;
- var bf = new BinaryFormatter();
- var ms = new MemoryStream();
- bf.Serialize(ms, obj);
- return ms.ToArray();
- }
- public T ByteArrayToObject<T>(byte[] arrBytes)
- {
- var memStream = new MemoryStream();
- var binForm = new BinaryFormatter();
- memStream.Write(arrBytes, 0, arrBytes.Length);
- memStream.Seek(0, SeekOrigin.Begin);
- var obj = (T) binForm.Deserialize(memStream);
- return obj;
- }
- /// <summary>
- /// Прием данных с потока
- /// </summary>
- /// <typeparam name="T">Тип получаемых данных</typeparam>
- /// <param name="stream">Поток для чтения</param>
- /// <returns>Возвращает типа данных, заданный пользователем</returns>
- public T ReserveData<T>(NetworkStream stream)
- {
- try
- {
- T obj = default(T);
- long size = 0;
- var buffer = new byte[getSizeOf(size)];
- stream.Read(buffer, 0, buffer.Length);
- size = ByteArrayToObject<long>(buffer);
- var buffer2 = new byte[size];
- stream.Read(buffer2, 0, buffer2.Length);
- obj = ByteArrayToObject<T>(buffer2);
- return obj;
- }
- catch (Exception e)
- {
- //MessageBox.Show("Failed to reserve data:" + e.Message);
- }
- return default(T);
- }
- /// <summary>
- /// Отправка данных в поток
- /// </summary>
- /// <param name="stream">Поток для отправки</param>
- /// <param name="o">данные для отправки</param>
- /// <returns>Истина если все ок.</returns>
- public bool SendData(NetworkStream stream, object o)
- {
- try
- {
- byte[] buffer = ObjectToByteArray(o);
- byte[] sizeBytes = ObjectToByteArray((long) buffer.Length);
- stream.Write(sizeBytes, 0, sizeBytes.Length);
- stream.Write(buffer, 0, buffer.Length);
- return true;
- }
- catch (Exception e)
- {
- //MessageBox.Show("Failed to send data:" + e.Message);
- }
- return false;
- }
- }
- //функции
- //клиент
- private void timer1_Tick(object sender, EventArgs e)
- {
- char cmd = processKeys();
- var datacs = new dataCS(cmd, ClientId);
- Functions.SendData(ns, datacs);
- Application.DoEvents();
- var datasc = Functions.ReserveData<dataSC>(ns);
- if (datasc != null && !datasc.access)
- {
- timer1.Enabled = false;
- if (datasc.message != null) WriteLog("Access denied with message: " + datasc.message);
- if (ns != null) ns.Close();
- if (client != null) client.Close();
- }
- if (datasc != null && datasc.message != "ok")
- WriteLog("Server message: " + datasc.message);
- }
- //клиент
- //Функции и классы содержатся в подключаемой к клиенту и серверу либе
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement