当前位置:编程学习 > C#/ASP.NET >>

关于SOCKET异步接收的问题 求高手

 我的程序是要接收300位的数据,但现在每次只能接收到65位且出现的是乱码   新人跪求高手指点   高分求方案。最好能贴代码。大恩不言谢!
我的程序是这样的:
        namespace DTUserver
{
    public partial class Form1 : Form
    {
        public int port = 6004;
        public static ManualResetEvent allDone = new ManualResetEvent(false);
        public Form1()
        {
            InitializeComponent();
        }
        public class StateObject
        {
            public Socket workSocket=null;
            public const int bufferSize=512;
            public byte[] buffer=new byte[bufferSize];
            public StringBuilder sb=new StringBuilder();
        }
        public void startListening()
        {
            IPHostEntry ipHostInFo = Dns.Resolve(Dns.GetHostName());
            IPAddress ipAddress=ipHostInFo.AddressList[0];
            IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, port);
            Socket listener = new Socket(ipEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                listener.Bind(ipEndPoint);
                listener.Listen(10);
                while (true)
                {
                    allDone.Reset();
                    listener.BeginAccept(new AsyncCallback(acceptCallBack), listener);
                    allDone.WaitOne();
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
        }
        public static void acceptCallBack(IAsyncResult ar)
        {
            Socket listener=(Socket)ar.AsyncState;
            Socket handler=listener.EndAccept(ar);

            allDone.Set();

            StateObject state=new StateObject();
            state.workSocket=handler;
            handler.BeginReceive(state.buffer,0,StateObject.bufferSize,0,new AsyncCallback(readCallBack),state);

        }
        public static void readCallBack(IAsyncResult ar)
        {
            StateObject state=(StateObject)ar.AsyncState;
            Socket handler=state.workSocket;

            int read=handler.EndReceive(ar);
            if(read>0)
            {
                state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,read));
               // handler.BeginReceive(state.buffer,0,StateObject.bufferSize,0,new AsyncCallback(readCallBack),state);
                string content = state.sb.ToString();
                MessageBox.Show(content.Length.ToString());
                if (true)
                {

                    byte[] bytes = new byte[read];
                    for (int i = 0; i < read; i++)
                    {
                        bytes[i] = state.buffer[i];
                    }
                    Dataprocess.addDataToBuf(bytes);
                    //string content=state.sb.ToString();
                    //MessageBox.Show(bytes.ToString());
                    MessageBox.Show(content);
                }
                else 
                {
                    handler.BeginReceive(state.buffer, 0, StateObject.bufferSize, 0, new AsyncCallback(readCallBack), state);
                }
                handler.Close();
            }
        }
 class Dataprocess
    {
        private static List <byte> buffer=new List<byte>(4096);
        private static string lastData = "";
        private static  string path = @"c:\MyTest.txt";
        public static  void addDataToBuf(byte[] tempbyte)
        {   
            buffer.AddRange(tempbyte);
            lastData = BytesToStr(tempbyte);
            // MessageBox.Show(lastData);
            File.AppendAllText(path, lastData);
        }
        public static string BytesToStr(byte[] bytes)
        {
            return System.Text.Encoding.UTF8.GetString(bytes);
        }
--------------------编程问答-------------------- 接受到的数据中 ,是不是有\0\0的填充字符? --------------------编程问答-------------------- state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,read))

sb附加的是ascii   --------------------编程问答-------------------- 是的   很多\0\0的
--------------------编程问答-------------------- 跟ascii有关系吗 ?
--------------------编程问答-------------------- 请问两楼这个问题怎么解决呢
--------------------编程问答-------------------- 当需要转换的byte数组中,有\0结尾的字符串时,就认为字符串已经结束。

你不会不知道\0是终止符吧。 --------------------编程问答--------------------

int read=handler.EndReceive(ar);
  if(read>0)
调试一下这个读取到是不是300个数据。另外乱码可能是编解码不一致导致
发送接受都使用相同的编解码。
--------------------编程问答-------------------- 回答6楼  我分步调试的时候发现read的值一直是65的
--------------------编程问答-------------------- state.sb 中的sb是btye[] 类型吗? 还是string ? --------------------编程问答-------------------- public StringBuilder sb=new StringBuilder();
 是Sstring 类型的 --------------------编程问答-------------------- 我这个是接收DTU的数据的  收到的乱码初步判断可能是连接DTU发来的DTU编号和密码之类的  要想收到想要的数据  还要进行配置文件设置  不知C#的配置文件是怎么弄的
--------------------编程问答-------------------- state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,read))
那这一句是有问题的 

至于配置文件 这么不知道  --------------------编程问答-------------------- 谢谢  感激不尽 --------------------编程问答-------------------- 尽量用byte类型
--------------------编程问答-------------------- Encoding.ASCII.GetString这个容易搞乱字符
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,