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) { // haetaan tämän koneen osoite. Voitaisiin myös suoraan käyttää osoitetta 127.0.0.1 System.Net.IPAddress address = Dns.GetHostEntry("").AddressList[0]; // varmistetaan, että käytetään IPV4-osoitetta eikä vahingossa IPV6:sta foreach (System.Net.IPAddress item in Dns.GetHostEntry("").AddressList) { if (item.AddressFamily == AddressFamily.InterNetwork) { address = item; break; } } TcpListener server = new TcpListener(address, port); server.Start(); server.BeginAcceptTcpClient(new AsyncCallback(serverCallBack), server); listBoxServer.Items.Add("Käynnistetään palvelin osoitteessa " + address.ToString() + " " + 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 System.Net.IPAddress host = Dns.GetHostEntry("").AddressList[0]; // varmistetaan, että käytetään IPV4-osoitetta eikä vahingossa IPV6:sta foreach (System.Net.IPAddress item in Dns.GetHostEntry("").AddressList) { if (item.AddressFamily == AddressFamily.InterNetwork) { host = item; break; } } client.BeginConnect(host, port, new AsyncCallback(clientCallBack), client); } catch (SocketException err) { MessageBox.Show(err.ToString()); 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; } } }