Client‑Server‑Kommunikation

Grundprinzipien

Nach dem Aufbau einer TCP‑Verbindung werden Daten über den NetworkStream übertragen.
Im Netz können nur Byte‑Arrays byte[] versandt werden. Text muss zuerst in Bytes kodiert und nach Empfang wieder zu einer Zeichenkette dekodiert werden.

Die Übertragung ist nicht auf Text beschränkt. Auch Dateien und Bilder lassen sich in Byte‑Arrays umwandeln und übertragen. In diesem Abschnitt realisieren wir zunächst einen Text‑Chat.

Wichtige‑API‑Beschreibung

  1. Serverseite
    listener.AcceptTcpClient()
  • Blockierende Methode (Wartezustand): Der Thread hält an dieser Stelle an, bis ein Client eine Verbindung aufbaut;
  • Gibt ein TcpClient‑Objekt zurück, das diese Client‑Verbindung repräsentiert;
  • Mit tcpClient.GetStream() erhält man den Netzwerk‑Stream.
  1. Lesen und Schreiben im Netzwerk‑Stream
  • stream.Write(Byte‑Array, Startposition, Länge)Daten senden
  • stream.Read(Puffer‑Array, Startposition, maximale Leselänge)Daten empfangen, gibt die tatsächlich gelesene Byte‑Anzahl zurück
  1. Hinweise zur Kodierung
    Die Beispielcodes verwenden Encoding.Unicode (UTF‑16). Absender und Empfänger müssen die gleiche Kodierung nutzen, sonst entstehen Zeichensalat.

WinForms‑Server

Steuerelemente:
textBoxIP, textBoxPort, textBoxInfo (Nachrichten‑Anzeigefeld)

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Windows.Forms;

namespace TcpServer
{
    public partial class Form1 : Form
    {
        IPAddress ip;
        TcpListener listener;
        TcpClient tcpClient;

        public Form1()
        {
            InitializeComponent();
        }

        private void buttonStart_Click(object sender, EventArgs e)
        {
            ip = IPAddress.Parse(textBoxIP.Text);
            listener = new TcpListener(ip, Convert.ToInt32(textBoxPort.Text));
            listener.Start();

            textBoxInfo.Text = $"服务器启动-{DateTime.Now.ToShortTimeString()}\r\n" + textBoxInfo.Text;

            // 阻塞!主线程卡住
            tcpClient = listener.AcceptTcpClient();
            textBoxInfo.Text = $"连接成功-{DateTime.Now.ToShortTimeString()}\r\n" + textBoxInfo.Text;

            NetworkStream stream = tcpClient.GetStream();
            byte[] byteArray = new byte[1024];

            // 阻塞等待客户端发送消息
            int length = stream.Read(byteArray, 0, 1024);
            string receiveMessage = Encoding.Unicode.GetString(byteArray, 0, length);

            textBoxInfo.Text = $"接收到:{receiveMessage}-{DateTime.Now.ToShortTimeString()}\r\n" + textBoxInfo.Text;
        }
    }
}Code-Sprache: PHP (php)

WinForms‑Client

Steuerelemente:
textBoxIP, textBoxPort, textBoxInfo, textBoxInput (Eingabefeld)
buttonStart【Verbinden】, buttonSend【Senden】

using System;
using System.Net.Sockets;
using System.Text;
using System.Windows.Forms;

namespace TcpClientChat
{
    public partial class Form1 : Form
    {
        TcpClient tcpClient;

        public Form1()
        {
            InitializeComponent();
        }

        private void buttonStart_Click(object sender, EventArgs e)
        {
            tcpClient = new TcpClient();
            try
            {
                tcpClient.Connect(textBoxIP.Text, Convert.ToInt32(textBoxPort.Text));
                textBoxInfo.AppendText("连接成功!\r\n");
            }
            catch (Exception ex)
            {
                MessageBox.Show("连接失败-" + ex.Message);
            }
        }

        private void buttonSend_Click(object sender, EventArgs e)
        {
            string message = textBoxInput.Text;
            textBoxInfo.Text = $"发送“{message}”-{DateTime.Now.ToShortTimeString()}\r\n" + textBoxInfo.Text;

            NetworkStream stream = tcpClient.GetStream();
            byte[] byteArray = Encoding.Unicode.GetBytes(message);
            stream.Write(byteArray, 0, byteArray.Length);
        }
    }
}Code-Sprache: PHP (php)

Der obige Code realisiert die Nachrichtenübertragung zwischen Client und Server.

Client‑Server‑Kommunikation

Previous:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert