C# C TCP应用程序无法工作
我正在使用System.Net中的TcpClient和TcpServer制作一个简单的聊天应用程序 我的电脑上的一切都正常工作,服务器与客户端通信,反之亦然。但是,当我尝试使用另一台电脑连接到同一个服务器应用程序时,即使是在与我的电脑相同的子网中,也无法正常工作 我尝试过通过路由器、防火墙进行端口转发,但仍然一无所获 警方说连接被拒绝了。虽然有时它会说连接完全超时 我不确定我的代码或我的电脑有什么问题,我真的很感谢那些在这方面比我更有经验的人的帮助 以下是我的路由器中端口转发的配置: 如果您需要客户端和服务器的代码,请参见: 另外,我在底部的BeginConnect部分对客户端进行了更改,以更改我连接的IP地址 客户:C# C TCP应用程序无法工作,c#,tcp,system.net,C#,Tcp,System.net,我正在使用System.Net中的TcpClient和TcpServer制作一个简单的聊天应用程序 我的电脑上的一切都正常工作,服务器与客户端通信,反之亦然。但是,当我尝试使用另一台电脑连接到同一个服务器应用程序时,即使是在与我的电脑相同的子网中,也无法正常工作 我尝试过通过路由器、防火墙进行端口转发,但仍然一无所获 警方说连接被拒绝了。虽然有时它会说连接完全超时 我不确定我的代码或我的电脑有什么问题,我真的很感谢那些在这方面比我更有经验的人的帮助 以下是我的路由器中端口转发的配置: 如果您需
using System;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
namespace TcpTest_Client_
{
public partial class Form1 : Form
{
TcpClient client;
IPAddress localIP = null;
bool connected = false;
public Form1()
{
InitializeComponent();
}
public void clientConnectCallback(IAsyncResult result)
{
try
{
client.EndConnect(result);
Log("Connected to " + client.Client.RemoteEndPoint);
connected = true;
NetworkStream clientStream = client.GetStream();
byte[] message = new byte[4096];
int bytesRead;
while (true)
{
bytesRead = 0;
try
{
//blocks until a client sends a message
bytesRead = clientStream.Read(message, 0, 4096);
}
catch (Exception ex)
{
//a socket error has occured
Log(ex.Message);
break;
}
if (bytesRead == 0)
{
//the client has disconnected from the server
Log("Server on has disconnected");
break;
}
//message has successfully been received
UTF8Encoding encoder = new UTF8Encoding();
string bufferincmessage = encoder.GetString(message, 0, bytesRead);
Log("Server: " + bufferincmessage);
}
}
catch (Exception ex)
{
Log(ex.Message);
}
}
public void Log(string msg)
{
richTextBox1.BeginInvoke(new Action(
() =>
{
richTextBox1.Text += msg + "\n";
}));
}
private void Form1_Load(object sender, EventArgs e)
{
foreach (IPAddress addr in Dns.GetHostAddresses(Dns.GetHostName()))
{
if (addr.AddressFamily == AddressFamily.InterNetwork)
{
localIP = addr;
break;
}
}
client = new TcpClient(AddressFamily.InterNetwork);
}
private void button2_Click(object sender, EventArgs e)
{
try
{
client.BeginConnect(IPAddress.Parse("109.252.107.144"), 1234, clientConnectCallback, client);
}
catch (Exception ex)
{
Log(ex.Message);
}
}
private void button1_Click(object sender, EventArgs e)
{
if (connected)
{
UTF8Encoding encoder = new UTF8Encoding();
NetworkStream clientStream = client.GetStream();
byte[] stringToSend = new byte[richTextBox2.Text.Length];
stringToSend = encoder.GetBytes(richTextBox2.Text);
clientStream.Write(stringToSend, 0, stringToSend.Length);
}
}
}
}
服务器:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace TcpTest
{
public partial class Form1 : Form
{
private TcpListener server;
private List<Thread> clientThreads = null;
public Thread MainThread;
public Form1()
{
InitializeComponent();
}
public void Log(string msg)
{
richTextBox1.BeginInvoke(new Action(
() =>
{
richTextBox1.Text += msg + "\n";
}));
}
public static string bufferincmessage;
public void AcceptSocketPackets(object client)
{
TcpClient tcpClient = (TcpClient)client;
NetworkStream clientStream = tcpClient.GetStream();
byte[] message = new byte[4096];
int bytesRead;
while (true)
{
bytesRead = 0;
try
{
//blocks until a client sends a message
bytesRead = clientStream.Read(message, 0, 4096);
}
catch (Exception ex)
{
//a socket error has occured
Log(ex.Message);
break;
}
if (bytesRead == 0)
{
//the client has disconnected from the server
Log("Client on " + tcpClient.Client.RemoteEndPoint + " has disconnected from the server");
break;
}
//message has successfully been received
UTF8Encoding encoder = new UTF8Encoding();
bufferincmessage = encoder.GetString(message, 0, bytesRead);
Log("Client from " + tcpClient.Client.RemoteEndPoint + ": " + bufferincmessage);
string stringToSend = "You sent me: " + bufferincmessage;
byte[] messageToSend = new byte[stringToSend.Length];
messageToSend = encoder.GetBytes(stringToSend);
clientStream.Write(messageToSend, 0, messageToSend.Length);
}
}
public void SocketAcceptCallback(IAsyncResult result)
{
TcpClient newClient = server.EndAcceptTcpClient(result);
Log("Accepted client on " + newClient.Client.RemoteEndPoint);
clientThreads.Add(new Thread(new ParameterizedThreadStart(AcceptSocketPackets)));
clientThreads[clientThreads.Count - 1].Start(newClient);
server.BeginAcceptTcpClient(SocketAcceptCallback, server);
}
private void Form1_Load(object sender, EventArgs e)
{
MainThread = Thread.CurrentThread;
clientThreads = new List<Thread>();
try
{
IPAddress localIP = null;
foreach (IPAddress addr in Dns.GetHostAddresses(Dns.GetHostName()))
{
if (addr.AddressFamily == AddressFamily.InterNetwork)
{
localIP = addr;
break;
}
}
localIP = IPAddress.Any;
// could also use this:
// server = new TcpListener(new IPEndPoint(IPAddress.Any, 1234));
server = new TcpListener(new IPEndPoint(localIP, 1234));
Log("Starting server on " + localIP + ":1234");
server.Start(6);
server.BeginAcceptTcpClient(SocketAcceptCallback, server);
Log("Started server on " + localIP + ":1234");
}
catch (Exception ex)
{
Log(ex.Message);
}
}
}
}
C++给了我这样的问题。尝试创建另一个项目,粘贴服务器代码并将其构建为版本x86。如果您更改了构建目标,而我们的问题是相同的,windows防火墙即使关闭,也不允许服务器或客户端毫无例外地运行。如果它不起作用,我可能不知道答案。C++给了我类似的问题。尝试创建另一个项目,粘贴服务器代码并将其构建为版本x86。如果您更改了构建目标,而我们的问题是相同的,windows防火墙即使关闭,也不允许服务器或客户端毫无例外地运行。如果它不起作用,我可能不知道答案。Windows防火墙?@RichardHubley,我为我使用的端口添加了两条入站和出站规则。而且实际上也禁用了它。可能另一个应用程序正在使用端口1234。我尽量不使用其他人使用的端口号。最好是使用cmd.exe>Netstat-a来确保连接正常工作。也可以使用cmd.exe>Ping IP或计算机名。请同时尝试IP和计算机名,因为一个可以工作,另一个可能不工作。让我知道结果,并将进一步帮助。谢谢,@jdweng,我已经通过>Netstat-a检查了连接。我看到唯一的应用程序在那个端口上工作,那是我的。此外,我还尝试用不同的IP ping自己:127.0.0.1 localhost、192.168.1.11、我的外部IP、我的计算机名——一切都很好,没有数据包丢失,什么都没有。尝试从服务器PC反向回到客户端。有时ping在一个方向工作,而不是在另一个方向。如果服务器上的端口被阻止,ping可能仍然可以工作,因为ping在以太网卡中实现,并且没有被阻止。Windows防火墙?@RichardHubley,我为我使用的端口添加了两个入站和出站规则。而且实际上也禁用了它。可能另一个应用程序正在使用端口1234。我尽量不使用其他人使用的端口号。最好是使用cmd.exe>Netstat-a来确保连接正常工作。也可以使用cmd.exe>Ping IP或计算机名。请同时尝试IP和计算机名,因为一个可以工作,另一个可能不工作。让我知道结果,并将进一步帮助。谢谢,@jdweng,我已经通过>Netstat-a检查了连接。我看到唯一的应用程序在那个端口上工作,那是我的。此外,我还尝试用不同的IP ping自己:127.0.0.1 localhost、192.168.1.11、我的外部IP、我的计算机名——一切都很好,没有数据包丢失,什么都没有。尝试从服务器PC反向回到客户端。有时ping在一个方向工作,而不是在另一个方向。如果端口在服务器上被阻塞,ping可能仍然因为在以太网卡中实现ping而被阻止,而C++是如何与C相关的?它必须是Windows问题。对我来说是这样。他可能也是这样。由于我在网上找不到任何关于我的问题的答案,我花了几个小时来处理它,我决定帮助像我这样有问题的人,并建议这样做。它可能不起作用,但它是C++的一个假设,它与C有关。它必须是Windows问题。对我来说是这样。他可能也是这样。由于我在网上找不到任何关于我的问题的答案,我花了几个小时来处理它,我决定帮助像我这样有问题的人,并建议这样做。这可能不起作用,但这是一个假设