C#客户端服务器队列应用程序
本文关键字:应用程序 队列 服务器 客户端 | 更新日期: 2023-09-27 18:23:47
我对c#中的客户端-服务器编程很陌生。我目前正在c中创建一个简单的队列应用程序,为连接的每个客户端使用线程。有人能帮我拿密码吗?
这个代码的问题是,即使连接了更多的客户端,它也只能从一个客户端读取。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Server
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
static TcpListener tcpListener;
NetworkStream networkStream;
System.IO.StreamWriter streamWriter;
System.IO.StreamReader streamReader;
string[,] client = new string[999, 3];
int connectedclient = 0;
int queuecount = 0;
int[] peopleque = new int[999];
int quenumber = 0;
public void Listener()
{
Socket socketForClient = tcpListener.AcceptSocket();
string clientip = "";
if (socketForClient.Connected)
{
AddItem("Client:" + socketForClient.RemoteEndPoint + " now connected to server.");
client[connectedclient, 0] = socketForClient.RemoteEndPoint.ToString();
client[connectedclient, 2] = "active";
connectedclient++;
networkStream = new NetworkStream(socketForClient);
streamWriter = new System.IO.StreamWriter(networkStream);
streamReader = new System.IO.StreamReader(networkStream);
clientip = socketForClient.RemoteEndPoint.ToString();
while (true)
{
string theString = streamReader.ReadLine();
if (theString != null && theString != "" && theString != " ")
{
string Connection = socketForClient.RemoteEndPoint.ToString();
AddItem("Message received by client (" + Connection + ") : " + theString);
if (theString[0] == 'r')
{
for (int i = 0; i < connectedclient; i++)
{
if (client[i, 0] == socketForClient.RemoteEndPoint.ToString())
{
client[i, 1] = theString.Substring(1);
AddItem("Client " + socketForClient.RemoteEndPoint.ToString() + " is connected as kassa " + client[i, 1]);
}
}
}
if (theString[0] == 'q')
{
streamWriter.Write(theString);
streamWriter.Flush();
}
switch (theString)
{
case "exit":
string connectedip = socketForClient.RemoteEndPoint.ToString();
for (int i = 0; i < connectedclient; i++)
{
if (client[i, 0] == connectedip)
{
client[i, 0] = "";
client[i, 1] = "";
client[i, 2] = "";
if (connectedclient - 1 != 0)
{
connectedclient--;
client[i, 0] = client[connectedclient, 0];
client[i, 1] = client[connectedclient, 1];
client[i, 2] = client[connectedclient, 2];
client[connectedclient, 0] = "";
client[connectedclient, 1] = "";
client[connectedclient, 2] = "";
break;
}
break;
}
}
socketForClient.Disconnect(true);
socketForClient.Close();
break;
case "break":
connectedip = socketForClient.RemoteEndPoint.ToString();
for (int i = 0; i < connectedclient; i++)
{
if (client[i, 0] == connectedip)
{
client[i, 2] = "inactive";
AddItem("client " + socketForClient.RemoteEndPoint.ToString() + " is inactive");
break;
}
}
break;
case "empty":
for (int i = 0; i < connectedclient; i++)
{
if (client[i, 0] == socketForClient.RemoteEndPoint.ToString())
{
if (queuecount <= 0)
{
client[i, 2] = "empty";
AddItem("Client " + socketForClient.RemoteEndPoint.ToString() + " is empty");
}
else
{
streamWriter.WriteLine("q" + peopleque[0] + "t" + client[i, 1]);
peopleque[0] = 0;
for (int j = 0; j < quenumber - 1; j++)
{
peopleque[j] = peopleque[j + 1];
}
peopleque[queuecount] = 0;
queuecount--;
streamWriter.Flush();
}
}
}
break;
case "new":
quenumber++;
bool found = false;
for (int i = 0; i < queuecount; i++)
{
if (client[i, 2] == "empty")
{
streamWriter.Write("q" + quenumber + "t" + client[i, 1]);
streamWriter.Flush();
found = true;
break;
}
}
if (found == false)
{
peopleque[queuecount] = quenumber;
queuecount++;
}
break;
}
if (theString == "exit")
break;
}
}
streamReader.Close();
networkStream.Close();
streamWriter.Close();
}
AddItem("client " + clientip + " Has Disconnected");
socketForClient.Close();
}
public void StartListening(int NumberOfClient)
{
tcpListener.Start();
for (int i = 0; i < NumberOfClient; i++)
{
Thread newThread = new Thread(new ThreadStart(Listener));
newThread.Start();
}
}
public MainWindow()
{
InitializeComponent();
}
private void AddItem(string item)
{
Application.Current.Dispatcher.Invoke(new Action(() =>
{
LogListener.Items.Add(item);
LogListener.SelectedIndex = LogListener.Items.Count - 1;
LogListener.ScrollIntoView(LogListener.Items[LogListener.Items.Count - 1]);
}));
}
private void StartBtn_Click(object sender, RoutedEventArgs e)
{
//tcpListener = new TcpListener(Convert.ToInt32(PortTxt.Text));
IPAddress ip = Dns.GetHostAddresses(Dns.GetHostName()).Where(address => address.AddressFamily == AddressFamily.InterNetwork).First();
tcpListener = new TcpListener(ip.MapToIPv4(), Convert.ToInt32(PortTxt.Text));
tcpListener.Start();
AddItem("************This is Server program************");
AddItem("This Computer IP Is : " + ip.MapToIPv4().ToString());
PortTxt.IsEnabled = false;
StartBtn.IsEnabled = false;
StartListening(200);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
try
{
streamWriter.WriteLine("Fuck");
streamWriter.Flush();
}
catch
{
Console.WriteLine("Exception reading from Server");
}
}
private void btnCheck_Click(object sender, RoutedEventArgs e)
{
for (int i = 0; i < connectedclient; i++)
{
AddItem(client[i, 0]);
}
}
}
}
您当前在具有相同TCP连接的同一端口上启动一组Listener
实例。这不会像你想象的那样奏效(正如你所注意到的)。诀窍是打开一个套接字并接受客户端。当客户端被接受时,您将生成一个处理通信的新线程。基本方案是:
- 创建
Socket
- 呼叫
BeginAcceptSocket
- 在
BeginAcceptSocket
的回调中,为连接的客户端生成一个新线程 - 再次调用
BeginAcceptSocket
以侦听新客户端