C#TCP应用程序无法正常工作

时间:2018-08-29 16:56:16

标签: c# tcp system.net

我正在使用TcpClient中的TcpServerSystem.Net创建一个简单的聊天应用程序。

我在PC上完成所有工作,服务器与客户端通信,反之亦然。但是,当我尝试使用另一台PC(甚至与我的PC在同一子网)连接到同一服务器应用程序时,该操作将无法正常工作。

我已经尝试通过路由器,防火墙进行端口转发,但仍然一无所获。

Can you see me website表示连接被拒绝。虽然!!有时它说连接完全超时。

我不确定我的代码或PC出了什么问题,我真的很感谢在这个领域比我更有经验的人们提供的帮助。

这是路由器中端口转发的配置: Here is the configuration for the port forwarding thing in my rounter

如果您需要客户端和服务器的代码,则为:

P.S。我在底部的BeginConnect()部分对客户端进行了更改,以更改我要连接的IP地址

客户:

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);
            }
        }
    }

}

1 个答案:

答案 0 :(得分:-1)

C ++给我这样的问题。尝试创建另一个项目,粘贴服务器代码并将其构建为Release x86。如果您更改构建目标并且我们的问题相同,则即使关闭Windows防火墙,Windows服务器也不会允许服务器或客户端正常运行。如果它不起作用,我可能不知道答案。