我的socket接收的时候,是一个byte一个byte收的(这样做的原因是当收到值为3时,可以及时发出值6。这个规则是对方服务器自定的)。代码如下
//另一个线程的无限循环接收
private void RecevieMsg()
{
while (true)
{
byte[] buffer = new byte[1024];
byte[] recevie = new byte[1];//一个一个接 socket.Receive(recevie); if (recevie[0] == 3)//PMS发送“3”相当于PMS说完了一句话,等待程序对它进行回应(回应“6”)。
{
byte[] ack = new byte[1];
ack[0] = 6;//回复给PMS6
socket.Send(ack);
}
//strRec += Encoding.ASCII.GetString(recevie);
}
}现在,我会不定时的收到服务器传过来的一些数据,例如下面这条长数据...****LS|DA100719|TI161039|****GI|RN3017|G#17277|GN(EN) Mr Messi|GLEA|GV1|**GO|RN1007|G#17277|GSN|***[/color]注:*代表一些无用信息,而区分句与句之间的标志是—>表示一句话的开始,表示一句话的结束。
比如根据和的标示,我知道了一句完整的话—〉LS|DA100719|TI161039|,我的目标就是将一句未知的长度的话,一句一句的分开。我的目标是—>
比如服务器传过来的是上面的例子长句(我用socket接收时是一个byte一个byte去接收的),我得到的第一句话是—>LS|DA100719|TI161039| ,然后用MessageBox.Show显示出来.
然后socket接着接收,得到第二句话—> GI|RN3017|G#17277|GN(EN) Mr Messi|GLEA|GV1| ,,然后用MessageBox.Show显示出来.
然后接着接收得到第三句话—>GO|RN1007|G#17277|GSN|,然后用MessageBox.Show显示出来.希望高手指点,万分感谢!!!!!
//另一个线程的无限循环接收
private void RecevieMsg()
{
while (true)
{
byte[] buffer = new byte[1024];
byte[] recevie = new byte[1];//一个一个接 socket.Receive(recevie); if (recevie[0] == 3)//PMS发送“3”相当于PMS说完了一句话,等待程序对它进行回应(回应“6”)。
{
byte[] ack = new byte[1];
ack[0] = 6;//回复给PMS6
socket.Send(ack);
}
//strRec += Encoding.ASCII.GetString(recevie);
}
}现在,我会不定时的收到服务器传过来的一些数据,例如下面这条长数据...****LS|DA100719|TI161039|****GI|RN3017|G#17277|GN(EN) Mr Messi|GLEA|GV1|**GO|RN1007|G#17277|GSN|***[/color]注:*代表一些无用信息,而区分句与句之间的标志是—>表示一句话的开始,表示一句话的结束。
比如根据和的标示,我知道了一句完整的话—〉LS|DA100719|TI161039|,我的目标就是将一句未知的长度的话,一句一句的分开。我的目标是—>
比如服务器传过来的是上面的例子长句(我用socket接收时是一个byte一个byte去接收的),我得到的第一句话是—>LS|DA100719|TI161039| ,然后用MessageBox.Show显示出来.
然后socket接着接收,得到第二句话—> GI|RN3017|G#17277|GN(EN) Mr Messi|GLEA|GV1| ,,然后用MessageBox.Show显示出来.
然后接着接收得到第三句话—>GO|RN1007|G#17277|GSN|,然后用MessageBox.Show显示出来.希望高手指点,万分感谢!!!!!
string str = null;
if (receive[0].ToString() == "")
{
flag = true;
} if (receive[0].ToString() == "")
{
flag = false;
} if (flag)
{
str += receive[0].ToString();
}
else if (receive[0] == 3)
{
str = null;
//... ...
}
//接收
private void RecevieMsg()
{
while (true)
{
byte[] buffer = new byte[1024];
byte[] recevie = new byte[1]; socket.Receive(recevie);//WHILE循环,会一个位置一个位置去接收数据。 string str = null;
if (recevie[0] == 2)//一整句话的开始
{
flag = true;
} if (recevie[0] == 3)//一整句话的结束
{
flag = false;
} if (flag)
{
str += Encoding.ASCII.GetString(recevie);
}
else if (recevie[0] == 3)
{
byte[] ack = new byte[1];
ack[0] = 6;//回复给PMS6
socket.Send(ack);
MessageBox.Show(strRec);//以后改写成一个方法。
str = null;
flag = false;
}
}
}没什么问题吧,缓冲区的方法我在查资料。
if (recevie[0] == 2)//一整句话的开始
{
flag = true;
}
改写成
if (recevie[0] == 2)//一整句话的开始
{
flag = true;
return;
}
对吧
我在修改一个SOCKET服务器测试下
if (flag && (receive[0].ToString!="")&& (receive[0].ToString!=""))
{
str += Encoding.ASCII.GetString(recevie);
}
else if (recevie[0] == 3)
{
byte[] ack = new byte[1];
ack[0] = 6;//回复给PMS6
socket.Send(ack);
MessageBox.Show(strRec);//以后改写成一个方法。
str = null;
flag = false;
}
你确定Return在你的函数中能够达到预期的目的吗?
private void RecevieMsg()
{
while (true)
{
byte[] buffer = new byte[1024];
byte[] recevie = new byte[1]; socket.Receive(recevie);//WHILE循环,会一个位置一个位置去接收数据。 if (recevie[0] == 2)//一整句话的开始
{
flag = true;
} if (recevie[0] == 3)//一整句话的结束
{
flag = false;
} if (flag && recevie[0] != 2)//不想要""
{
str += Encoding.ASCII.GetString(recevie);
}
else if (recevie[0] == 3)
{
byte[] ack = new byte[1];
ack[0] = 6;//回复给PMS6
socket.Send(ack);
MessageBox.Show(str);//以后改写成一个方法。
str = null;
}
}
}