Tout d'abord, je m'excuse au cas où une question comme celle-ci existe, j'ai cherché sur Google et lu les questions qui peuvent avoir ma réponse mais je ne l'ai pas trouvée. J'ai le code serveur suivant:

private void StartServer()
{
    try
    {
        sSocket = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
        sSocket.SetSocketOption(SocketOptionLevel.IPv6, (SocketOptionName)27, 0);
        sSocket.Bind(new IPEndPoint(IPAddress.Any, 6666));
        sSocket.Listen(0);
        sSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.Message, "Server", MessageBoxButton.OK, MessageBoxImage.Error);
    }
}

private void AcceptCallback(IAsyncResult ar)
{
    try
    {
        cSocket = sSocket.EndAccept(ar);
        buffer = new byte[cSocket.ReceiveBufferSize];
        cSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
        sSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.Message, "Server", MessageBoxButton.OK, MessageBoxImage.Error);
    }
}

private void ReceiveCallback(IAsyncResult ar)
{
    try
    {
        int received = cSocket.EndReceive(ar);

        if(received == 0)
        {
            return;
        }

        Array.Resize(ref buffer, received);
        text = Encoding.ASCII.GetString(buffer);
        DisplayText(text);
        cSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Server", MessageBoxButton.OK, MessageBoxImage.Error);
    }
}

private void DisplayText(string text)
{
    Dispatcher.BeginInvoke(new Action(delegate
    {
        textBox.Text += ">> " + text + "\r\n" + "\r\n";
    }));
}

Et le code client suivant:

private void connect()
{
    try
    {
        cSocket = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
        cSocket.SetSocketOption(SocketOptionLevel.IPv6, (SocketOptionName)27, 0);
        cSocket.BeginConnect(new IPEndPoint(IPAddress.Parse("192.168.1.2"), 6666), new AsyncCallback(ConnectCallback), null);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Registracija", MessageBoxButton.OK, MessageBoxImage.Error);
    }
}

private void ConnectCallback(IAsyncResult ar)
{
    try
    {
        cSocket.EndConnect(ar);
        buffer = Encoding.ASCII.GetBytes("sendstuff");
        cSocket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendCallBack), null);
    }
    catch (SocketException) { }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Registracija", MessageBoxButton.OK, MessageBoxImage.Error);
    }
}

private void SendCallBack(IAsyncResult ar)
{
    cSocket.EndSend(ar);
}

OOXML peut être intimidant au début. http://officeopenxml.com/anatomyofOOXML.php a quelques bons exemples. Chaque fois que vous êtes confus, décompressez le docx et parcourez le contenu pour voir comment c'est fait.

0
snorkle213 4 janv. 2016 à 22:05

2 réponses

Meilleure réponse

Et cSocket.BeginSend là où vous appelez DisplayText? Évidemment, pour pouvoir utiliser BeginSend, vous auriez besoin de mettre le texte dans un tampon. Il existe différentes manières de le faire efficacement, mais cela sort du cadre de cette réponse.

Mais si vous attendez des données structurées telles que des chaînes séparées par des caractères de retour à la ligne, il vaut mieux utiliser StreamReader.ReadLine. Si la structure est plus compliquée, vous devrez effectuer vous-même l'analyse à partir du tampon. Vous devez donc consommer un caractère du tampon, voir si vous avez suffisamment de données, sinon continuer à consommer jusqu'à ce que le tampon soit vide. Lorsque le tampon est vide, vous devez le remplir à nouveau en appelant BeginReceive. Lorsque vous avez suffisamment de données à traiter, renvoyez une réponse en utilisant BeginSend ou l'une des fonctions d'écriture de flux.

La programmation réseau n'est pas une tâche facile, vous devriez consulter un exemple de code serveur / client sur Internet et les comprendre à fond. Enfin, je vous suggère d'utiliser les sucres syntaxiques await / async.

0
mostruash 4 janv. 2016 à 19:30

Quand il s'agit de chaînes envoyées dans les deux sens à l'aide de flux, j'utilise un StreamReader et un StreamWriter comme ceci:

Côté serveur

using (var reader = new StreamReader(theStream))
{
    string message = reader.ReadLine();

    // Or in an async method
    string message = await reader.ReadLineAsync();
}

Côté client

using (var writer = new StreamWriter(theStream))
{
    writer.WriteLine(theMessage);

    // Or in an async method
    await writer.WriteLineAsync(theMessage);
}

Remarque: Puisque vous utilisez TCP, vous pouvez obtenir un NetworkStream à partir d'un socket TCP en utilisant new NetworkStream(theSocket).

0
Philippe Paré 4 janv. 2016 à 19:19