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
- 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.
- Lesen und Schreiben im Netzwerk‑Stream
stream.Write(Byte‑Array, Startposition, Länge):Daten sendenstream.Read(Puffer‑Array, Startposition, maximale Leselänge):Daten empfangen, gibt die tatsächlich gelesene Byte‑Anzahl zurück
- Hinweise zur Kodierung
Die Beispielcodes verwendenEncoding.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