【求救SOS】C# EndRead IO异常,与 asyneccallback 异常

lc0598 2009-04-23 01:12:41
最近在写一个大厅游戏,可是写到客户端的时候,登录可以完成,但进入大厅的时候就会出异常(第二次请求)服务器没有响应,服务器console标记没有输出。调试发现在第二次请求时,asynccallback并没有调用回调,而是binarywriter输出后就结束了,有时还会出现线程被终止,我想可能时asynccallback超时了。
请高赐教。……在线等待中…………………………

代码(客户端):1.
public class ClientStreamClass
{

public delegate void OutByte(Byte [] byt); //返回字節數據委托

public event OutByte MyOut;

private TcpClient tcpclient;
private Byte[] rebyte;
private MyBytes mybytes;

public ClientStreamClass(TcpClient tcp) {
rebyte = new Byte[1024];
mybytes = new MyBytes();
tcpclient = tcp;
}

public void SetAndSendStream(BaseModel bml) {

AsyncCallback acb = new AsyncCallback(MyGetStream);
tcpclient.GetStream().BeginRead(rebyte, 0, 1024, acb, null);

Byte[] sendbytes = ConverStream.GetSerializationBytes(bml);

SendMessage(sendbytes);

}

private void MyGetStream(IAsyncResult ar) {

int streamleng;//判斷數據長度
Boolean state = true;//數據是否讀取完

streamleng = tcpclient.GetStream().EndRead(ar);

if (streamleng < 1)
{

DisponseTcp();
return;
}


mybytes.AddBytes(rebyte, streamleng);
rebyte = new Byte[1024];

if (tcpclient.GetStream().DataAvailable) {
state = false;
tcpclient.GetStream().BeginRead
(rebyte, 0, 1024, new AsyncCallback(MyGetStream),tcpclient.GetStream());
}

if (state) {//数据读取完毕

MyOut(mybytes.ReceiveAllByte);//觸發事件
mybytes.Dispose();
}

}

//發送數據
private void SendMessage(Byte [] sendByte) {
BinaryWriter bw = new BinaryWriter(tcpclient.GetStream());
bw.Write(sendByte);
bw.Flush();
}

//銷毀連接
private void DisponseTcp()
{

if (tcpclient != null)
{
tcpclient.Close();
tcpclient = null;
}
}
}
form 窗体的调用如下:
2. try
{
ThreadReadStream();
}
catch (Exception ex) {

ErrorModel em = new ErrorModel();
em.Errorid = "501";
em.EventTime = DateTime.Now.ToString("YYYY-MM-DD hh:mm:ss");
em.Comeform = "client";
em.EMessage = ex.Message;
cpc.SendSystemInfo(cpc.ErrorExit(em));

if (tcpclient != null) {
tcpclient.Close();
tcpclient = null;
}

Application.Exit();
}
//调用 类1 .
private void ThreadReadStream() {
ClientStreamClass csc = new ClientStreamClass(tcpclient);
csc.MyOut += new ClientStreamClass.OutByte(this.StreamProtocolUse);
csc.SetAndSendStream(cpc.Get501Protocol() as BaseModel);
}

...全文
201 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
lc0598 2009-04-23
  • 打赏
  • 举报
回复
額,神啦,救救我吧。
lc0598 2009-04-23
  • 打赏
  • 举报
回复
s服務器端:
代碼:
//之前创建了一个tcpListen对象,来监听。用线程来启动的。

public void TCPConnect() {
Console.WriteLine("準備讀取請求……");//-----------------------!
AsyncCallback acb = new AsyncCallback(ReadStreamCallBack);
mytcp.GetStream().BeginRead(rebyte, 0, 1024, acb, null);
}


private void ReadStreamCallBack(IAsyncResult iar) {

int readStat = 0;//讀取狀態

Console.WriteLine("数据流读取中…………");
try
{
lock (mytcp.GetStream())
{
readStat = mytcp.GetStream().EndRead(iar);

if (readStat < 1)
{
mytcp.Close();

if (Dispose != null)
{
EventArgs ea = new EventArgs();
Dispose(this, ea);
}
return;
}
}
//Mybyte是字節數組存取對象
mybyte.AddBytes(rebyte, readStat);

rebyte = new byte[1024];
if (mytcp.GetStream().DataAvailable)
{
mytcp.GetStream().BeginRead
(rebyte, 0, rebyte.Length, new AsyncCallback(ReadStreamCallBack), mytcp.GetStream());
}
else
{
FormatText(mybyte.ReceiveAllByte);//將數據格式化
mybyte.Dispose();//銷毀字節對象

if (userStat == 1) {
Console.WriteLine("数据读取结束!");//---------------------------
lock (mytcp.GetStream()) {
AsyncCallback acb = new AsyncCallback(ReadStreamCallBack);
mytcp.GetStream().BeginRead(rebyte, 0, rebyte.Length, acb, null);
}
}

}

}
catch (Exception ex) {
mytcp.Close();
if (Dispose != null)
EventArgs e = new EventArgs();
Dispose(this, e);
}
Console.WriteLine(ex.Message);//---------------------
}

}

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧