c# 服务器和客户端连续通讯问题

编程有钱人了 2009-03-26 04:35:28
客户端

private void button2_Click(object sender, EventArgs e)
{
Connect(); //这里我第一次点击后能从服务器获得数据,第二次及以后就异常了 为什么?
//高手解答
}
private void Connect()
{
try
{
string ServerIp = "127.0.0.1";//服务器地址
int ServerPort = 1000;//服务器端口号
TcpClient TC = new TcpClient();
TC.Connect(ServerIp, ServerPort);//建立与服务器的连接
NetworkStream stm = TC.GetStream();//通过tcp
UTF8Encoding UTF8 = new UTF8Encoding();
byte[] str = UTF8.GetBytes(this.textBox1.Text);//把输入的内容编码
stm.Write(str, 0, str.Length);//向服务器发送信息

byte[] bb = new byte[10240];//接收服务器返回的数据
int k = stm.Read(bb, 0, 10240);
string RevStr = string.Empty;
RevStr = System.Text.UTF8Encoding.UTF8.GetString(bb, 0, k);//转换
this.textBox2.Text += RevStr;//连续显示在TEXTBOX内
stm.Close();
TC.Close();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}


服务器

private TcpListener TL = null;
private System.Net.IPEndPoint qSerIpendPoint;
private Thread qSerTh;
private void Form1_Load(object sender, EventArgs e)
{
Start();
}
private void Start()
{
try
{
int IpPort = 1000;
string Ip = "127.0.0.1";
IPAddress Address = IPAddress.Parse(Ip);//
qSerIpendPoint = new IPEndPoint(Address, IpPort);
TL = new TcpListener(qSerIpendPoint);//准备监听
TL.Start();//开始
qSerTh = new Thread(new ThreadStart(Receive));
qSerTh.Start();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void Receive()
{
try
{
Socket socket;
socket = TL.AcceptSocket();
string RemoteEndPoint = socket.RemoteEndPoint.ToString();
Byte[] Stream = new Byte[10240];
socket.Receive(Stream);//接收传来的值
// UTF8Encoding ServerReceiveStr = new UTF8Encoding();
socket.Send(Stream);//向客服端发送一个回复信息
socket.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

在客户端的文本框输( this.textBox1.Text )入内容后我第一次点击后能从服务器获得数据并能在 this.textBox2.Text显示,
第二次及以后就异常了 为什么?
高手解答
...全文
458 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
hopewoo 2009-03-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wangjun8868 的回复:]
引用 8 楼 hopewoo 的回复:

你的错误是服务端的线程侦听到一个链接后就退出了,导致第二次请求无法响应.
服务端
:
C# code
private void Receive()
{
while (true)
{
try
{
Socket socket;
socket = TL.AcceptSocket();
string RemoteEndPoint = socket.RemoteEndPoin…
[/Quote]
不可能啊,我这里明明可以的.我再贴一遍你复制全了.
客户端:

private TcpClient TC;
private NetworkStream stm;
private void button3_Click(object sender, EventArgs e)
{
//if (TC==null||!TC.Connected)
//{
Connect();
//}
//Send();
}
private void Connect()
{
try
{
string ServerIp = "127.0.0.1";//服务器地址
int ServerPort = 1000;//服务器端口号
TC = new TcpClient();
TC.Connect(ServerIp, ServerPort);//建立与服务器的连接
stm = TC.GetStream();//通过tcp
UTF8Encoding UTF8 = new UTF8Encoding();
byte[] str = UTF8.GetBytes(this.textBox1.Text);//把输入的内容编码
stm.Write(str, 0, str.Length);//向服务器发送信息
byte[] bb = new byte[10240];//接收服务器返回的数据
int k = stm.Read(bb, 0, 10240);
string RevStr = string.Empty;
RevStr = System.Text.UTF8Encoding.UTF8.GetString(bb, 0, k);//转换
this.textBox2.Text += RevStr;//连续显示在TEXTBOX内

stm.Close();
TC.Close();

}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}

服务端

private TcpListener TL = null;
private System.Net.IPEndPoint qSerIpendPoint;
private Thread qSerTh;
private void button1_Click(object sender, EventArgs e)
{
Start();

}
private void Start()
{
try
{
int IpPort = 1000;
string Ip = "127.0.0.1";
IPAddress Address = IPAddress.Parse(Ip);//
qSerIpendPoint = new IPEndPoint(Address, IpPort);
TL = new TcpListener(qSerIpendPoint);//准备监听
TL.Start();//开始
qSerTh = new Thread(new ThreadStart(Receive));
qSerTh.IsBackground = true;
qSerTh.Start();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void Receive()
{
while (true)
{
try
{
Socket socket;
socket = TL.AcceptSocket();
string RemoteEndPoint = socket.RemoteEndPoint.ToString();
Byte[] Stream = new Byte[10240];
socket.Receive(Stream);//接收传来的值
// UTF8Encoding ServerReceiveStr = new UTF8Encoding();
socket.Send(Stream);//向客服端发送一个回复信息
socket.Close();
//socket.Disconnect(true);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
Thread.Sleep(100);
}
}

我的是VS2008,不过设置成FM2.0编译的
编程有钱人了 2009-03-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 much0726 的回复:]
异常提示什么?
写法有点奇怪,客户段没有用SOCKET。
[/Quote]

无法引用已释放的资源
编程有钱人了 2009-03-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hopewoo 的回复:]

你的错误是服务端的线程侦听到一个链接后就退出了,导致第二次请求无法响应.
服务端
:
C# code
private void Receive()
{
while (true)
{
try
{
Socket socket;
socket = TL.AcceptSocket();
string RemoteEndPoint = socket.RemoteEndPoint.ToString();
B…
[/Quote]

还是不行
much0726 2009-03-30
  • 打赏
  • 举报
回复
异常提示什么?
写法有点奇怪,客户段没有用SOCKET。
mabailin 2009-03-27
  • 打赏
  • 举报
回复
收藏学习
hopewoo 2009-03-27
  • 打赏
  • 举报
回复

你的错误是服务端的线程侦听到一个链接后就退出了,导致第二次请求无法响应.
服务端
:

private void Receive()
{
while (true)
{
try
{
Socket socket;
socket = TL.AcceptSocket();
string RemoteEndPoint = socket.RemoteEndPoint.ToString();
Byte[] Stream = new Byte[10240];
socket.Receive(Stream);//接收传来的值
// UTF8Encoding ServerReceiveStr = new UTF8Encoding();
socket.Send(Stream);//向客服端发送一个回复信息
socket.Close();
//socket.Disconnect(true);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
Thread.Sleep(100);
}
}

客户端其实不改也没问题,只是资源最好释放干净

private TcpClient TC;
private NetworkStream stm;
private void button3_Click(object sender, EventArgs e)
{
//if (TC==null||!TC.Connected)
//{
Connect();
//}
//Send();
}
private void Connect()
{
try
{
string ServerIp = "127.0.0.1";//服务器地址
int ServerPort = 1000;//服务器端口号
TC = new TcpClient();
TC.Connect(ServerIp, ServerPort);//建立与服务器的连接
stm = TC.GetStream();//通过tcp
UTF8Encoding UTF8 = new UTF8Encoding();
byte[] str = UTF8.GetBytes(this.textBox1.Text);//把输入的内容编码
stm.Write(str, 0, str.Length);//向服务器发送信息
byte[] bb = new byte[10240];//接收服务器返回的数据
int k = stm.Read(bb, 0, 10240);
string RevStr = string.Empty;
RevStr = System.Text.UTF8Encoding.UTF8.GetString(bb, 0, k);//转换
this.textBox2.Text += RevStr;//连续显示在TEXTBOX内

stm.Close();
TC.Close();

}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
编程有钱人了 2009-03-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 qinhl99 的回复:]
http://www.cnblogs.com/JimmyZhang/archive/2008/09/07/1286300.html
[/Quote]
谢谢
qinhl99 2009-03-26
  • 打赏
  • 举报
回复
http://www.cnblogs.com/JimmyZhang/archive/2008/09/07/1286300.html
编程有钱人了 2009-03-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 geaim 的回复:]
第一次点击连接后要做好已经连接的标志,下次连接前先检查一下是否已经连接,已经连接则不再连接,直接进行其他操作。
否则已经连接的情况下,再次连接会报错的。我估计你可能是这个原因引起的。
[/Quote]
那要这么做?
dugupiaoyun 2009-03-26
  • 打赏
  • 举报
回复
另外客户端那边每次发送完最好能调用一次stm.Flush()
dugupiaoyun 2009-03-26
  • 打赏
  • 举报
回复
服务器端Receive()方法需要加个while(true){try..........}

问题原因是服务器那边的连接已经释放掉了,所以下次再用就会异常
哈哈潜伏哥 2009-03-26
  • 打赏
  • 举报
回复
第一次点击连接后要做好已经连接的标志,下次连接前先检查一下是否已经连接,已经连接则不再连接,直接进行其他操作。
否则已经连接的情况下,再次连接会报错的。我估计你可能是这个原因引起的。
occam 2009-03-26
  • 打赏
  • 举报
回复
看起来在第一次连接之后服务器就停止监听了, 客户端自然是连接失败

110,534

社区成员

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

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

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