.NET 3.x Clients-Server Socket - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Сижу пишу дипломную работу по роботе с Socket, но проблема в том то я не когда с ними не работал, у меня на данный момент реализовано полною работу со стороны клиента к серверу, то есть передача сообщений и приём их на сервере. Но сейчас у меня возникли кое-какие вопросы: 1) Мне надо реализовать передачу данных от сервера до клиента вот весь мой код:
Листинг программы
  1. using System;
  2. using System.IO;
  3. using System.Net;
  4. using System.Net.Sockets;
  5. namespace MachineEmulatorServer
  6. {
  7. internal enum Commands
  8. {
  9. Command = 0,
  10. DbDataRecord = 1
  11. }
  12. struct ReceiveBuffer
  13. {
  14. private const int bufferSize = 1024;
  15. public byte[] buffer;
  16. public int toReceive;
  17. public readonly MemoryStream bufStream;
  18. public ReceiveBuffer(int toRec)
  19. {
  20. buffer = new byte[bufferSize];
  21. toReceive = toRec;
  22. bufStream = new MemoryStream(toRec);
  23. }
  24. public void Dispose()
  25. {
  26. buffer = null;
  27. toReceive = 0;
  28. Close();
  29. if (bufStream != null)
  30. bufStream.Dispose();
  31. }
  32. private void Close()
  33. {
  34. if (bufStream != null && bufStream.CanWrite)
  35. bufStream.Close();
  36. }
  37. }
  38. class Client
  39. {
  40. private byte[] lenBuffer;
  41. private ReceiveBuffer buffer;
  42. private Socket socket;
  43. public IPEndPoint EndPoint
  44. {
  45. get
  46. {
  47. if (socket != null && socket.Connected)
  48. return (IPEndPoint)socket.RemoteEndPoint;
  49. return new IPEndPoint(IPAddress.None, 0);
  50. }
  51. }
  52. public delegate void DisconectedEventHandler(Client sender);
  53. public delegate void DataReceivedHandler(Client sender, ReceiveBuffer e);
  54. public delegate void DataSendHandler(Client sender, int send);
  55. public event DisconectedEventHandler Discotected;
  56. public event DataReceivedHandler DataReceived;
  57. public event DataSendHandler OnSend;
  58. public Client(Socket s)
  59. {
  60. socket = s;
  61. lenBuffer = new byte[4];
  62. }
  63. public void Send(byte[] data, int index, int length)
  64. {
  65. socket.BeginSend(BitConverter.GetBytes(length), 0, 4, SocketFlags.None, SendCallBack, null);
  66. socket.BeginSend(data, index, length, SocketFlags.None, SendCallBack, null);
  67. }
  68. private void SendCallBack(IAsyncResult ar)
  69. {
  70. try
  71. {
  72. var send = socket.EndSend(ar);
  73. if (OnSend != null)
  74. {
  75. OnSend(this, send);
  76. }
  77. }
  78. catch (Exception ex)
  79. {
  80. Console.WriteLine("Send error\n {0}", ex.Message);
  81. }
  82. }
  83. public void Close()
  84. {
  85. if (socket != null)
  86. {
  87. socket.Disconnect(false);
  88. socket.Close();
  89. }
  90. buffer.Dispose();
  91. socket = null;
  92. lenBuffer = null;
  93. Discotected = null;
  94. DataReceived = null;
  95. }
  96. public void ReceiveAsync()
  97. {
  98. socket.BeginReceive(lenBuffer, 0, lenBuffer.Length, SocketFlags.None, ReceiveCallBack, null);
  99. }
  100. private void ReceiveCallBack(IAsyncResult ar)
  101. {
  102. try
  103. {
  104. var rec = socket.EndReceive(ar);
  105. if (rec == 0)
  106. {
  107. if (Discotected != null)
  108. {
  109. Discotected(this);
  110. return;
  111. }
  112. if (rec != 4)
  113. {
  114. throw new Exception();
  115. }
  116. }
  117. }
  118. catch (SocketException se)
  119. {
  120. switch (se.SocketErrorCode)
  121. {
  122. case SocketError.ConnectionAborted:
  123. case SocketError.ConnectionReset:
  124. if (Discotected != null)
  125. {
  126. Discotected(this);
  127. return;
  128. }
  129. break;
  130. }
  131. }
  132. catch (ObjectDisposedException)
  133. {
  134. return;
  135. }
  136. catch (NullReferenceException)
  137. {
  138. return;
  139. }
  140. catch (Exception ex)
  141. {
  142. Console.Write(ex.Message);
  143. return;
  144. }
  145. buffer = new ReceiveBuffer(BitConverter.ToInt32(lenBuffer, 0));
  146. socket.BeginReceive(buffer.buffer, 0, buffer.buffer.Length, SocketFlags.None, ReceivePacketCallBack, null);
  147. }
  148. void ReceivePacketCallBack(IAsyncResult ar)
  149. {
  150. var rec = socket.EndReceive(ar);
  151. if (rec <= 0)
  152. return;
  153. buffer.bufStream.Write(buffer.buffer, 0, rec);
  154. buffer.toReceive -= rec;
  155. if (buffer.toReceive > 0)
  156. {
  157. Array.Clear(buffer.buffer, 0, buffer.buffer.Length);
  158. socket.BeginReceive(buffer.buffer, 0, buffer.buffer.Length, SocketFlags.None, ReceivePacketCallBack,
  159. null);
  160. return;
  161. }
  162. if (DataReceived != null)
  163. {
  164. buffer.bufStream.Position = 0;
  165. DataReceived(this, buffer);
  166. }
  167. buffer.Dispose();
  168. ReceiveAsync();
  169. }
  170. }
  171. }
Листинг программы
  1. using System;
  2. using System.Net;
  3. using System.Net.Sockets;
  4. namespace MachineEmulatorServer
  5. {
  6. class Listener
  7. {
  8. public delegate void SocketAcceptedHandler(Socket e);
  9. public event SocketAcceptedHandler Accepted;
  10. private Socket listener;
  11. public bool Running { get; private set; }
  12. public void Start(int port)
  13. {
  14. if (Running)
  15. return;
  16. listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  17. listener.Bind(new IPEndPoint(0, port));
  18. listener.Listen(0);
  19. listener.BeginAccept(AcceptedCallBack, null);
  20. Running = true;
  21. }
  22. public void Stop()
  23. {
  24. if (!Running)
  25. return;
  26. listener.Close();
  27. Running = false;
  28. }
  29. private void AcceptedCallBack(IAsyncResult ar)
  30. {
  31. try
  32. {
  33. var s = listener.EndAccept(ar);
  34. if (Accepted != null)
  35. {
  36. Accepted(s);
  37. }
  38. }
  39. catch (Exception e)
  40. {
  41. }
  42. if (!Running)
  43. return;
  44. try
  45. {
  46. listener.BeginAccept(AcceptedCallBack, null);
  47. }
  48. catch (Exception)
  49. {
  50. }
  51. }
  52. }
  53. }
Листинг программы
  1. using System.Collections.Generic;
  2. using System.IO;
  3. using System.Windows.Forms;
  4. namespace MachineEmulatorServer
  5. {
  6. public partial class Form1 : Form
  7. {
  8. private Listener listener;
  9. private readonly List<Client> clients;
  10. public Form1()
  11. {
  12. InitializeComponent();
  13. FormClosing += Form1_FormClosing;
  14. clients = new List<Client>();
  15. }
  16. private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  17. {
  18. while (clients.Count != 0)
  19. {
  20. clients[0].Close();
  21. clients.Remove(clients[0]);
  22. }
  23. if (listener != null && listener.Running)
  24. listener.Stop();
  25. }
  26. private void Form1_Load(object sender, System.EventArgs e)
  27. {
  28. listener = new Listener();
  29. listener.Accepted += listener_Accepted;
  30. listener.Start(5053);
  31. }
  32. private void listener_Accepted(System.Net.Sockets.Socket e)
  33. {
  34. var newClient = new Client(e);
  35. newClient.DataReceived += client_DataReceived;
  36. newClient.Discotected += client_Discotected;
  37. newClient.OnSend += newClient_OnSend;
  38. newClient.ReceiveAsync();
  39. SendText("You connected", newClient);
  40. if (clients == null)
  41. return;
  42. clients.Add(newClient);
  43. Invoke((MethodInvoker) delegate
  44. {
  45. TextLogger.Text += "Connected:" + newClient.EndPoint + "\n";
  46. });
  47. }
  48. private static void SendText(string text, Client client)
  49. {
  50. var bw = new BinaryWriter(new MemoryStream());
  51. bw.Write((int)Commands.Command);
  52. bw.Write(text);
  53. bw.Close();
  54. var data = ((MemoryStream)bw.BaseStream).ToArray();
  55. bw.BaseStream.Dispose();
  56. client.Send(data, 0, data.Length);
  57. }
  58. void newClient_OnSend(Client sender, int send)
  59. {
  60. TextLogger.Text += "Send to: " + sender.EndPoint + "\n";
  61. }
  62. private void client_Discotected(Client sender)
  63. {
  64. for (var i = 0; i < clients.Count; i++)
  65. {
  66. if (!Equals(clients[i].EndPoint, sender.EndPoint))
  67. continue;
  68. Invoke((MethodInvoker) delegate
  69. {
  70. TextLogger.Text += "Disconnected: " + clients[i].EndPoint + "\n";
  71. });
  72. clients[i].Close();
  73. clients.Remove(clients[i]);
  74. break;
  75. }
  76. }
  77. private void client_DataReceived(Client sender, ReceiveBuffer e)
  78. {
  79. var r = new BinaryReader(e.bufStream);
  80. var header = (Commands) r.ReadInt32();
  81. switch (header)
  82. {
  83. case Commands.Command:
  84. {
  85. var s = r.ReadString();
  86. Invoke((MethodInvoker) (() => TextLogger.Text += s + "\n"));
  87. }
  88. break;
  89. case Commands.DbDataRecord:
  90. {
  91. var imageBytesLen = r.ReadInt32();
  92. r.ReadBytes(imageBytesLen);
  93. r.ReadString();
  94. Invoke((MethodInvoker) delegate
  95. {
  96. //pbImage.Image = Image.FromStream(new MemoryStream(iBytes));
  97. });
  98. }
  99. break;
  100. }
  101. }
  102. }
  103. }
Листинг программы
  1. using System;
  2. using System.IO;
  3. using System.Net.Sockets;
  4. namespace MachineEmulatorUsers
  5. {
  6. internal enum Commands
  7. {
  8. Command = 0,
  9. DbDataRecord = 1
  10. }
  11. struct ReceiveBuffer
  12. {
  13. private const int bufferSize = 1024;
  14. public byte[] buffer;
  15. public int toReceive;
  16. public readonly MemoryStream bufStream;
  17. public ReceiveBuffer(int toRec)
  18. {
  19. buffer = new byte[bufferSize];
  20. toReceive = toRec;
  21. bufStream = new MemoryStream(toRec);
  22. }
  23. public void Dispose()
  24. {
  25. buffer = null;
  26. toReceive = 0;
  27. Close();
  28. if (bufStream != null)
  29. bufStream.Dispose();
  30. }
  31. private void Close()
  32. {
  33. if (bufStream != null && bufStream.CanWrite)
  34. bufStream.Close();
  35. }
  36. }
  37. internal class Client
  38. {
  39. private byte[] lenBuffer;
  40. private ReceiveBuffer buffer;
  41. private Socket socket;
  42. public delegate void OnConnectEventHandler(Client sender, bool connected);
  43. public delegate void OnSendEventHandler(Client sender, int send);
  44. public delegate void DataReceivedHandler(Client sender, ReceiveBuffer e);
  45. public delegate void OnDisconnectEventHandler(Client sender);
  46. public event OnConnectEventHandler OnConnect;
  47. public event OnSendEventHandler OnSend;
  48. public event OnDisconnectEventHandler OnDisconnect;
  49. public event DataReceivedHandler DataReceived;
  50. private bool Connected
  51. {
  52. get { return socket != null && socket.Connected; }
  53. }
  54. public Client()
  55. {
  56. socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  57. }
  58. public void Connect(string ipAddress, int port)
  59. {
  60. if (socket == null)
  61. socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  62. socket.BeginConnect(ipAddress, port, ConnectCallBack, null);
  63. }
  64. private void ConnectCallBack(IAsyncResult ar)
  65. {
  66. try
  67. {
  68. socket.EndConnect(ar);
  69. if (OnConnect != null)
  70. {
  71. OnConnect(this, Connected);
  72. }
  73. }
  74. catch (Exception)
  75. {
  76. }
  77. }
  78. public void Send(byte[] data, int index, int length)
  79. {
  80. if (!Connected)
  81. return;
  82. socket.BeginSend(BitConverter.GetBytes(length), 0, 4, SocketFlags.None, SendCallBack, null);
  83. socket.BeginSend(data, index, length, SocketFlags.None, SendCallBack, null);
  84. }
  85. private void SendCallBack(IAsyncResult ar)
  86. {
  87. try
  88. {
  89. var send = socket.EndSend(ar);
  90. if (OnSend != null)
  91. {
  92. OnSend(this, send);
  93. }
  94. }
  95. catch (Exception ex)
  96. {
  97. Console.WriteLine("Send error\n {0}", ex.Message);
  98. }
  99. }
  100. public void Disconnect()
  101. {
  102. try
  103. {
  104. if (!socket.Connected) return;
  105. socket.Close();
  106. socket = null;
  107. if (OnDisconnect != null)
  108. {
  109. OnDisconnect(this);
  110. }
  111. }
  112. catch (Exception)
  113. {
  114. }
  115. }
  116. public void ReceiveAsync()
  117. {
  118. socket.BeginReceive(lenBuffer, 0, lenBuffer.Length, SocketFlags.None, ReceiveCallBack, null);
  119. }
  120. private void ReceiveCallBack(IAsyncResult ar)
  121. {
  122. try
  123. {
  124. var rec = socket.EndReceive(ar);
  125. if (rec == 0)
  126. {
  127. if (rec != 4)
  128. {
  129. throw new Exception();
  130. }
  131. }
  132. }
  133. catch (SocketException se)
  134. {
  135. switch (se.SocketErrorCode)
  136. {
  137. case SocketError.ConnectionAborted:
  138. case SocketError.ConnectionReset:
  139. Disconnect();
  140. break;
  141. }
  142. }
  143. catch (ObjectDisposedException)
  144. {
  145. return;
  146. }
  147. catch (NullReferenceException)
  148. {
  149. return;
  150. }
  151. catch (Exception ex)
  152. {
  153. Console.Write(ex.Message);
  154. return;
  155. }
  156. buffer = new ReceiveBuffer(BitConverter.ToInt32(lenBuffer, 0));
  157. socket.BeginReceive(buffer.buffer, 0, buffer.buffer.Length, SocketFlags.None, ReceivePacketCallBack, null);
  158. }
  159. void ReceivePacketCallBack(IAsyncResult ar)
  160. {
  161. var rec = socket.EndReceive(ar);
  162. if (rec <= 0)
  163. return;
  164. buffer.bufStream.Write(buffer.buffer, 0, rec);
  165. buffer.toReceive -= rec;
  166. if (buffer.toReceive > 0)
  167. {
  168. Array.Clear(buffer.buffer, 0, buffer.buffer.Length);
  169. socket.BeginReceive(buffer.buffer, 0, buffer.buffer.Length, SocketFlags.None, ReceivePacketCallBack,
  170. null);
  171. return;
  172. }
  173. if (DataReceived != null)
  174. {
  175. buffer.bufStream.Position = 0;
  176. DataReceived(this, buffer);
  177. }
  178. buffer.Dispose();
  179. ReceiveAsync();
  180. }
  181. }
  182. }
Листинг программы
  1. using System;
  2. using System.ComponentModel;
  3. using System.Data.Common;
  4. using System.Drawing;
  5. using System.IO;
  6. using System.Threading;
  7. using System.Windows.Forms;
  8. namespace MachineEmulatorUsers
  9. {
  10. public partial class Form1 : Form
  11. {
  12. private readonly Client client;
  13. private bool connect;
  14. private DbDataRecord dataRecords;
  15. private BackgroundWorker background;
  16. private string errorMessage;
  17. public Form1()
  18. {
  19. InitializeComponent();
  20. client = new Client();
  21. client.OnConnect += client_onConnect;
  22. client.OnDisconnect += client_onDisconnect;
  23. client.OnSend += client_onSend;
  24. FormClosing += Form1_FormClosing;
  25. }
  26. private void Form1_Load(object sender, EventArgs e)
  27. {
  28. client.Connect("127.0.0.1", 5053);
  29. Thread.Sleep(1500);
  30. background = new BackgroundWorker
  31. {
  32. WorkerReportsProgress = true,
  33. WorkerSupportsCancellation = true
  34. };
  35. background.DoWork += bw_DoWork;
  36. background.ProgressChanged += bw_ProgressChanged;
  37. background.RunWorkerCompleted += bw_RunWorkerCompleted;
  38. if (connect)
  39. {
  40. LoadGroupBox.Visible = true;
  41. client.DataReceived+=Server_DataReceived;
  42. client.ReceiveAsync();
  43. return;
  44. }
  45. ErrorLabel.Visible = true;
  46. errorMessage = "Кліент не знайшов з'єднання з Сервером...\nКлієн буде завершено через ";
  47. background.RunWorkerAsync();
  48. }
  49. void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  50. {
  51. Close();
  52. }
  53. void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
  54. {
  55. ErrorLabel.Text = errorMessage + e.ProgressPercentage;
  56. }
  57.  
  58. private static void bw_DoWork(object sender, DoWorkEventArgs e)
  59. {
  60. var worker = sender as BackgroundWorker;
  61. for (var i = 10; i > 0; i--)
  62. {
  63. if (worker != null && worker.CancellationPending)
  64. {
  65. e.Cancel = true;
  66. break;
  67. }
  68. Thread.Sleep(500);
  69. if (worker != null)
  70. worker.ReportProgress(i);
  71. }
  72. }
  73. void Form1_FormClosing(object sender, FormClosingEventArgs e)
  74. {
  75. if (client != null)
  76. client.Disconnect();
  77. }
  78. void client_onSend(Client sender, int send)
  79. {
  80. Invoke((MethodInvoker) delegate
  81. {
  82. Text = string.Format("Data sent: {0}", send);
  83. });
  84. }
  85. private void client_onConnect(Client sender, bool connected)
  86. {
  87. connect = connected;
  88. }
  89. private void client_onDisconnect(Client sender)
  90. {
  91. connect = false;
  92. }
  93. private void InsertText(object sender, EventArgs e)
  94. {
  95. var s = sender as PictureBox;
  96. if (s != null)
  97. textBox1.Text += ((PictureBox) sender).Tag;
  98. }
  99. private void StartButtonClick(object sender, EventArgs e)
  100. {
  101. LoadContent();
  102. LoadGroupBox.Visible = false;
  103. KeyBoard.Visible = true;
  104. button1.Visible = true;
  105. textBox1.Visible = true;
  106. }
  107. private void button1_Click(object sender, EventArgs e)
  108. {
  109. SendText(textBox1.Text);
  110. }
  111. void SendText(string text)
  112. {
  113. var bw = new BinaryWriter(new MemoryStream());
  114. bw.Write((int)Commands.Command);
  115. bw.Write(text);
  116. bw.Close();
  117. var data = ((MemoryStream) bw.BaseStream).ToArray();
  118. bw.BaseStream.Dispose();
  119. client.Send(data, 0, data.Length);
  120. }
  121. private void Server_DataReceived(Client sender, ReceiveBuffer e)
  122. {
  123. var r = new BinaryReader(e.bufStream);
  124. var header = (Commands) r.ReadInt32();
  125. switch (header)
  126. {
  127. case Commands.Command:
  128. {
  129. var s = r.ReadString();
  130. Invoke((MethodInvoker) (() => ExecuteCommand(s)));
  131. }
  132. break;
  133. case Commands.DbDataRecord:
  134. {
  135. var s = r.ReadString();
  136. Invoke((MethodInvoker)(() => MessageBox.Show(s)));
  137. }
  138. break;
  139. }
  140. }
  141. private void ExecuteCommand(String com)
  142. {
  143. if (com != "Disconnected")
  144. return;
  145. errorMessage = "Клієнт був відключений сервером...\nКлієн буде завершено через ";
  146. background.RunWorkerAsync();
  147. }
  148. }
  149. }
Вроде-бы все отлично работает, но когда я начинаю писать DataReceived на стороне клиента и Send на стороне сервера, то в клиенте вылетает ошибка со стороны клиента в Client.cs:
Листинг программы
  1. public void ReceiveAsync()
  2. {
  3. socket.BeginReceive(lenBuffer, 0, lenBuffer.Length, SocketFlags.None, ReceiveCallBack, null);
  4. //Exception: NullReferenceException - в экземпляре объекта не указана ссылка на объект.
  5. }
2 ) Как по сете можно передать записи из базы данных, что-то типа DbDataRecord. Заранее спасибо.
Тема все еще актуальна.

Решение задачи: «.NET 3.x Clients-Server Socket»

textual
Листинг программы
  1. private void BackgroundReconnectDoWork(object sender, DoWorkEventArgs e)
  2.         {
  3.             var worker = sender as BackgroundWorker;
  4.             var flag = false;
  5.             while (flag != true)
  6.             {
  7.                 Invoke((MethodInvoker) (delegate
  8.                     {
  9.                         client = new Client();
  10.                         client.Connect(adress, port);
  11.                         Thread.Sleep(375);
  12.                         flag = connect;
  13.                     }));
  14.                 for (var i = 9; i >= 0; i--)
  15.                 {
  16.                     if (worker != null && worker.CancellationPending)
  17.                     {
  18.                         e.Cancel = true;
  19.                         break;
  20.                     }
  21.                     Thread.Sleep(500);
  22.                     if (worker != null)
  23.                         worker.ReportProgress(i);
  24.                 }
  25.             }
  26.         }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.667 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы