c# - C# 中服务器客户端应用程序的 UDP 数据报代码

标签 c# winforms sockets udp udpclient

当我尝试从客户端发送消息时,服务器无法接收该消息并打印它。谁能告诉我以下服务器客户端应用程序中的错误。

我创建了两个WinForm项目,一个是UDP服务器,另一个是UDP客户端。

在UDP服务器项目中,我创建了一个表单,其中包含一个名为richTextBox1的RichTextBox用于显示消息和一个名为btStart的按钮用于启动/停止监听。这是代码片段:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace UDPServer
{
public partial class Form1 : Form
{
    delegate void ShowMessageMethod(string msg);

    UdpClient _server = null;
    IPEndPoint _client = null;
    Thread _listenThread = null;
    private bool _isServerStarted = false;

    public Form1()
    {
        InitializeComponent();
    }
    private void serverMsgBox_Load(object sender, EventArgs e)
    {
        this.btStart.Text = "StartServer";
    } 

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void btStart_Click(object sender, EventArgs e)
    {
        if (_isServerStarted)
        {
            Stop();
            btStart.Text = "StartServer";
        }
        else
        {
            Start();
            btStart.Text = "StopServer";
        }

    }
    private void Start()
    {
        //Create the server.
        IPEndPoint serverEnd = new IPEndPoint(IPAddress.Any, 1234);
        _server = new UdpClient(serverEnd);
        ShowMsg("Waiting for a client...");
        //Create the client end.
        _client = new IPEndPoint(IPAddress.Any, 0);

        //Start listening.
        Thread listenThread = new Thread(new ThreadStart(Listening));
        listenThread.Start();
        //Change state to indicate the server starts.
        _isServerStarted = true;
    }

    private void Stop()
    {
        try
        {
            //Stop listening.
            listenThread.Join();
            ShowMsg("Server stops.");
            _server.Close();
            //Changet state to indicate the server stops.
            _isServerStarted = false;
        }
        catch (Exception excp)
        { }
    }

    private void Listening()
    {
        byte[] data;
        //Listening loop.
        while (true)
        {
            //receieve a message form a client.
            data = _server.Receive(ref _client);
            string receivedMsg = Encoding.ASCII.GetString(data, 0, data.Length);
            //Show the message.
            this.Invoke(new ShowMessageMethod(ShowMsg), new object[] { "Client:" + receivedMsg });
            //Send a response message.
            data = Encoding.ASCII.GetBytes("Server:" + receivedMsg);
            _server.Send(data, data.Length, _client);
            //Sleep for UI to work.
            Thread.Sleep(500);
        }
    }
    private void ShowMsg(string msg)
    {
        this.richTextBox1.Text += msg + "\r\n";
    }
}
}

在UDP客户端项目中,我还创建了一个表单,其中包含一个名为richTextBox1的RichTextBox用于输入或显示消息,以及一个名为btSend的按钮用于发送输入消息。您可以运行该项目的多个实例。服务器将处理所有正在运行的客户端。这是代码片段:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.Threading;

namespace UDPClient
{
public partial class Form1 : Form
{
    UdpClient _server = null;
    IPEndPoint _client = null;

    public Form1()
    {
        InitializeComponent();
    }



    private void Form1_Load(object sender, EventArgs e)
    {

    }
   private void serverMsgBox_Load(object sender, EventArgs e)
    {
        //Get the server.
        _server = new UdpClient("127.0.0.1", 16000);
        //Create a client.
        _client = new IPEndPoint(IPAddress.Any, 0);
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        try
        {
            _server.Close();
        }
        catch (Exception s)
        { 
        }
    }

    private void btSend_Click(object sender, EventArgs e)
    {
        try
        {
            //Send the input message.
            string text = this.richTextBox1.Text;
            _server.Send(Encoding.ASCII.GetBytes(text), text.Length);
            //Receive the response message.
            byte[] data = _server.Receive(ref _client);
            string msg = Encoding.ASCII.GetString(data, 0, data.Length);
            //Show the response message.
            this.richTextBox1.Text = msg;
        }
        catch (Exception exp)
        { 

        }
    }

}
}

最佳答案

您尚未设置目的地。您需要使用 UdpClient.Connect使用前UdpClient.Send(Byte[], Int32)或使用UdpClient.Send(Byte[], Int32, IPEndPoint) .

关于c# - C# 中服务器客户端应用程序的 UDP 数据报代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10076658/

相关文章:

python - python应用程序中不可靠的RTT问题

android - 跨平台套接字库 - Android 和 IOS

python - 在 python 中使用套接字建立 IPv6 连接

c# - 如何使用 sqlmetal 生成内部(非公共(public))数据上下文

c# - Azure 移动服务 - UpdateAsync 不会更新所有字段

c# - SynchronizationContext.Current 在主线程上为空

c# - 如何将文本转换为日期?

c# - 有没有办法对 for 循环进行编码,使其不会在序列中递增?

c# - 单元测试的模型验证仅适用于字符串

c# - 按带小数的字母数字排序列表