Hallo liebe Community,
Das ist mein erster versuch mit UWP (Universal) leider musste ich feststellen das das senden/empfangen nun nur noch Asynchron funktionier.
Mein Test Code (WPF) funktionierte Tadellos:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
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 SocketClient
{
/// <summary>
/// Interaktionslogik für MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public class LoggingView
{
public int ID { get; set; }
public string Time { get; set; }
public string Log { get; set; }
public SolidColorBrush Color { get; set; }
}
public static ObservableCollection<LoggingView> LogItems { get; set; }
public static int logid = 0;
public Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
public byte[] bytes = new byte[1024];
public MainWindow()
{
InitializeComponent();
try
{
LogItems = new ObservableCollection<LoggingView>();
LogListView.ItemsSource = LogItems;
AddLog("Starte Socket Server");
const int Port = 1234;
const string IPv4 = "100.1.2.21";
IPAddress ipo = IPAddress.Parse(IPv4);
IPEndPoint ipEo = new IPEndPoint(ipo, Port);
sock.Connect(ipEo);
// Prüfe ob eine Verbindung besteht?
if (sock.Connected)
{
AddLog("Verbunden -> " + IPv4 + ":" + Port.ToString());
}
}
catch (Exception ex)
{
AddLog(ex.ToString(), 3);
}
}
public static void AddLog(string Log, int Logtype = 1)
{
logid = LogItems.Count() + 1;
int r, g, b;
switch (Logtype)
{
case 1:
r = 212;
g = 212;
b = 212;
break;
case 2:
r = 255;
g = 255;
b = 0;
break;
case 3:
r = 255;
g = 69;
b = 0;
break;
default:
r = 212;
g = 212;
b = 212;
break;
}
LogItems.Add(new LoggingView() { ID = logid, Time = DateTime.Now.ToString("HH:mm:ss"), Log = Log, Color = new SolidColorBrush(Color.FromRgb((byte)Convert.ToInt32(r), (byte)Convert.ToInt32(g), (byte)Convert.ToInt32(b))) });
}
private void send_Click(object sender, RoutedEventArgs e)
{
if (!String.IsNullOrEmpty(textBox.Text))
{
try
{
AddLog("Sende Daten -> " + textBox.Text);
Byte[] bytesSent = Encoding.ASCII.GetBytes(textBox.Text);
// Lege ein Byte Array an für die zu emfangenden Daten
Byte[] bytesReceived = new Byte[1024];
int i = sock.Send(bytesSent, bytesSent.Length, SocketFlags.None);
Int32 bytes = sock.Receive(bytesReceived, bytesReceived.Length, 0);
string returndata = Encoding.ASCII.GetString(bytesReceived, 0, bytes);
//MessageBox.Show(returndata);
AddLog("Server Antwortet ->" + returndata);
textBox.Text = "";
textBox.Focus();
}
catch (Exception ex)
{
AddLog(ex.ToString(),3);
}
}
}
}
}
Leider kann ich aber mit dieser Vorlage:
https://msdn.microsoft.com/de-de/library/windows/apps/hh202858(v=vs.105).aspx
keine Daten vom Server empfangen, Daten werden aber an den Server gesendet.
Ich bekomme als Ausgabe: Operation Timeout
Weil er scheinbar bei diesen Code:
public string Receive()
{
string response = "Operation Timeout";
if (_socket != null)
{
SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
socketEventArg.RemoteEndPoint = _socket.RemoteEndPoint;
socketEventArg.SetBuffer(new Byte[MAX_BUFFER_SIZE], 0, MAX_BUFFER_SIZE);
socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate (object s, SocketAsyncEventArgs e)
{
if (e.SocketError == SocketError.Success)
{
response = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred);
response = response.Trim('\0');
}
else
{
response = e.SocketError.ToString();
}
_clientDone.Set();
});
_clientDone.Reset();
_socket.ReceiveAsync(socketEventArg);
_clientDone.WaitOne(TIMEOUT_MILLISECONDS);
}
else
{
response = "Socket is not initialized";
}
return response;
}
den Teil ab socketEventArg.Completed überspringt.
Ich bin auch schon seit 2 Stunden am googeln hab aber noch nichts gefunden.
Danke für eure Hilfe.
mfg: Acer
XAML - auch unter UWP - sollte immer mit dem MVVM Pattern umgesetzt werden.
Du mischt hier alles extrem.
[Artikel] Drei-Schichten-Architektur
Asynchrone Programmierung ist pflicht in Apps; das ist auch gut so.
Du musst die jeweils asynchronen Methoden verwendet.
Deine Ausgabe definierst Du doch selbst.
string response = "Operation Timeout";
Sehr wahrscheinlich wird eben der Timeout durch WaitOne() erreicht und bricht damit ab.
Kannste ja alles debuggen.
[Artikel] Debugger: Wie verwende ich den von Visual Studio?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
He danke du hast mich auf eine Idee gebracht,
hab den Fehler gefunden lag am Server.
mfg: Acer
p.s. noch schöne Ostern
Wärst du so gütig und würdest deine finale Lösung posten?
Wie es der Zufall will, kommen auch meine Streams nicht richtig an.
Der listener wird getriggert, ja, aber ich weiß nicht ob es an gesperrten Verbindungen im Netzwerk (eingeschränkte Rechte) oder an meinem Code liegt, da Debugging in diesem Context zu keiner Lösung geführt hat.
Danke.