public void ConnectionRenew()
{
//异步建立连接回调
AccessAction = () =>
{
Invoke((MethodInvoker)delegate ()
{
try
{
String friendIP = socket.communicateSocket.RemoteEndPoint.ToString();
if (MyAccessCharacter == AccessCharater.Host || MyAccessCharacter == AccessCharater.HostWatcher)
{
ServerSocket serversocket = (ServerSocket)socket;
Socket communicateSocket = serversocket.communicateSockets.Last();
friendIP = communicateSocket.RemoteEndPoint.ToString();
Thread thread = new Thread(new ThreadStart(delegate ()
{
serversocket.Receive(ReceiveAction, communicateSocket);
}));
thread.Start();
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//本机预使用的IP和端口
int port;
if (!Int32.TryParse(connection.textBox_Port.Text, out port))
{
port = 9050 + SocketFunc.ReConnectCount;
SocketFunc.ReConnectCount++;
}
else
{
port += SocketFunc.ReConnectCount;
SocketFunc.ReConnectCount++;
}
IPEndPoint serverIP = new IPEndPoint(IPAddress.Any, port);
//绑定服务端设置的IP
serverSocket.Bind(serverIP);
//设置监听个数
serverSocket.Listen(1);
//异步接收连接请求
serverSocket.BeginAccept(ar =>
{
serversocket.communicateSockets.Add(serverSocket.EndAccept(ar));
AccessAction();
}, null);
if (MyAccessCharacter == AccessCharater.Host)
{
if (Language == Language.Chinese)
{
connection.labelConnectStatus.Text = "已连接。 空闲端口号:" + port.ToString();
}
else
{
connection.labelConnectStatus.Text = "Connected. Valid port number: " + port.ToString();
}
connection.Portusing = port;
if (serversocket.communicateSockets.Count == 1)
{
connection.connected = true;
connection.Close();
msgProcessor.SendSecret("MyName", new List<string> { Version.ToString(), DatabaseVer.ToString(), PlayerName }, "");
}
else
{
msgProcessor.SendSecret("SetWatcher", new List<string> { Version.ToString(), DatabaseVer.ToString(), PlayerName, RivalName }, "");
}
}
else
{
connection.Portusing = port;
if (serversocket.communicateSockets.Count == 1)
{
connection.connected = true;
connection.Close();
connection.labelConnectStatus.Text = "已有1位玩家连接。 空闲端口号:" + port.ToString();
msgProcessor.SendSecret("SetPlayer1", new List<string> { Version.ToString(), DatabaseVer.ToString() }, "");
}
else if (serversocket.communicateSockets.Count == 2)
{
msgProcessor.SendSecret("SetPlayer2", new List<string> { Version.ToString(), DatabaseVer.ToString(), ClientsNames[serversocket.communicateSockets[0]] }, "");
connection.labelConnectStatus.Text = "中继连接中。 空闲端口号:" + port.ToString();
}
else
{
msgProcessor.SendSecret("SetWatcher", new List<string> { Version.ToString(), DatabaseVer.ToString(), ClientsNames[serversocket.communicateSockets[0]], ClientsNames[serversocket.communicateSockets[1]] }, "");
connection.labelConnectStatus.Text = "中继连接中。 空闲端口号:" + port.ToString();
}
}
}
else
{
ClientSocket serversocket = (ClientSocket)socket;
Socket communicateSocket = serversocket.communicateSocket;
friendIP = communicateSocket.RemoteEndPoint.ToString();
serversocket.Receive(ReceiveAction, communicateSocket);
TryConnect = true;
}
}
catch (Exception exp)
{
connection.Disconnect();
if (socket == null)
{
if (Language == Language.Chinese)
{
MessageBox.Show("无法连接到对手,请确认您输入的IP地址是否正确。\r\n如果您确定IP地址正确,请输入对手的端口号。", "无法连接");
}
else
{
MessageBox.Show("Please check your opponent's IP Address and port number.", "Connection failed.");
}
}
else
{
if (Language == Language.Chinese)
{
MessageBox.Show(exp.Message, "错误");
}
else
{
MessageBox.Show(exp.Message, "Error");
}
}
return;
}
});
};
//异步接收消息回调
ReceiveAction = (code, source) =>
{
textBoxMsgRcv.Invoke((MethodInvoker)delegate ()
{
msgProcessor.Receive(code, source);
});
};
}