Нужно создать сетевую игру "Шашки" с возможностью подключения болельщиков. Поискал по интернету, "собрал" код для сериализации объекта класса клиентом на сервер. Всё отлично работает, но подключается только один клиент, следующий запуск клиента ничего не дает.. Так как ещё плохо понимаю тему по сокетам и сетевому взаимодействию, решил обратиться за помощью сюда... Пожалуйста, подскажите, в чем проблема :( И если не сложно, как организовать multicast рассылку клиентам. В сериализуемом объекте будет передаваться List<> объекта шашка на клиенты + доп. информация, нужная для организации логики игры.. Прилагается код сервера, который запускается при загрузке формы в фоновом потоке. | Код | private void ServerMainForm_Load(object sender, EventArgs e) { try { socketServer = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); socketServer.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9000)); } catch (Exception ex) { throw new Exception("Ошибка создания сокета!", ex); }
Thread socketThread = new Thread(new ThreadStart(Start)); socketThread.IsBackground = true; socketThread.Start(); MessageBox.Show("Form load!!!"); }
public static byte[] buffer = new byte[1024]; public static ManualResetEvent socketEvent = new ManualResetEvent(true); public static Socket handlerA; public static IPAddress ipAddr; public static IPEndPoint localEnd; public static BinaryFormatter formatter; public static MemoryStream mStream; public static Socket listner; public static Socket handler;
public static void Start() { ipAddr = IPAddress.Parse("127.0.0.1"); localEnd = new IPEndPoint(ipAddr, 9003); Socket sListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); sListener.Bind(localEnd); sListener.Listen(10); AsyncCallback aCallback = new AsyncCallback(AcceptCallback); sListener.BeginAccept(aCallback, sListener); //socketEvent.WaitOne(); }
public static void AcceptCallback(IAsyncResult ar) { listner = (Socket)ar.AsyncState; handler = listner.EndAccept(ar); handlerA = handler; handler.BeginReceive(buffer, 0, buffer.Length, 0, new AsyncCallback(ReceiveCallback), handler); }
public static void ReceiveCallback(IAsyncResult ar) { try { MessageBox.Show("In");
formatter = new BinaryFormatter(); mStream = new MemoryStream();
MessageBox.Show("In 1");
Socket handler = (Socket)ar.AsyncState; int bytesRead = handler.EndReceive(ar);
MessageBox.Show("In 2");
mStream.Write(buffer, 0, bytesRead); mStream.Position = 0;
MessageBox.Show("In 3");
//Десериализуем объект. PlayInfo pi = (PlayInfo)formatter.Deserialize(mStream);
MessageBox.Show("In 4");
MessageBox.Show(pi.Login + "Server"); MessageBox.Show(pi.Play.ToString());
mStream.Close(); } catch (Exception exc) { MessageBox.Show("RECEIVE SERVER SAYS: " + exc.Message); } //byte[] serverBuffer = new byte[1024]; //handlerA.BeginReceive(serverBuffer, 0, serverBuffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), handlerA); }
public static void Send(string str) { byte[] byteData = Encoding.ASCII.GetBytes(str); handlerA.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), handlerA); }
public static void SendCallback(IAsyncResult ar) { Socket handler = (Socket)ar.AsyncState; int bytesSend = handler.EndSend(ar); }
|
Присоединённый файл ( Кол-во скачиваний: 5 )
CheckersExam.rar 171,15 Kb
|