使用Tcplistener和tcpclient进行网络通信时,为什么不能连续接收数据呢?
当在服务器端采用无限循环接收数据时,可以连续接收,但这样客户端却不能连续接收来自服务器的数据了。
我所希望的效果是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按钮,才能正确接收,否则就只能接收一次,这是为什么呢 怎么才能连续接收呢