我有一个客户端(Windows应用程序)和服务器(类文件)都没有实现多线程。 所以现在我有一对一连接工作正常,但当第二个客户端尝试连接时没有任何反应,当我尝试通信它没有响应。
但我想要这个功能:
当第二个客户端尝试连接服务器时,应将状态回复为第二个客户端。我想把代码放在服务器中,通过检查服务器的状态来回复第二个客户端。
我怎样才能做到这一点?
提供以下完整代码以便更好地理解: 服务器代码
enum ServerStatus { Available, Busy };
static void Main(string[] args)
{
TcpListener tcplistener = null;
ServerStatus serverstatus = ServerStatus.Available;
try
{
tcplistener = new TcpListener(IPAddress.Parse("127.0.0.1"), 4000);
tcplistener.Start();
Console.WriteLine("Server socket started at 127.0.0.1 and port no: 4000");
Console.WriteLine("Server is " + serverstatus + " and waiting for a client to connect....");
while (true)
{
TcpClient tcpclient = tcplistener.AcceptTcpClient();
serverstatus = ServerStatus.Busy;
Console.WriteLine(" >> " + "New client connection started and server is " + serverstatus);
StreamReader streamreader = new StreamReader(tcpclient.GetStream());
StreamWriter streamwriter = new StreamWriter(tcpclient.GetStream());
String datafromclient = String.Empty;
String datatoclient = String.Empty;
while (!(datafromclient = streamreader.ReadLine()).Equals(String.Empty))
{
int number;
if (int.TryParse(datafromclient, out number))
{
datatoclient = (Convert.ToInt16(datafromclient) * Convert.ToInt16(datafromclient)).ToString();
Console.WriteLine("From client -> " + datafromclient + " To client -> " + datatoclient);
streamwriter.WriteLine(datatoclient);
streamwriter.Flush();
}
else if (datafromclient == "End connection")
{
streamreader.Close();
streamwriter.Close();
serverstatus = ServerStatus.Available;
Console.WriteLine("Server is back to " + serverstatus + " and waiting for a client to connect....");
break;
}
else
{
streamwriter.WriteLine("Number not valid.");
streamwriter.Flush();
}
}
}
}
catch (Exception exception)
{
Console.WriteLine(exception);
}
finally
{
if (tcplistener != null)
{
tcplistener.Stop();
}
}
客户端代码:
private void button1_Click(object sender, EventArgs e)
{
try
{
tcpclient = new TcpClient("127.0.0.1", 4000);
if (tcpclient != null)
{
label1.Text = "Connected to server";
textBox1.Enabled = true;
button1.Enabled = false;
button2.Enabled = true;
button3.Enabled = true;
streamreader = new StreamReader(tcpclient.GetStream());
streamwriter = new StreamWriter(tcpclient.GetStream());
}
}
catch (Exception exception)
{
MessageBox.Show(exception.Message);
}
}
private void button2_Click(object sender, EventArgs e)
{
int number;
if (int.TryParse(textBox1.Text, out number))
{
streamwriter.WriteLine(textBox1.Text);
streamwriter.Flush();
textBox2.Text = textBox2.Text + "To server -> " + textBox1.Text + " From server -> " + streamreader.ReadLine() + Environment.NewLine;
}
else
{
MessageBox.Show("Enter valid number.");
}
}
private void button3_Click(object sender, EventArgs e)
{
streamwriter.WriteLine("End connection");
streamwriter.Flush();
streamreader.Close();
streamwriter.Close();
tcpclient.Close();
label1.Text = "Disconnected to server";
textBox1.Text = "";
textBox2.Text = "";
textBox1.Enabled = false;
button1.Enabled = true;
button2.Enabled = false;
button3.Enabled = false;
}
答案 0 :(得分:2)
如果您的应用程序是单线程的,那么当一个线程正在执行其他操作时,您无法响应某些内容......
你有两个选择:
a)多线程,并且在忙碌状态下有一些其他线程响应 b)不要让你的线程处于热循环中:这很可能是你想做的事情