用TCP出现的问题,求助
服务端
private void Form1_Load(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(ListenerThread));
t.IsBackground = true;
t.Start();
} private void ListenerThread()
{
try
{
tcpListener = new TcpListener(new IPEndPoint(IPAddress.Parse("192.168.2.92"), 12000));
tcpListener.Start();
this.Invoke((EventHandler)delegate
{
listBox1.Items.Add("正在监听12000端口");
});
while (true)
{
TcpClient tcpClient = tcpListener.AcceptTcpClient();
IPEndPoint ep = (IPEndPoint)tcpClient.Client.RemoteEndPoint;
this.Invoke((EventHandler)delegate
{
listBox1.Items.Add("有客户端连接成功!"); string ip = ep.Address.ToString();
int port = ep.Port;
listBox1.Items.Add("IP:" + ip + ",端口" + port.ToString());
});
NetworkStream netStream = tcpClient.GetStream();
StreamWriter writer = new StreamWriter(netStream);
StreamReader reader = new StreamReader(netStream);
string temp = reader.ReadLine();
this.Invoke((EventHandler)delegate
{
listBox1.Items.Add(temp);
});
writer.WriteLine(temp.ToUpper());
writer.Flush();
reader.Close();
writer.Close();
netStream.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
客户端
public partial class Form1 : Form
{
TcpClient tcpClient;
public Form1()
{
InitializeComponent();
} private void SendData()
{
//TcpClient tcpClient = new TcpClient();
//tcpClient.Connect(new IPEndPoint(IPAddress.Parse("192.168.2.92"), 12000));
NetworkStream ns = tcpClient.GetStream();
StreamWriter writer = new StreamWriter(ns);
StreamReader reader = new StreamReader(ns);
writer.WriteLine(textBox1.Text.Trim());
writer.Flush();
string temp = reader.ReadLine();
this.listBox1.Items.Add(temp);
writer.Close();
reader.Close();
} private void btnSend_Click(object sender, EventArgs e)
{
SendData();
} private void Form1_Load(object sender, EventArgs e)
{
tcpClient = new TcpClient();
tcpClient.Connect(new IPEndPoint(IPAddress.Parse("192.168.2.92"), 12000));
}
}
出现的问题是客户端只能向服务器端发一次数据,第二次发数据,就会报 不允许对非连接的套接字执行此操作
如果把Form1_Load中代码去掉,SendData()中注释的代码 去掉注释,就能正常的多次发送了,但是这样,每次都要连接一次, 好像很明显,这样的代码,没有意义啊。求大侠们帮忙。C#TCP/IPListBox对象
服务端
private void Form1_Load(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(ListenerThread));
t.IsBackground = true;
t.Start();
} private void ListenerThread()
{
try
{
tcpListener = new TcpListener(new IPEndPoint(IPAddress.Parse("192.168.2.92"), 12000));
tcpListener.Start();
this.Invoke((EventHandler)delegate
{
listBox1.Items.Add("正在监听12000端口");
});
while (true)
{
TcpClient tcpClient = tcpListener.AcceptTcpClient();
IPEndPoint ep = (IPEndPoint)tcpClient.Client.RemoteEndPoint;
this.Invoke((EventHandler)delegate
{
listBox1.Items.Add("有客户端连接成功!"); string ip = ep.Address.ToString();
int port = ep.Port;
listBox1.Items.Add("IP:" + ip + ",端口" + port.ToString());
});
NetworkStream netStream = tcpClient.GetStream();
StreamWriter writer = new StreamWriter(netStream);
StreamReader reader = new StreamReader(netStream);
string temp = reader.ReadLine();
this.Invoke((EventHandler)delegate
{
listBox1.Items.Add(temp);
});
writer.WriteLine(temp.ToUpper());
writer.Flush();
reader.Close();
writer.Close();
netStream.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
客户端
public partial class Form1 : Form
{
TcpClient tcpClient;
public Form1()
{
InitializeComponent();
} private void SendData()
{
//TcpClient tcpClient = new TcpClient();
//tcpClient.Connect(new IPEndPoint(IPAddress.Parse("192.168.2.92"), 12000));
NetworkStream ns = tcpClient.GetStream();
StreamWriter writer = new StreamWriter(ns);
StreamReader reader = new StreamReader(ns);
writer.WriteLine(textBox1.Text.Trim());
writer.Flush();
string temp = reader.ReadLine();
this.listBox1.Items.Add(temp);
writer.Close();
reader.Close();
} private void btnSend_Click(object sender, EventArgs e)
{
SendData();
} private void Form1_Load(object sender, EventArgs e)
{
tcpClient = new TcpClient();
tcpClient.Connect(new IPEndPoint(IPAddress.Parse("192.168.2.92"), 12000));
}
}
出现的问题是客户端只能向服务器端发一次数据,第二次发数据,就会报 不允许对非连接的套接字执行此操作
如果把Form1_Load中代码去掉,SendData()中注释的代码 去掉注释,就能正常的多次发送了,但是这样,每次都要连接一次, 好像很明显,这样的代码,没有意义啊。求大侠们帮忙。C#TCP/IPListBox对象
if (tcpClient.Connected)
{
this.listBox1.Items.Add("连接正常");
}
else
{
this.listBox1.Items.Add("连接已关闭");
}
提示信息是连接已关闭