سؤال

وطيب، مشكلة بسيطة ونأمل. لقد بدأت لجعل الخادم بسيط لعبة MORPG بسيط صنع ايم، العميل متصلا، وثم قطع الاتصال، بسيط، خادم يمسك عميل جديد، ولكن لا يصاب عندما يفصل، ما الخطأ؟

وايم أمل شيئا الواضحة بغباء.

وهنا كود خدمة بلدي:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.IO;
using System.Threading;

namespace ChaWilPeiBle
{
    public partial class MainForm : Form
    {
        public bool ServerON = false;
        public TcpListener ServerL;
        public int ServerLoad = 2;
        public string ServerINFtxt = "";
        public ASCIIEncoding AE = new ASCIIEncoding();

        public MainForm()
        {
            InitializeComponent();
        }

        private void LBL_SS_Click(object sender, EventArgs e)
        {

        }

        private void MainForm_Load(object sender, EventArgs e)
        {
            LBL_SS.ForeColor = Color.Red;
        }

        public void AddH(string S)
        {
            ServerINFtxt += S;
        }

        public void Server()
        {
            try
            {
                ServerL = new TcpListener(47);
                ServerL.Start();
                AddH("\nServer Started On Port 47");
            }
            catch(Exception e)
            {
                MessageBox.Show("Error starting Server.__________________\n"+e.ToString());
            }
            while (true)
            {
                TcpClient TCPC;
                TCPC = ServerL.AcceptTcpClient();
                if (ServerLoad < 100)
                {
                    Thread T = new Thread(HandleClient);
                    T.Start((object)TCPC);
                }
                else
                {
                    byte[] BYTES = AE.GetBytes("NoAccess:Full");
                    NetworkStream NS = TCPC.GetStream();
                    NS.Write(BYTES, 0, BYTES.Length);
                }
            }
        }

        public void HandleClient(object C)
        {
            ServerLoad++;
            TcpClient Client = (TcpClient)C;
            NetworkStream NS = Client.GetStream();
            AddH("Client Connected.\nServer Load: " + ServerLoad);
            Thread T = new Thread(ReadClient);
            T.Start(C);
            try
            {
                while (true) { NS.Write(AE.GetBytes(""), 0, AE.GetBytes("").Length); }
            }
            catch { }
            ServerLoad--;
            AddH("Client Disconnected.\nServer Load: " + ServerLoad);
        }

        public void ReadClient(object C)
        {
            //TcpClient Client = (TcpClient)C;
        }

        private void startStopToolStripMenuItem_Click(object sender, EventArgs e)
        {
                LBL_SS.Text = "Server On";
                LBL_SS.ForeColor = Color.Green;
                if (ServerON == false)
                {
                    Thread T = new Thread(Server);
                    T.Start();
                }
                ServerON = true;
        }

        private void Update_Tick(object sender, EventArgs e)
        {
            ServerINF.Text = ServerINFtxt;
            PB_SL.Value = ServerLoad;
        }
    }
}
هل كانت مفيدة؟

المحلول

إذا قمت بإجراء مكالمة حظر للقراءة على تيار الشبكة وتقوم بإرجاع 0 بايت وطول أن تقرأ هذا يعني أن العميل قد قطع. أنك لن تحصل على استثناء حتى محاولة الكتابة إلى هذا الاتصال. هذا هو أفضل تخمين لي على ما يجري.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top