c# はソケット UDP ポートをリッスンするスレッドを開始します。ネットワーク カード リーダーからカード読み取りデータを受信した後、ポートは UI インターフェイスを更新して受信したデータを表示し、データ パケット情報を解析して表示テキストをカード リーダーに送信します。 、カードリーダーを駆動して、音声とビープ音のプロンプトをブロードキャストし、リレースイッチをオンにし、その他の操作を行います。
この例では、デバイスの紹介を使用します。
1. カードをスワイプした後、UDP プロトコルを介して、カード番号、マシン番号、その他の情報を指定されたリモート サーバーの IP およびポートにアップロードします。
2. リモート サーバーから送信された表示テキスト、ブザー音、TTS 中国語音声ブロードキャスト、スイッチ リレー、その他のコマンドを受信して応答します。
.net は、CheckForIllegalCrossThreadCalls = false に設定すると、サブスレッドのメイン ウィンドウのコントロール値を強制的に更新して UI 表示を更新できることを示唆していますが、場合によっては表示情報の更新が間に合わず、表示が崩れる場合があります。質問ですが、一部のデータでは、Microsoft は、この種のサブスレッドを使用して UI 表示を強制的に更新することを推奨していません。デリゲート メソッドを使用して更新することを強くお勧めします。 UI 表示 コードは次のとおりです。
デリゲートと転送パラメータを定義します。
delegate void Update1(string text1, byte[] bytes, int byteslen); //UDP端口侦听线程内解析接收到的数据并更新UI委拖
delegate void Update2(string text1, string msg); //UDP端口侦听线程内更新UI委拖
复制代码
Socket Udp リスニング ポートを開き、リスニング スレッドを開始します。
private void StartListener()
{
IPEndPoint LocalPoint;
PortNumber = Convert.ToInt32(textBox23.Text);
while (!ready)
{
try
{
LocalPoint = new IPEndPoint(IPAddress.Parse(localIp), PortNumber);
ListenerSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
ListenerSock.Bind(LocalPoint);
ListenerThre = new Thread(new ThreadStart(ThrListener));
ListenerThre.Start();
ready = true;
}
catch
{
ListenerSock.Close();
ready = false;
MessageBox.Show("有其它应用程序占用了 " + PortNumber.ToString() + " ,请检查并关闭此应用后再打开本程序", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
System.Environment.Exit(0); //这是最彻底的退出方式,不管什么线程都被强制退出,把程序结束的很干净。
}
}
}
public void ThrListener()
{
while (ready)
{
try
{
EndPoint RemotePoint = new IPEndPoint(System.Net.IPAddress.Any, 0);
byte[] bytes = new byte[1024];
int NumGet = ListenerSock.ReceiveFrom(bytes, ref RemotePoint);
RemoteIPoint = (IPEndPoint)RemotePoint; //获取数据包来源IP及端口,原路回应
string dispstr = DateTime.Now.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss") + (" FromIP:" + Convert.ToString(RemotePoint) + " ").Substring(0, 30) + "Data:";
this.BeginInvoke(new Update1(EditUi1), dispstr, bytes, NumGet); //通过委托传送参数显示接收到的数据包,并根据情况回应设备
}
catch (Exception ex)
{
this.BeginInvoke(new Update2(EditUi2), DateTime.Now.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss") + " ", ex.Message); //通过委托传送参数显示接收到的数据
}
}
}
复制代码
UI 表示を更新するデリゲート
private void EditUi1(string text1, byte[] buf, int buflen) //委任による UI の更新、配列転送パラメータ
{
int i;
string recestr = "";//受信データ表示
for (i = 0; i < buflen; i++)
{ recestr = recestr + buf[i].ToString("X2") + " "; } ListItemAdd(text1 + recestr); } private void EditUi2(string text1, string Msg ) //委任を通じて UI を更新、文字列転送パラメータ{ ListItemAdd(text1 + Msg); }