0
我是新來的客戶端服務器編程在C#中。 我目前在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]);
}
}
}
}
感謝您的回答。這對基本的真正幫助:D – user3185757 2014-09-23 03:59:52