我有一个使用Socket发送和回收2D游戏数据的Projekt。
游戏客户端必须将他的昵称发送到gamer.name中存储昵称的服务器。所有玩家都存储在列表List<Gamer>
中。
因此,当客户端请求用户列表时,服务器会发送由Send(socket, "01$" + gamer.id.ToString() + "$" + gamer.name + "$" + gamer.in_game.ToString())
但是当客户端收到字符串后,gamer.name之后的所有数据都消失了。所以我试着在MessageBox(在服务器程序中)输出相同的数据,并且gamer.name之后的数据也消失了(所以它不是Socket问题)。
我做得很好,我只需将gamer.name的位置更改为字符串的结尾。
(Send(socket, "01$" + gamer.id.ToString() + "$" + gamer.in_game.ToString() + "$" + gamer.name);
)
但问题没有解决,因为Send(socket, "01...
正在foreach(Gamer gamer in users)
中运行而字符串gamer.name就像停止了foreach一样,所以服务器而不是发送所有用户它只发送第一个然后foreach被gamer.name打断。
字符串怎么可能打破foreach并且如何修复它?
存储用户名的代码:
gmr.name = nickname;
this.Invoke((MethodInvoker)(() => list_users.Items.Add(gmr.name)));
SendUsersList(gmr.soc);
users.Add(gmr);
昵称在这里定义:
byte[] buffer = new byte[gmr.soc.ReceiveBufferSize];
gmr.soc.Receive(buffer);
string cmd[] = Encoding.ASCII.GetString(buffer).split('$');
string nickname = cmd[1]; //cmd[0] = 50 (means Register User by nickname)
Register(gmr, nickname);
发送昵称的客户代码:
string text = "50$" + txt_nickname.Text;
byte[] data = new byte[Encoding.ASCII.GetByteCount(text)];
data = Encoding.ASCII.GetBytes(text);
socket_to_server.Send(data);