iT邦幫忙

0

(更新2022/10/24 08:30) C# Socket 與 Thread 的疑問

  • 分享至 

  • xImage

有個問題是 如果客戶端 同時送出訊息給我 會造成我伺服端 window from 當掉強制關閉

同時送出訊息給我 是要 兩個同時點擊 如果差一點點就不會當掉

(更新2022/10/24 08:30)

客戶端有兩台Android平板 使用自製的APP 用Xamrain開發的
如果這兩台客戶端平板 同時用聊天訊息傳給我(按下送出按鈕) 時
我電腦上的 window from就會跳出錯誤訊息並關閉

該如何解決這個問題呢??

看更多先前的討論...收起先前的討論...
iT邦新手 4 級 ‧ 2022-10-23 12:03:51 檢舉
為啥伺服器端需要點擊訊息?是手動還是自動點擊?
小魚 iT邦大師 1 級 ‧ 2022-10-23 19:25:41 檢舉
不大懂, 不過可以試試lock?
已更新
rofellos iT邦新手 2 級 ‧ 2022-10-24 12:06:46 檢舉
所以那個錯誤呢?是甚麼
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
JamesDoge
iT邦高手 1 級 ‧ 2023-01-06 03:58:37
最佳解答

可以使用訊息佇列的概念來處理客戶端 同時送出訊息的問題
這樣,當客戶端同時送出訊息時,所有的請求都會被先加入佇列,再依序處理。

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Collections.Generic;

namespace Server
{
    class Program
    {
        // 建立訊息佇列
        static Queue<string> messageQueue = new Queue<string>();

        static void Main(string[] args)
        {
            // 建立處理訊息佇列的執行緒
            Thread messageQueueThread = new Thread(ProcessMessageQueue);
            messageQueueThread.Start();

            // 建立伺服器端的 Socket
            IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 8080);
            Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            serverSocket.Bind(endPoint);
            serverSocket.Listen(10);

            Console.WriteLine("伺服器已啟動,等待客戶端連接...");

            // 等待客戶端連接
            Socket clientSocket = serverSocket.Accept();
            Console.WriteLine("客戶端已連接");

            // 接收客戶端訊息
            while (true)
            {
                byte[] buffer = new byte[1024];
                int received = clientSocket.Receive(buffer);
                string receivedMessage = Encoding.UTF8.GetString(buffer, 0, received);

                // 將收到的訊息加入訊息佇列
                messageQueue.Enqueue(receivedMessage);
            }
        }

        // 處理訊息佇列的方法
        static void ProcessMessageQueue()
        {
            while (true)
            {
                // 取出並處理佇列中的第一個訊息
                string message = messageQueue.Dequeue();
                HandleMessage(message);
            }
        }

        // 處理訊息的方法
        static void HandleMessage(string message)
        {
            // 在這裡處理訊息
            Console.WriteLine("收到訊息:" + message);
        }
    }
}

我要發表回答

立即登入回答