关于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是终止符吧。 --------------------编程问答--------------------
--------------------编程问答-------------------- 回答6楼 我分步调试的时候发现read的值一直是65的
int read=handler.EndReceive(ar);
if(read>0)
调试一下这个读取到是不是300个数据。另外乱码可能是编解码不一致导致
发送接受都使用相同的编解码。
--------------------编程问答-------------------- 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#