【发布时间】:2016-02-28 05:11:18
【问题描述】:
我是 C# 网络编程的新手。
所以我决定写一个简单的服务器-客户端winform应用程序。
我使用 TcpListener、TcpClient、NetworkStream。
下面是来自客户端应用程序的代码片段。
TcpCLient client;
NetworkStream ns;
private void butConnect_Click(object sender, EventArgs e)
{
string remoteIp = txtRemoteIp.Text;
int port = 4848;
client = new TcpClient(remoteIp, port);
ns = client.GetStream();
}
private void butSend_Click(object sender, EventArgs e)
{
string msg = txtMessage.Text;
//string remoteIp = txtRemoteIp.Text;
//int port = 4848;
//client = new TcpClient(remoteIp, port);
//ns = client.GetStream();
byte[] buffer = Encoding.ASCII.GetBytes(msg);
ns.Write(buffer, 0, buffer.Length);
txtMessage.Clear();
}
如您所见,我在 butConnect 方法中启动了 client 和 ns。当我尝试在butSend 方法中发送一些msg 时,服务器端应用程序无法读取它。
但是,当我从 butsend 方法中的行中删除 cmets 时,msg 已发送。
服务器端应用程序可以获取并显示 clinet 消息。
那么问题是什么?为什么我必须再次启动client 和ns 变量?
这是服务器端代码。
public FormServer() //this is constructor
{
InitializeComponent();
initControls();
ipAddr = IPAddress.Parse(txtIpAddress.Text);
port = 4848;
listener = new TcpListener(ipAddr, port);
listener.Start();
Thread t = new Thread(Run);
t.Name = "ListenerThread";
t.Start();
}
private void Run()
{
while (true)
{
while (!listener.Pending())
{
Thread.Sleep(200);
}
Action<string> action = (string s) => listStatus.Items.Add(s);
client = listener.AcceptTcpClient();
try
{
NetworkStream ns = client.GetStream();
byte[] buffer = new byte[1024];
ns.Read(buffer, 0, 1024);
string msg = Encoding.ASCII.GetString(buffer);
listStatus.Invoke(action, msg);
}
catch (Exception e)
{
System.Diagnostics.Debug.WriteLine(e.Message);
}
}
}
【问题讨论】:
-
服务器可能会关闭连接,它可能会超时,也许您更改了
txtRemoteIp.Text...问题可能是其中之一。你能显示服务器代码吗?你调用butConnect_Click方法吗?你能解释一下为了重现它而采取的确切步骤吗?
标签: c# sockets tcp network-programming networkstream