想通过tcpclient来发送信息到服务端,但必须每发送一次,就关闭链接重新发送(因为同一个客户端端口服务端不接受第二次信息) TcpClient tcpClient;
BackgroundWorker bgWorkder = new BackgroundWorker();
/// <summary>
/// 发送信息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSend_Click(object sender, EventArgs e)
{
if (tcpClient != null)
{
tcpClient.Close(); //信息发送部分,没有使用异步
IPAddress ip = IPAddress.Parse(txtIp.Text);
IPEndPoint ipPoint = new IPEndPoint(ip, Convert.ToInt16(txtPort.Text));
tcpClient = new TcpClient();
tcpClient.Connect(ipPoint);
NetworkStream nStream = tcpClient.GetStream();
nStream.Write(bytTotal, 0, bytTotal.Length);
//接收部分,使用异步等待接收
if(bgWorkder.IsBusy)
{
return;
}
// bgWorkder.CancelAsync();
// bgWorkder.Dispose();
bgWorkder.DoWork += new DoWorkEventHandler(bgWorkder_DoWork);
bgWorkder.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorkder_RunWorkerCompleted);
bgWorkder.RunWorkerAsync();
}
void bgWorkder_DoWork(object sender, DoWorkEventArgs e)
{
while (tcpClient.Connected)
{
if(bgWorkder.CancellationPending)
{
e.Cancel=true;
break;
}
NetworkStream nStream = tcpClient.GetStream();
byte[] buffer = new byte[8192];
int received = nStream.Read(buffer, 0, buffer.Length);
string recMsg = Encoding.GetEncoding("GB2312").GetString(buffer).Substring(0, received);
if (recMsg.Length > 0)
{
//待处理
string logStr = DateTime.Now.ToString() + "\t来自服务端\r\n" + recMsg;
logStr += "\r\n\r\n";
txtLog.AppendText(logStr);
}
Thread.Sleep(10);
}
}问题是,发送完一次后,能收到服务端返回的信息,第二次就不行了.
BackgroundWorker bgWorkder = new BackgroundWorker();
/// <summary>
/// 发送信息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSend_Click(object sender, EventArgs e)
{
if (tcpClient != null)
{
tcpClient.Close(); //信息发送部分,没有使用异步
IPAddress ip = IPAddress.Parse(txtIp.Text);
IPEndPoint ipPoint = new IPEndPoint(ip, Convert.ToInt16(txtPort.Text));
tcpClient = new TcpClient();
tcpClient.Connect(ipPoint);
NetworkStream nStream = tcpClient.GetStream();
nStream.Write(bytTotal, 0, bytTotal.Length);
//接收部分,使用异步等待接收
if(bgWorkder.IsBusy)
{
return;
}
// bgWorkder.CancelAsync();
// bgWorkder.Dispose();
bgWorkder.DoWork += new DoWorkEventHandler(bgWorkder_DoWork);
bgWorkder.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorkder_RunWorkerCompleted);
bgWorkder.RunWorkerAsync();
}
void bgWorkder_DoWork(object sender, DoWorkEventArgs e)
{
while (tcpClient.Connected)
{
if(bgWorkder.CancellationPending)
{
e.Cancel=true;
break;
}
NetworkStream nStream = tcpClient.GetStream();
byte[] buffer = new byte[8192];
int received = nStream.Read(buffer, 0, buffer.Length);
string recMsg = Encoding.GetEncoding("GB2312").GetString(buffer).Substring(0, received);
if (recMsg.Length > 0)
{
//待处理
string logStr = DateTime.Now.ToString() + "\t来自服务端\r\n" + recMsg;
logStr += "\r\n\r\n";
txtLog.AppendText(logStr);
}
Thread.Sleep(10);
}
}问题是,发送完一次后,能收到服务端返回的信息,第二次就不行了.
bgWorkder.CancelAsync();
bgWorkder.Dispose();
bgWorkder = new BackgroundWorker();
bgWorkder.WorkerSupportsCancellation = true;
取消判断isbusy直接销毁就可以了
每调用一次。服务端给你发送数据的socket都是不一样的。
能不能吧connect放出去。
send的时候判断是否connect了。其他的代码可以不用改。