使用Tcplistener和tcpclient进行网络通信时,为什么不能连续接收数据呢?

dieyuu 2009-04-20 09:54:28
当在服务器端采用无限循环接收数据时,可以连续接收,但这样客户端却不能连续接收来自服务器的数据了。
我所希望的效果是client发送控制命令给server,server将运行状态反馈给client。
谁能帮帮忙?
服务器端代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Net;
using System.Net.Sockets;

namespace server
{
public partial class Form1 : Form

{ public TcpListener listener;
public NetworkStream ns;
byte[] data = new byte[1024];
static bool tcpconnect = false;
string stringdata;


public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
}

private void connect_Click(object sender, EventArgs e) //启动服务器按钮
{
IPAddress serverIP = IPAddress.Parse("192.168.0.70");
listener = new TcpListener(serverIP, 5555);
listener.Start();
status.Text = "waiting for connection";
tcpconnect = true;
Thread thread = new Thread(new ThreadStart(this.StartSocketListen));//开通一个新线程
thread.Start();


}
private void StartSocketListen()
{

bool stopflag = false;

TcpClient client = listener.AcceptTcpClient();

ns = client.GetStream();
status.Text = "connect successed";

if (!ns.CanRead)
{
return;
}

while (!stopflag) //循环接收数据
{
int recv = ns.Read(data, 0, data.Length);
if (recv < 1)
{
Thread.Sleep(200);
continue;
}

stringdata = Encoding.ASCII.GetString(data, 0, recv);
textBox3.Text = stringdata; //显示所接受的数据

}
}

private void close_Click(object sender, EventArgs e)
{
tcpconnect = false;
ns.Close();
listener.Stop();
status.Text = "disconnection";

close.Enabled = false;
connect.Enabled = true;
this.Close();
}

private void send_Click(object sender, EventArgs e) // 发送数据
{
string message = textBox2.Text;
byte[] bytes = Encoding.ASCII.GetBytes(message);
ns.Write(bytes, 0, bytes.Length);
}





客户端代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace Tcpclient
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

public TcpClient tcpclient;
public StreamWriter sw;
private StreamReader sr;
private NetworkStream ns;
private bool tcpconnect;

private void connect_Click(object sender, EventArgs e) //连接按钮
{

try
{
ipRemote = IPAddress.Parse(textBox1.Text);
}
catch
{
MessageBox.Show("the address is illegeal");
return;
}
IPEndPoint IPEdp = new IPEndPoint(ipRemote, Convert.ToInt32(textBox2.Text));

try
{

tcpclient = new TcpClient();
tcpclient.Connect(IPEdp);

status.Text = "connect successed";
ns = tcpclient.GetStream();
sw = new StreamWriter(ns);
}
catch
{
MessageBox.Show("not connect");
return;
}
}
private void senddata_Click(object sender, EventArgs e) // 发送数据
{
Byte[] bytes = Encoding.ASCII.GetBytes(textBox3.Text);
ns.Write(bytes, 0, bytes.Length);
ns.Flush();
}

private void close_Click(object sender, EventArgs e) //关闭
{
ns.Close();
tcpclient.Close();
status.Text = "disconnect";
this.Close();

}

private void receive_Click(object sender,EventArgs e) //启动一个新的线程接收数据
{
Thread rece = new Thread(new ThreadStart(ServerResponse));
rece.Start();
}

private void ServerResponse()
{

byte[] buff = new byte[1024];
string msg;
int len;

if (!ns.CanRead)
{
return;
}

len = ns.Read(buff, 0, buff.Length);
msg = Encoding.ASCII.GetString(buff, 0, len);
msg.Trim();
receive.Text = msg;
}

}


调试的结果是:客户端可以任意发送数据给服务器,但当它接收数据时,必须每次都先按一下receive按钮,才能正确接收,否则就只能接收一次,这是为什么呢 怎么才能连续接收呢
...全文
263 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

111,126

社区成员

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

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

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