1.UIインターフェース設定
1. Click()イベントを使用した3つのボタンコントロール。
2. 3つのGroupBoxコントロールは、サーバーなどの特定の領域に文字を表示できます。
3. 2つのRichTextBoxコントロールを使用して、入力データと受信データを表示します。
4.データ処理を受信するために使用されるタイマーコントロール
次に、サーバー実装コード
1.関連変数
//定义的类内变量
private TcpListener Listener;
private Socket SocketClient;
private NetworkStream NetStream;
private StreamReader ServerReader;
private StreamWriter ServerWriter;
private Thread Thread;
2.コアコード
2.1スレッド機能の実行
public void TCPListener()
{
//在这里填入你的ip地址
this.Listener = new TcpListener(IPAddress.Parse("192.168.31.62"), 8000);
Listener.Start();
button1.Enabled = false;
this.Text = "服务器正在运行中。。。";
while (true)
{
try
{
SocketClient = Listener.AcceptSocket(); //等待客户端的socket
NetStream = new NetworkStream(SocketClient); //有客户端连接成功后,创建网络流
ServerReader = new StreamReader(NetStream); //读数据
ServerWriter = new StreamWriter(NetStream); //写数据
}
catch
{
}
}
}
この関数はスレッドの実行関数であり、クライアントのソケット接続を常に待機してデータを受信します。
この関数は、ボタンが押された後に新しいスレッドを割り当て、ボタンが押された後にロックされます。つまり、サーバーは1つのスレッドを実行するだけでよく、クライアントはサーバーに接続するために複数のスレッドを実行できます。
2.2受信機能
public void GetMessage()
{
//网络流不为空并且有可用数据
if (NetStream != null && NetStream.DataAvailable)
{
richTextBox1.AppendText(DateTime.Now.ToString());//显示时间
richTextBox1.AppendText(" 客户端说:\n");
richTextBox1.AppendText(ServerReader.ReadLine() + "\n");
//设置下拉框
richTextBox1.SelectionStart = richTextBox1.Text.Length;
richTextBox1.Focus();
richTextBox2.Focus();
}
}
この関数は、タイマーの割り込みトリガー関数で実行され、ネットワークストリームにデータがある場合、受信ボックスコントロールに出力します。
3.キートリガー機能
3.1サーバーに接続する
private void button1_Click(object sender, EventArgs e)
{
this.Thread = new Thread(new ThreadStart(TCPListener));
this.Thread.Start();
}
スレッドを開始し、スレッド実行関数をTCPListener()に設定します。特定の関数は、2.1にあります。
3.2データの送信
private void button3_Click(object sender, EventArgs e)
{
try
{
if (richTextBox2.Text.Trim() != "")
{
//信息写入流
ServerWriter.WriteLine(richTextBox2.Text);
ServerWriter.Flush();
//显示在文本框上。
richTextBox1.AppendText(DateTime.Now.ToString());
richTextBox1.AppendText(" 服务器说:\n");
richTextBox1.AppendText(richTextBox2.Text + "\n");
richTextBox2.Clear();
//滚动条
richTextBox1.SelectionStart = richTextBox1.Text.Length;
richTextBox1.Focus();
richTextBox2.Focus();
}
else
{
MessageBox.Show("信息不能为空!", "服务器消息", MessageBoxButtons.OK, MessageBoxIcon.Information);
richTextBox2.Focus();
return;
}
}
catch
{
MessageBox.Show("客户端连接失败……", "服务器消息", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
ユーザーが[送信]をクリックすると、テキストボックスに入力され、メッセージ受信ボックスに表示されたデータに従ってクライアントに送信されます。
3.3クリアデータ
private void button2_Click(object sender, EventArgs e)
{
richTextBox1.Clear();
}
受信ボックスのデータをクリアします。
4.その他のモジュール
4.1コンストラクター
public Form1()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
}
4.2フォーム関連のイベント
private void Form1_Load(object sender, EventArgs e)
{
this.richTextBox1.ReadOnly = true; //只读
this.timer1.Enabled = true; //定时器使能
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult dr = MessageBox.Show("关闭服务器将无法接收到来自客户端的数据,你确定要关闭吗?", "服务器信息", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (dr == DialogResult.Yes)
{
Listener.Stop();
this.Thread.Abort();
e.Cancel = false;
}
else
{
e.Cancel = true;
}
}
フォームのイベント機能では、いくつかの初期化操作を実行し、フォームを閉じるときにソケットとスレッドを閉じることができます。そうしないと、異常なエラーが発生します。
詳しくは私のブログをチェックしてみてください
4.3タイマーイベント
private void timer1_Tick(object sender, EventArgs e)
{
//接收数据,处理数据
GetMessage();
}
データ受信関数GetMessage()を呼び出して、受信データを継続的に処理します。
第三に、クライアント実装コード
1.説明する
クライアントコードの実装はサーバーに似ていますが、サーバーに接続するためにIPとポートを選択する必要があります。
** PS:サーバーとクライアントのコードは同じLANで実行されます。つまり、同じルーターまたはホットスポットを使用し、ipconfigを使用してコンソールにIPを表示し、関連する場所を入力します。
2.コアコード
public void GetConn()
{
CheckForIllegalCrossThreadCalls = false;
while (true)
{
try
{
TcpClient = new TcpClient(textBox1.Text.Trim(), Convert.ToInt32(textBox2.Text.Trim()));
Stream = TcpClient.GetStream();
//创建读写流
ClientReader = new StreamReader(Stream);
ClientWriter = new StreamWriter(Stream);
textBox1.Enabled = false;
button1.Enabled = false;
this.Text = "客户端 " + "与" + textBox1.Text.Trim() + "连接成功!";
return;
}
catch (Exception e)
{
textBox1.Enabled = true;
button1.Enabled = true;
MessageBox.Show(e.ToString());
return;
//MessageBox.Show("连接失败!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
この関数は、TcpClientクラスを使用したクライアントのスレッド実行関数です。
残りはサーバーとほぼ同じです。サーバーを理解した後、クライアントの作成は実際には画像を検索する過程にあります。
それでもわからない場合は、ここをクリックしてください。アップロードしたリソースとプロジェクト全体を以下に示します。
皆さんが幸せに学べることを願っています!