服务端配置:centos7.8,.net6.0
程序配置:':Visual Studio C# 控制台,.netSocket
服务端代码:
Console.WriteLine("[服务器]启动");
IPAddress ip = IPAddress.Parse("我写得服务器外网地址");
IPEndPoint point = new IPEndPoint(ip, int.Parse(32790));
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Dictionary<string, Socket> dic = new Dictionary<string, Socket>();
try
{
socket.Bind(point);
socket.Listen(10);
Thread thread = new Thread(AcceptInfo);
thread.IsBackground = false;
thread.Start(socket);
}
catch (Exception ex)
{
ShowMsg(ex.Message);
}
void AcceptInfo(object o)
{
Socket socket = o as Socket;
ShowMsg("开始检测!");
while (true)
{
try
{
Socket tSocket = socket.Accept();
string point = tSocket.RemoteEndPoint.ToString();
ShowMsg(point + "连接成功!");
dic.Add(point, tSocket);
Send(point, point);
Thread th = new Thread(ReceiveMsg);
th.IsBackground = true;
th.Start(tSocket);
}
catch (Exception ex) { break; }
}
}
void ShowMsg(string msg)
{
Console.WriteLine(msg);//这是对服务器情况汇报的方式
}
void ReceiveMsg(object o)
{
Socket client = o as Socket;
while (true)
{
try
{
byte[] buffer = new byte[1024 * 1024];
int n = client.Receive(buffer);
string words = Encoding.UTF8.GetString(buffer, 0, n);
ShowMsg(client.RemoteEndPoint.ToString() + " : " + words);
}
catch (Exception ex) { break; }
}
}
void Send(string ip, string str)//发送消息直接调用这个函数,方法:Send("IP:端口",内容);
{
try
{
byte[] buffer = Encoding.UTF8.GetBytes(str);
dic[ip].Send(buffer);
}
catch (Exception ex)
{
ShowMsg(ex.Message);
}
}
在百度翻找7h后,得到了答案
这类socket一旦出问题,很复杂
127.0.0.1和0.0.0.0均可以运行监听但无法连接
最终解决办法为服务器用私网ip监听
客户端用公网ip监听,
虽然我不理解,但是真的运行并且连接成功了
试一下127.0.0.1 是不是可以绑定使用成功。
没问题,你在控制打ip adress看看你使用的公网IP是不是有的,我估计是没有,建议你绑定IP使用0.0.0.0
客户端本机的IP可以不设置,不设置的话缺省为0.0.0.0,表示自动获取本机的第一个网卡的IP地址
我看了我的云服务,我的弹性网卡,ip adress并没有显示公网的ip