首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于异步通信的有关问题

2013-04-09 
关于异步通信的问题我想写一个最简单的异步通信,就是把客户端的一个字符串传入服务器端,在服务器端倒序之

关于异步通信的问题
我想写一个最简单的异步通信,就是把客户端的一个字符串传入服务器端,在服务器端倒序之后传回客户端显示,不知道是不是我这样写,而且在客户端还有报错,求高人指点。代码如下:
服务器端:

namespace SimpleServer
{
    public partial class Form1 : Form
    {
        private Thread ListenerThread;
        TcpListener tcpListener = null;

        public Form1()
        {
            InitializeComponent();
            ListenerThread = new Thread(new ThreadStart(ListenerThreadMethod));
            ListenerThread.IsBackground = true;
            ListenerThread.Start();
        }

        public void ListenerThreadMethod()
        {
            TcpClient tcpClient = null;
            NetworkStream networkStream = null;
            try
            {
                IPAddress ip = IPAddress.Parse("127.0.0.1");
                tcpListener = new TcpListener(ip, 7777);
                tcpListener.Start();
            }
            catch
            {
                MessageBox.Show("不能建立服务器");
            }
            while (true)
            {
                try
                {
                    tcpClient = tcpListener.AcceptTcpClient();
                    //对收到的请求做处理
                    List<byte> reData = new List<byte>();
                    byte[] reDataBytes = new byte[tcpClient.ReceiveBufferSize];
                    int n = 0;
                    networkStream = tcpClient.GetStream();


                    if (networkStream.CanRead)
                    {
                        do
                        {
                            n = networkStream.Read(reDataBytes, 0, (int)tcpClient.ReceiveBufferSize);
                            if (n == (int)tcpClient.ReceiveBufferSize)
                                reData.AddRange(reDataBytes);
                            else if (n != 0)
                            {
                                byte[] bytes1 = new byte[n];
                                for (int i = 0; i < n; i++)
                                {
                                    bytes1[i] = reDataBytes[i];
                                }
                                reData.AddRange(bytes1);
                            }
                        } while (networkStream.DataAvailable);
                    }
                    reDataBytes = reData.ToArray();
                    //字符串倒序
                    string reString = Encoding.UTF8.GetString(reDataBytes);


                    string tempString = "";
                    for (int i = reString.Length - 1; i >= 0; i--)
                    {
                        tempString += reString[i];
                    }
                    byte[] data = Encoding.UTF8.GetBytes(tempString);
                    networkStream.BeginWrite(data, 0, data.Length, new AsyncCallback(DownLoadCallBackF), networkStream);
                }
                catch
                {
                }
            }
        }

        public void DownLoadCallBackF(IAsyncResult ar)
        {
            NetworkStream networkStream = (NetworkStream)ar.AsyncState;
            try
            {
                networkStream.EndWrite(ar);
            }
            catch
            {
            }
            finally
            {
                if (networkStream != null)
                    networkStream.Close();
            }
        }
    }
}



客户端:
namespace SimpleClient
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {


            TcpClient tcpClient = new TcpClient();
            tcpClient.BeginConnect(IPAddress.Parse("127.0.0.1"), 7777, new AsyncCallback(DownloadCallBackF), tcpClient);
        }

        public byte[] ReadFromTcpClient(TcpClient tcpClient)
        {
            List<byte> data = new List<byte>();
            NetworkStream networkStream = null;
            byte[] bytes = new byte[tcpClient.ReceiveBufferSize];
            int n = 0;
            try
            {
                networkStream = tcpClient.GetStream();
                if (networkStream.CanRead)
                {
                    do
                    {
                        n = networkStream.Read(bytes, 0, (int)tcpClient.ReceiveBufferSize);
                        if (n == (int)tcpClient.ReceiveBufferSize)
                            data.AddRange(bytes);
                        else if (n != 0)
                        {
                            byte[] bytes1 = new byte[n];
                            for (int i = 0; i < n; i++)
                                bytes1[i] = bytes[i];
                            data.AddRange(bytes1);
                        }
                    } while (networkStream.DataAvailable);


                }
                bytes = data.ToArray();
            }
            catch
            {
                MessageBox.Show("读取数据失败");
                bytes = null;
            }
            finally
            {
                if (networkStream != null)
                    networkStream.Close();
                tcpClient.Close();
            }
            return bytes;
        }

        public void DownloadCallBackF(IAsyncResult ar)
        {
            TcpClient tcpClient = (TcpClient)ar.AsyncState;
            try
            {
                tcpClient.EndConnect(ar);
                NetworkStream netStreamSend = null;
                byte[] netSend = new byte[textBox1.Text.Length];
                netSend = Encoding.UTF8.GetBytes(textBox1.Text);
                netStreamSend.BeginWrite(netSend, 0, netSend.Length, new AsyncCallback(SendCallBackF), netStreamSend);
            }
            //此处捕获异常“未将对象引用设置到对象的实例。”
            catch
            {
                MessageBox.Show("连接失败");
                return;
            }
            byte[] bytes = ReadFromTcpClient(tcpClient);
            textBox2.Text = Encoding.UTF8.GetString(bytes);
        }

        public void SendCallBackF(IAsyncResult ar)
        {


            NetworkStream netStream = (NetworkStream)ar.AsyncState;
            try
            {
                netStream.EndWrite(ar);
            }
            catch
            {
            }
            finally
            {
                if (netStream != null)
                    netStream.Close();
            }
        }
    }
}

C#?异步通信
[解决办法]
 NetworkStream netStreamSend = null;
你这里声明后 没有给他复制··你看是不是··
所以会  捕获异常“未将对象引用设置到对象的实例。”的异常···

热点排行