為不影響 UI 回應,將監聽、接受連線、收發資料放入獨立執行緒處理。
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Net.Sockets;
using System.IO;
using System.Threading;
using System.Net;
public class Form1 : Form
{
private ListBox ListBox1;
private Button button1, button2;
private Label label1;
private TextBox textBox1;
private Socket socketForClient;
private NetworkStream networkStream;
private TcpListener tcpListener;
private StreamWriter streamWriter;
private StreamReader streamReader;
private Thread _thread1;
private Container components = null;
public Form1() { InitializeComponent(); }
protected override void Dispose(bool disposing)
{
if (disposing && components != null) components.Dispose();
base.Dispose(disposing);
}
private void InitializeComponent()
{
label1 = new Label(); button2 = new Button(); button1 = new Button();
ListBox1 = new ListBox(); textBox1 = new TextBox();
SuspendLayout();
label1.Location = new Point(8, 168); label1.Name = "label1";
label1.Size = new Size(120, 23); label1.TabIndex = 3; label1.Text = "回饋用戶端訊息:";
Controls.Add(button1); Controls.Add(textBox1); Controls.Add(label1);
Controls.Add(button2); Controls.Add(ListBox1);
MaximizeBox = false; MinimizeBox = false;
Name = "Form1"; Text = "C# 網路程式伺服器端!";
Closed += new EventHandler(Form1_Closed);
ResumeLayout(false);
}
private void Listen()
{
tcpListener = new TcpListener(1234);
tcpListener.Start();
socketForClient = tcpListener.AcceptSocket();
try
{
if (socketForClient.Connected)
{
ListBox1.Items.Add("已成功連接用戶端!");
while (true)
{
networkStream = new NetworkStream(socketForClient);
streamReader = new StreamReader(networkStream);
string msg = streamReader.ReadLine();
ListBox1.Items.Add("收到用戶端訊息:" + msg);
streamWriter = new StreamWriter(networkStream);
if (textBox1.Text != "")
{
ListBox1.Items.Add("回饋用戶端:" + textBox1.Text);
streamWriter.WriteLine(textBox1.Text);
streamWriter.Flush();
}
}
}
}
catch (Exception ex) { MessageBox.Show(ex.ToString()); }
}
static void Main() { Application.Run(new Form1()); }
private void button1_Click(object sender, EventArgs e)
{
ListBox1.Items.Add("服務已啟動!");
_thread1 = new Thread(new ThreadStart(Listen));
_thread1.Start();
}
private void button2_Click(object sender, EventArgs e)
{
networkStream.Close(); streamReader.Close(); streamWriter.Close();
_thread1.Abort(); tcpListener.Stop();
socketForClient.Shutdown(SocketShutdown.Both);
socketForClient.Close();
}
private void Form1_Closed(object sender, EventArgs e)
{
networkStream.Close(); streamReader.Close(); streamWriter.Close();
_thread1.Abort(); tcpListener.Stop();
socketForClient.Shutdown(SocketShutdown.Both);
socketForClient.Close();
}
}