Я хочу поболтать. Сервер выполнен в консольном приложении, а клиент сделан в winforms.Клиент, не получающий данные от многопоточности сервера
В клиенте я пишу псевдоним и подключаюсь к серверу. Сервер получает имя от клиента. Я добавляю всех клиентов, которые подключаются к серверу в списке словарей с именем (строка) и (TcpClient) Socket. После этого я хочу отправить каждому клиенту список клиентов.
При отладке на сервере сокеты отображаются с Ошибка DualMode, EnableBroadcast. В клиенте, когда я должен получить список, он останавливается и ничего не делает.
Сервер
namespace MyServer
{
class MyServer
{
public Dictionary<string, TcpClient> clientList = new Dictionary<string, TcpClient>();
TcpListener server = null;
NetworkStream stream = null;
StreamReader streamReader = null;
StreamWriter streamWriter = null;
TcpClient clientSocket;
String messageReceived;
int number_clients = 0;
public MyServer(TcpClient clientSocket_connect)
{
stream = clientSocket_connect.GetStream();
streamReader = new StreamReader(stream);
streamWriter = new StreamWriter(stream);
receiveMessage(clientSocket_connect); // receive messages
}
public MyServer()
{
Thread thread = new Thread(new ThreadStart(run));
thread.Start();
}
public void receiveMessage(TcpClient client_Socket)
{
messageReceived = streamReader.ReadLine();
if (messageReceived.Substring(messageReceived.Length - 4) == "user")
{
String name = messageReceived.Substring(0, messageReceived.Length - 4);
bool found = false;
foreach (var namefound in clientList.Keys)
{
if (namefound == name)
{
found = true;
streamWriter.WriteLine("The user already exists");
streamWriter.Flush();
}
}
if (!found)
{
//show who's connected
Console.WriteLine(name + " is online");
number_clients++;
clientList.Add(name, client_Socket);
//send to client clientlist
String send = null;
foreach (var key in clientList.Keys)
{
send += key + ".";
}
foreach (var value in clientList.Values)
{
TcpClient trimitereclientSocket = value;
if (trimitereclientSocket != null)
{
NetworkStream networkStream = trimitereclientSocket.GetStream();
StreamWriter networkWriter = new StreamWriter(networkStream);
networkWriter.WriteLine(send + "connected");
networkWriter.Flush();
}
}
}
}
}
void run()
{
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
server = new TcpListener(ipAddress, 8000);
server.Start();
Console.WriteLine("Server started!");
while (true)
{
clientSocket = server.AcceptTcpClient();
new MyServer(clientSocket);
}
}
}
static void Main(string[] args)
{
MyServer server = new MyServer();
}
}
Client
namespace MyClient
{
class MyClient
{
List<string> clientList = new List<string>();
TcpClient client = null;
NetworkStream stream = nul
l;
StreamReader streamReader = null;
StreamWriter streamWriter = null;
bool connected;
String received_message;
public MyClient()
{
client = new TcpClient("127.0.0.1", 8000);
stream = client.GetStream();
streamReader = new StreamReader(stream);
streamWriter = new StreamWriter(stream);
}
public void sendClientName(String name)
{
streamWriter.WriteLine(Convert.ToString(name));
streamWriter.Flush();
}
public List<ClientName> receiveClientList()
{
List<ClientName> val = new List<ClientName>();
string name = Convert.ToString(streamReader.ReadLine());
if (name.Substring(0, name.Length - 9) == "connected")
{
ClientName client = new ClientName();
client.Nume = name;
val.Add(client);
}
return val;
}
}
}
Клиент Форма
public partial class Form1 : Form
{
MyClient client = new MyClient();
public Form1()
{
InitializeComponent();
Thread receiveClients = new Thread(new ThreadStart(getMessages));
}
private void btnConnect_Click(object sender, EventArgs e)
{
client.sendClientName(txtNickname.Text + "user");
}
public void getMessages()
{
while (true)
{
lbClientsConnected.Items.Add(client.receiveClientList());
}
}
}
В настоящее время, поскольку ваш сервер, похоже, использует только один «StreamReader», сообщения будут получены только от последнего клиента. Вы должны создать пользовательский класс, который добавляется в словарь, который содержит команды «TcpClient», «StreamReader»/«... Writer» и «NetworkStream» клиента. –
Основная проблема заключается в том, что для каждого клиента создается новый экземпляр объекта сервера. Все клиентские сообщения могут быть получены, но a) только один клиент за раз, b) после того, как была получена первая строка текста одного клиента, этот клиент никогда не получает от него, и c) каждый клиент не знает ни о каком другом. Я ничего не вижу в коде, который явно объясняет сообщенную ошибку (которая в любом случае описывается только смутно).Я согласен с предыдущим комментарием, что вам нужно исправить код, чтобы один объект отслеживал всех клиентов; текущий дизайн принципиально нарушен. –