所以我创建了一个在局域网中工作的“简单聊天应用程序”,但是当我尝试走出局域网时它不起作用。我一直在网上寻找解决方案,遇到了很多东西,比如 NAT 遍历、端口转发等等……我发现没有一个有用。我的问题是:如何让我的应用程序在 WAN 上运行?我知道我想要两台 PC 通过 Internet 相互通信(一台是客户端,另一台是模拟服务器),并且这些 PC 隐藏在使用 NAT 的路由器后面。但我不知道如何让我的应用程序工作。
服务器:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Threading;
using System.Net.Sockets;
namespace sukaServer
{
public partial class Form1 : Form
{
Socket sock;
Socket accept;
public Form1()
{
InitializeComponent();
}
Socket socket()
{
return new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
private void buttonListenServ_Click(object sender, EventArgs e)
{
sock = socket();
sock.Bind(new IPEndPoint(0, 80));
sock.Listen(0);
new Thread(delegate ()
{
accept = sock.Accept();
MessageBox.Show("CONNECTED!");
sock.Close();
while (true)
{
try
{
byte[] buffer = new byte[255];
int rec = accept.Receive(buffer, 0, buffer.Length, 0);
if (rec <= 0)
{
throw new SocketException();
}
Array.Resize(ref buffer, rec);
Invoke((MethodInvoker)delegate
{
listBoxServer.Items.Add(Encoding.Default.GetString(buffer));
});
}
catch
{
MessageBox.Show("DISCONNECTED!");
sock.Close();
break;
}
}
Environment.Exit(0);
}).Start();
}
private void buttonServerSend_Click(object sender, EventArgs e)
{
byte[] data = Encoding.Default.GetBytes(textBoxServerSend.Text);
accept.Send(data, 0, data.Length, 0);
textBoxServerSend.Clear();
}
}
}
客户:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
namespace suka
{
public partial class Form1 : Form
{
Socket sock;
Socket socket()
{
return new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
public Form1()
{
InitializeComponent();
sock = socket();
FormClosing += new FormClosingEventHandler(Form1_FormClosing);
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
sock.Close();
}
private void buttonClientConnect_Click(object sender, EventArgs e)
{
try
{
sock.Connect(new IPEndPoint(IPAddress.Parse(textBoxClientConnect.Text), 80));
new Thread(delegate ()
{
read();
}).Start();
}
catch
{
MessageBox.Show("CANNOT CONNECT!");
}
}
void read()
{
while (true)
{
try
{
byte[] buffer = new byte[255];
int rec = sock.Receive(buffer, 0, buffer.Length, 0);
if (rec <= 0)
{
throw new SocketException();
}
Array.Resize(ref buffer, rec);
Invoke((MethodInvoker)delegate
{
listBoxClient.Items.Add(Encoding.Default.GetString(buffer));
});
}
catch
{
MessageBox.Show("DISCONNECTED!");
sock.Close();
break;
}
}
Environment.Exit(0);
}
private void buttonClientSend_Click(object sender, EventArgs e)
{
byte[] data = Encoding.Default.GetBytes(textBoxClientSend.Text);
sock.Send(data, 0, data.Length, 0);
textBoxClientSend.Clear();
}
}
}
我知道这乍一看会像复制品一样,但我看到的帖子都没有解决相同的问题,要么他们希望 A 和 B 通过服务器进行通信,要么是其他东西。我想要 A 和 B 聊天,其中 A 是服务器,B 是客户端,反之亦然。我想要的第一件事是让它能够在互联网上工作,稍后我将解决异步问题。
编辑: Lemme 只是澄清“不工作”的事情......它抛出了我捕捉并通过(“无法连接!”)部分代码的异常。