由于某种原因无法使用套接字接收信息
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();
我希望你们帮助我。我不知道为什么它不起作用,因为它收到“这里!”绝对没问题,但根本没有收到点击。
【问题讨论】:
在你发送和接收点击的代码中,为什么每次都要初始化变量game
和menu
?
@Sideways 没有这个就不行。你有什么想法,为什么我不能收到信息?看起来它正在发送但没有接收。我做错了什么?
我的意思是,如果您总是创建对象的新实例,那么存储在其他实例中的所有数据都将消失(至少看起来是这样)。您能否发布包括类定义在内的整个代码?
@Sideways 我解决了我的问题
【参考方案1】:
答案很简单。您只需要在获得信息后关闭您的套接字。在使用我得到的信息后,我刚刚添加了 socket.Close(),一切正常。
【讨论】:
以上是关于由于某种原因无法使用套接字接收信息的主要内容,如果未能解决你的问题,请参考以下文章
Fleck websocket 实现问题。无法使用套接字。发送