我的程序很奇怪,第一次点击按钮button1_Click很正常,第二次点击按钮button1_Click程序就没有响应了,好像还陷入死循环了,不知道什么原因,请各位大大帮我解惑,下面附源代码:服务端: public Form1()
{
InitializeComponent();
//开始启动服务器
try
{
thread1 = new Thread(new ThreadStart(Listen));
thread1.Start();
}
catch
{
}
} //监听程序
private void Listen()
{
string tmp4; //命令返回值
try
{
//创建一个tcpListener对象,此对象主要是对给定端口进行侦听
tcpListener = new TcpListener(7981);
//开始侦听
tcpListener.Start();
//返回可以用以处理连接的Socket实例
socketForClient = tcpListener.AcceptSocket();
//如果返回值是"true",则产生的套节字已经接受来自远方的连接请求
if (socketForClient.Connected)
{
//已经和客户端成功连接
while (true)
{
//创建networkStream对象通过网络套节字来接受和发送数据
networkStream = new NetworkStream(socketForClient);
//从当前数据流中读取一行字符,返回值是字符串
streamReader = new StreamReader(networkStream);
string msg = streamReader.ReadLine();
tmp4 = mingling(msg);
streamWriter = new StreamWriter(networkStream);
//往当前的数据流中写入一行字符串
streamWriter.WriteLine(tmp4);
//刷新当前数据流中的数据
streamWriter.Flush();
}
}
}
catch { }
}
客户端: //发送消息
private void button1_Click(object sender, EventArgs e)
{
string tmp1 = listBox1.SelectedItem.ToString(); //主机名
string tmp2 = listBox2.SelectedItem.ToString(); //选择的命令
string tmp3 = "你好吗?"; //准备发送命令
string tmp4 = ""; //主机返回值 //开始正式发送
try
{
myclient = new TcpClient(tmp1, 7981);
}
catch
{
richTextBox1.AppendText(tmp1 + "没有连接到!");
return;
}
//创建networkStream对象通过网络套节字来接受和发送数据
networkStream = myclient.GetStream();
streamReader = new StreamReader(networkStream);
streamWriter = new StreamWriter(networkStream);
//开始发送
try
{
//往当前的数据流中写入一行字符串
streamWriter.WriteLine(tmp3);
//刷新当前数据流中的数据
streamWriter.Flush();
//从当前数据流中读取一行字符,返回值是字符串
tmp4 = streamReader.ReadLine();
//ListBox1.Items.Add("读取服务器端发送内容:" + s);
richTextBox1.AppendText(tmp1 + "返回内容:" + tmp4);
}
catch (Exception err)
{
richTextBox1.AppendText(tmp1 + "错误:" + err.ToString());
}
}
{
InitializeComponent();
//开始启动服务器
try
{
thread1 = new Thread(new ThreadStart(Listen));
thread1.Start();
}
catch
{
}
} //监听程序
private void Listen()
{
string tmp4; //命令返回值
try
{
//创建一个tcpListener对象,此对象主要是对给定端口进行侦听
tcpListener = new TcpListener(7981);
//开始侦听
tcpListener.Start();
//返回可以用以处理连接的Socket实例
socketForClient = tcpListener.AcceptSocket();
//如果返回值是"true",则产生的套节字已经接受来自远方的连接请求
if (socketForClient.Connected)
{
//已经和客户端成功连接
while (true)
{
//创建networkStream对象通过网络套节字来接受和发送数据
networkStream = new NetworkStream(socketForClient);
//从当前数据流中读取一行字符,返回值是字符串
streamReader = new StreamReader(networkStream);
string msg = streamReader.ReadLine();
tmp4 = mingling(msg);
streamWriter = new StreamWriter(networkStream);
//往当前的数据流中写入一行字符串
streamWriter.WriteLine(tmp4);
//刷新当前数据流中的数据
streamWriter.Flush();
}
}
}
catch { }
}
客户端: //发送消息
private void button1_Click(object sender, EventArgs e)
{
string tmp1 = listBox1.SelectedItem.ToString(); //主机名
string tmp2 = listBox2.SelectedItem.ToString(); //选择的命令
string tmp3 = "你好吗?"; //准备发送命令
string tmp4 = ""; //主机返回值 //开始正式发送
try
{
myclient = new TcpClient(tmp1, 7981);
}
catch
{
richTextBox1.AppendText(tmp1 + "没有连接到!");
return;
}
//创建networkStream对象通过网络套节字来接受和发送数据
networkStream = myclient.GetStream();
streamReader = new StreamReader(networkStream);
streamWriter = new StreamWriter(networkStream);
//开始发送
try
{
//往当前的数据流中写入一行字符串
streamWriter.WriteLine(tmp3);
//刷新当前数据流中的数据
streamWriter.Flush();
//从当前数据流中读取一行字符,返回值是字符串
tmp4 = streamReader.ReadLine();
//ListBox1.Items.Add("读取服务器端发送内容:" + s);
richTextBox1.AppendText(tmp1 + "返回内容:" + tmp4);
}
catch (Exception err)
{
richTextBox1.AppendText(tmp1 + "错误:" + err.ToString());
}
}
解决方案 »
- C# 学生信息维护,给类似的例子行么?
- .NET后台土登录问题
- listview 用上下键移动,用Enter选择
- 哪里有Programming Language Pragmatics Second Edition下载?
- AutoCompleteExtra.dll
- 各位大哥帮帮忙,有一个急手问题!关于调用父窗口方法属性问题!
- 如何检测计算机的串口!(C#)
- 如何实现让一个Label在一固定区域拖动?谢谢
- 关于一个Form的最基本的问题,来吧!
- 如何将DataGrid1中的数据打印出来,
- 用c#.net做的应用程序一定要在安装了.net framework的电脑上才能安装吗?
- c#弹出的messageBox怎么置于最前?
string tmp1 = listBox1.SelectedItem.ToString(); //主机名查一下主机名是否设置正确?
定义一个布尔
bool m_linked = false;
// 开启侦听后把m_connected变为true
while(m_linked)
{
断开链接的时候把m_connected变为flash
}
你的写法,服务器只能处理一个用户后,线程就停止了,并且在处理的时候,还会死掉(准确说是死循环了)。
服务器端按照下面的来写:
while(true)
{
aclient=tcpListener.AcceptSocket();//新客户
{
receive(); //你自己的业务功能
send();
}
}
在客户端:
在连接之后,也就是你的按钮按下之后,你的函数执行一次返回成功后,第二次执行到myclient赋值语句时,对于服务器来说,是第二个客户了,而此时服务器在那边死循环了!!所以不响应客户的连接请求!
{
if(myclient==null) //添加一句判断
myclient = new TcpClient(tmp1, 7981);
}
catch
{
richTextBox1.AppendText(tmp1 + "没有连接到!");
return;
}