<quote="1282116">Spróbuj może coś takiego:
//w kodzie buttonClickConnect, ns to pole klasy typu NetworkStream
ns = client.GetStream();
//w backgroundWorder2 daj coś takiego:
byte[] msg = Encoding.ASCII.GetBytes("jakas wiadomosc");
ns.Write(msg,0,msg.Leght);
Zastosowałem w tych miejscach: ( public NetworkStream ns dalem na początku klasy )
private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e) //sending message, here error probably
{
if (client.Connected)
{
byte[] msg = Encoding.ASCII.GetBytes("jakas wiadomosc");
ns.Write(msg, 0, msg.Length);<-----------@@@@@@@@@@@@@@@@@@@@@@@@ TUTAJ DAŁEM
//STW.WriteLine(text_to_send); <------ to zakomentowałe
}
else
oraz:
private void buttonClickConnect(object sender, EventArgs e)
{
client = new TcpClient();
IPEndPoint IP_End = new IPEndPoint(IPAddress.Parse("192.168.1.1"), int.Parse("13000"));
try
{
client.Connect(IP_End);
if (client.Connected)
{
textviewConversation.Text += "Connected to server" + "\n";
STR = new StreamReader(client.GetStream());
STW = new StreamWriter(client.GetStream());
STW.AutoFlush = true;
ns = client.GetStream(); <-----------@@@@@@@@@@@@@@@@@@@@@@@@ TUTAJ DAŁEM
worker1.RunWorkerAsync();
worker2.WorkerSupportsCancellation = true;
W kwestii logiki kodu hm... bazowałem na różnych źródłach tworząc tą aplikacje, nie mam dużego doświadczenia. Aplikacja działa na widnowsie to zostawiłem tak :)
Po zastosowaniu Twoich zmian wciąż to samo - nie działa, jednak mogę nadmienić dokładniej:
Klikam połącz, łączy się.
Wpisuje i wysyłam #1 wiadomość, nic sie nie dzieje
Wpisuje i wysyłam #2 wiadomość, i nagle przycina wypisuje że thread busy.
Sam jednak sygnał dochodzi do servera który wariuje, dostaje jak by dziesiątki wiadomosci pustych. I tam też crashuje że thread multi. Ciekawe zjawisko.
Mi się wydaje że ta wiadomość leci w cząstkach? temu tak dużo przychodzi na server powiadomień ale pustych wiadomości w stringu.
kod SERWERA na PC
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
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;
using System.Windows.Threading;
namespace serverDoWielu
{
public partial class MainWindow : Window
{
private List<TcpClient> listaClientow = new List<TcpClient>();
private List<StreamReader> listaSTR = new List<StreamReader>();
private List<StreamWriter> listaSTW = new List<StreamWriter>();
StreamReader STR;
StreamWriter STW;
private string received;
private String text_to_send;
public BackgroundWorker worker2;
public BackgroundWorker worker3;
int licznikClientow;
public MainWindow()
{
InitializeComponent();
worker2 = new BackgroundWorker();
worker2.DoWork += backgroundWorker2_DoWork;
worker3 = new BackgroundWorker();
worker3.DoWork += backgroundWorker3_DoWork;
worker2.WorkerSupportsCancellation = true;
}
private void button_Click(object sender, RoutedEventArgs e)
{
worker3.RunWorkerAsync();
}
private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
{
string wiadomosc = (string)e.Argument;
List<StreamWriter> tmp = new List<StreamWriter>(listaSTW);
foreach (var item in tmp)
{
item.WriteLine(wiadomosc);
}
worker2.CancelAsync();
}
private void backgroundWorker3_DoWork(object sender, DoWorkEventArgs e)
{
TcpListener listener = new TcpListener(IPAddress.Parse("192.168.1.1"), 13000);
// TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 13000);
licznikClientow = 0;
while (true)
{
listener.Start();
listaClientow.Add(new TcpClient()); // add new
listaClientow[licznikClientow] = listener.AcceptTcpClient(); //przypisujemy
listaSTR.Add(new StreamReader( listaClientow[licznikClientow].GetStream() ) ); // to read
listaSTW.Add(new StreamWriter( listaClientow[licznikClientow].GetStream() ) ); // to send
listaSTW[licznikClientow].AutoFlush = true; //clear
BackgroundWorker clientThread = new BackgroundWorker();
clientThread.WorkerSupportsCancellation = true;
clientThread.DoWork += new DoWorkEventHandler(clientThread_DoWork);
clientThread.RunWorkerAsync(licznikClientow);
licznikClientow++;
}
}
private void clientThread_DoWork(object sender, DoWorkEventArgs e)
{
int ktoryKlient = (int)e.Argument;
while (listaClientow[ktoryKlient].Connected)
{
try
{
received = "";
received = listaSTR[ktoryKlient].ReadLine();
Console.WriteLine("@@@@@@ "+received); <------------------------------------@@@@@@@@@@@@@@@@ To wypluwa w dziesiątkach @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
text_to_send = received;
if (text_to_send != "")
{
this.textBox.Dispatcher.Invoke(DispatcherPriority.Normal, (ThreadStart)delegate () { textBox.AppendText("->> " + text_to_send + "\n"); });
worker2.RunWorkerAsync(text_to_send);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
private void button1_Click(object sender, RoutedEventArgs e)
{
foreach (var item in listaSTW) // sending to all people
{
item.WriteLine(textBox1.Text);
}
}
}
}