using System; using System.Collections.Generic; using System.Linq; using System.Text; 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.Net; using System.Net.Sockets; using System.Net.Mime; using System.Threading; using System.Windows.Threading; using System.IO; namespace networkstream { /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window { TcpClient client; StreamReader sr; StreamWriter sw; int port = 9002; bool server_on = true; bool client_on = true; public MainWindow() { InitializeComponent(); } // käynnistetään palvelin private void button1_Click(object sender, RoutedEventArgs e) { IPHostEntry address = Dns.GetHostEntry(""); // haetaan tämän koneen osoite. Voitaisiin myös suoraan käyttää osoitetta 127.0.0.1 TcpListener server = new TcpListener(address.AddressList[0], port); server.Start(); server.BeginAcceptTcpClient(new AsyncCallback(serverCallBack), server); listBoxServer.Items.Add("Käynnistetään palvelin osoitteessa " + address.HostName + " " + port); } public void serverCallBack(IAsyncResult Ar) { TcpListener server = (TcpListener)Ar.AsyncState; TcpClient client = (TcpClient)server.EndAcceptTcpClient(Ar); ListBoxChanged(listBoxServer, "Yhteys on avattu osoitteesta " + client.Client.RemoteEndPoint.ToString()); NetworkStream ns = client.GetStream(); StreamReader sr = new StreamReader(ns); StreamWriter sw = new StreamWriter(ns); string viesti = "Sinut on yhdistetty testipalvelimeen"; sw.WriteLine(viesti); sw.Flush(); while(server_on) { string data; try { data = sr.ReadLine(); } catch (IOException) { // ListBoxChanged(listBoxServer, "Bummer"); break; } ListBoxChanged(listBoxServer, data); sw.WriteLine("Palvelin vastaa:" + data); sw.Flush(); Thread.Sleep(0); // annetaan muiden mahdollisesti odottavien threadien toimia välillä } ListBoxChanged(listBoxServer, "Yhteys katkaistu"); sw.Close(); sr.Close(); ns.Close(); } // tämä tarvitaan, että eri threadit pääsevät vaikuttamaan käyttöliittymään void ListBoxChanged(ListBox b, string e) { this.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => { b.Items.Add(e); })); } // tänne tullaan kun client saa yhteyden auki public void clientCallBack(IAsyncResult Ar) { ListBoxChanged(listBoxClient, "Yhdistetty palvelimeen" + client.Client.RemoteEndPoint.ToString()); NetworkStream ns = client.GetStream(); sr = new StreamReader(ns); sw = new StreamWriter(ns); sw.WriteLine("Heippa palvelin. Yhteys on nyt avattu"); sw.Flush(); // jäädään odottelemaan tavaraa palvelimelta while (client_on) { string data = sr.ReadLine(); ListBoxChanged(listBoxClient, data); // annetaan toiminta-aikaa myös muille Thread.Sleep(1000); } sr.Close(); sw.Close(); ns.Close(); client.Close(); } // yhdistetään palvelimeen private void button2_Click(object sender, RoutedEventArgs e) { try { client = new TcpClient(); // avataan asynkronisesti yhteys samassa koneessa olevaan palvelimeen client.BeginConnect(Dns.GetHostEntry("").AddressList[0], port, new AsyncCallback(clientCallBack), client); } catch (SocketException err) { return; } } // lähettää rivin palvelimelle private void button3_Click(object sender, RoutedEventArgs e) { sw.WriteLine(textBoxRivi.Text); sw.Flush(); textBoxRivi.Text = ""; } private void button4_Click(object sender, RoutedEventArgs e) { sw.WriteLine("Suljetaan yhteys"); sw.Flush(); client_on = false; } } }