由于某种原因无法使用套接字接收信息

Posted

技术标签:

【中文标题】由于某种原因无法使用套接字接收信息【英文标题】:Can't receive information using sockets for some reason 【发布时间】:2021-07-08 09:36:18 【问题描述】:

首先,我对套接字真的很陌生。如果我理解错了,我真的很抱歉。

我想在 windows.forms 中创建一个游戏,你可以使用它来检查谁的 cps(每秒点击次数)更高。你或你的朋友之一。我为游戏和菜单创建了 2 个用户控件。它看起来像这样。 菜单 menu usercontrol

游戏 game usercontrol

我也做了这件事来切换用户控件。

 Game game = new Game();
            game.Dock = DockStyle.Fill;
            this.Controls.Add(game);
            Controls.Remove(this);
            game.BringToFront();

它工作得很好。

下一步是为主机和正在连接的人(从现在开始连接)开始游戏。

我认为当主机收到消息“这里!”时创建设置为 true 的布尔值是个好主意

代码如下:

 localPort = int.Parse(textBox2.Text);
            remotePort = int.Parse(textBox3.Text);
            Game.gameStarted = true;

            iP = IPAddress.Parse(textBox1.Text);
 try
            
                sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

                string message = "Here!";

                byte[] data = Encoding.ASCII.GetBytes(message);
                Console.WriteLine(data);
                EndPoint endPoint = new IPEndPoint(iP, remotePort);
                Console.WriteLine(endPoint);
                sock.SendTo(data, endPoint);
            
            catch (Exception exc)
            
                Console.WriteLine(exc.ToString());
            
            finally
            
                Close();
            

            thread = new Thread(Game.Multiplayer);
            thread.Start();

为了得到消息:

Menu menu = new Menu();
            while (!gameStarted)
            
                try
                
                    IPEndPoint localIp = new IPEndPoint(IPAddress.Loopback, Menu.localPort);
                    menu.sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                    menu.sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
                    menu.sock.Bind(localIp);

                    Console.WriteLine("Waiting For Players...");
                    StringBuilder builder = new StringBuilder();
                    int bytes = 0;
                    byte[] data = new byte[256];

                    EndPoint remoteIP = new IPEndPoint(IPAddress.Loopback, 0);
                    do
                    
                        bytes = menu.sock.ReceiveFrom(data, ref remoteIP);
                        builder.Append(Encoding.ASCII.GetString(data, 0, bytes));
                    
                    while (menu.sock.Available > 0);

                    if (builder.ToString() == "Here!")
                    
                        Console.WriteLine("Game Started!");
                        gameStarted = true;
                    
                
                catch (Exception exc)
                
                    Console.WriteLine(exc.ToString());
                
                finally
                
                    Menu.Close();
                
            

它也完全可以正常工作。

没有接收或发送点击的问题。

这里是发送点击的代码(当你点击 button1 时会发生):

private void button1_Click(object sender, EventArgs e)
        
            Menu menu = new Menu();
            Game game = new Game();
            if (gameStarted)
            
                yourClicks += 1;
                textBox2.Text = yourClicks.ToString();

                try
                
                    menu.sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                    menu.sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

                    string message = yourClicks.ToString();
                    byte[] data = Encoding.ASCII.GetBytes(message);
                    EndPoint remotePoint = new IPEndPoint(Menu.iP, Menu.remotePort);
                    menu.sock.SendTo(data, remotePoint);
                
                catch (Exception exc)
                
                    Console.WriteLine(exc.ToString());
                
                finally
                
                    Menu.Close();
                
            
        

这里是为了接收点击:

if (gameStarted == true)
            
                menu = new Menu();
                game = new Game();

                while (true)
                
                    try
                    
                        IPEndPoint localIp = new IPEndPoint(IPAddress.Loopback, Menu.localPort);
                        menu.sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                        menu.sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
                        menu.sock.Bind(localIp);

                        Console.WriteLine("Counting Clicks!");
                        StringBuilder builder = new StringBuilder();
                        int bytes = 0;
                        byte[] data = new byte[256];

                        EndPoint remoteIP = new IPEndPoint(IPAddress.Loopback, 0);
                        do
                        
                            Console.WriteLine("Waiting for Clicks...");
                            bytes = menu.sock.ReceiveFrom(data, ref remoteIP);
                            builder.Append(Encoding.ASCII.GetString(data, 0, bytes));
                            Console.WriteLine(builder.ToString());
                        
                        while (menu.sock.Available > 0);
                        game.textBox1.Text = builder.ToString();
                    
                    catch (Exception exc)
                    
                        Console.WriteLine(exc.ToString());
                    
                    finally
                    
                        Menu.Close();
                    
                
            

这一切都发生在您点击“主机”或“连接”按钮时启动的线程中。

            thread = new Thread(Game.Multiplayer);
            thread.Start();

我希望你们帮助我。我不知道为什么它不起作用,因为它收到“这里!”绝对没问题,但根本没有收到点击。

【问题讨论】:

在你发送和接收点击的代码中,为什么每次都要初始化变量gamemenu @Sideways 没有这个就不行。你有什么想法,为什么我不能收到信息?看起来它正在发送但没有接收。我做错了什么? 我的意思是,如果您总是创建对象的新实例,那么存储在其他实例中的所有数据都将消失(至少看起来是这样)。您能否发布包括类定义在内的整个代码? @Sideways 我解决了我的问题 【参考方案1】:

答案很简单。您只需要在获得信息后关闭您的套接字。在使用我得到的信息后,我刚刚添加了 socket.Close(),一切正常。

【讨论】:

以上是关于由于某种原因无法使用套接字接收信息的主要内容,如果未能解决你的问题,请参考以下文章

由于某种原因无法使用更改方法的无线电输入

Fleck websocket 实现问题。无法使用套接字。发送

JavaScript:尝试使用由于某种原因无法运行的类函数

glStencilFunc 由于某种原因无法工作:(

classList.remove 和 .add 由于某种原因无法正常工作

GROUP CONCAT 由于某种原因无法正常工作