C# 客户端/服务器应用程序仅适用于 LAN,修复

本文关键字:适用于 LAN 修复 应用程序 客户端 服务器 | 更新日期: 2023-09-27 17:55:59

可能的重复项:
TCP/IP 客户端服务器无法通过互联网工作

我花了上周的时间开发一个简单的Windows表单应用程序,该应用程序应该从客户端发送到服务器或从服务器发送到客户端发送几个整数。到目前为止,我只设法让它适用于 lanns,关于如何让它在开放的互联网上工作的任何想法?这是代码,以防您需要它(也叫我菜鸟,但我无法理解这个网站如何处理代码,...没有做我认为它所做的,所以请随时编辑我的帖子以防我失败2format)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace client_server_penta
{
    public class Client
    {
        #region Fields 
        private int turno = 1;
        private TcpClient[] clients = new TcpClient[1]; //used to remember the active client
        private int CoordinateX, CoordinateY; //coordinates, they are used by the application
        #endregion     
        public Client(string address)
        {            
                TcpClient client = new TcpClient();
                IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse(address), 3000);
                client.Connect(serverEndPoint);
                clients[0] = client;              
                Thread ReadFromServer = new Thread(new ParameterizedThreadStart(this.ReadHandler));
                ReadFromServer.Start(client);
        } 
        public void SendData(int a, int b)
        {
            NetworkStream clientStream = clients[0].GetStream();
            ASCIIEncoding encoder = new ASCIIEncoding();
            byte[] buffer = encoder.GetBytes(a.ToString() + '$' + b.ToString() + '$');
            clientStream.Write(buffer, 0, buffer.Length);
            clientStream.Flush();
        }
        public int ReadCoordinateX()
        {
            return this.CoordinateX;
        }
        public int ReadCoordinateY()
        {
            return this.CoordinateY;
        }
        private void ReadHandler(object client)
        {
            TcpClient tcpClient = (TcpClient)client;
            NetworkStream clientStream = tcpClient.GetStream();
            byte[] buffer;
            int bytesRead;
            while (true)
            {
                buffer = new byte[10];
                bytesRead = 0;
                try
                {                    
                    bytesRead = clientStream.Read(buffer, 0, buffer.Length);
                }
                catch
                {
                    //an uknown error has occurred
                    break;
                }
                if (bytesRead == 0)
                {
                    //the client has disconnected from the server
                    break;
                }
                //data received
                ASCIIEncoding encoder = new ASCIIEncoding();
                OnDataReceived(encoder.GetString(buffer, 0, buffer.Length));
            }
            tcpClient.Close();            
        }
        private void OnDataReceived(string text)
        {
            string first_number = "";
            string second_number = "";
            int index = 0;
            while (text[index] != '$')
                first_number += text[index++];
            index++;
            while (text[index] != '$')
                second_number += text[index++];
            this.CoordinateX = Convert.ToInt32(first_number);
            this.CoordinateY = Convert.ToInt32(second_number);
            var myForm = Application.OpenForms["Form2"] as Form2;
            myForm.Text = "Turno N." + Convert.ToString(this.turno++);
        }
    }
}

这是服务器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace client_server_penta
{
    public class Server
    {        
        private Thread listenThread;
        private int turno = 1;
        private TcpListener tcpListener;
        private TcpClient[] clients = new TcpClient[1]; //used to remember the active client
        private int CoordinateX, CoordinateY; //coordinates, they are used by the application
        public Server(int port)
        {
            this.tcpListener = new TcpListener(IPAddress.Any, 3000);
            this.listenThread = new Thread(new ThreadStart(ListenForClients));
            this.listenThread.Start();
        }

        public void SendData(int a, int b)
        {
            NetworkStream clientStream = clients[0].GetStream();
            ASCIIEncoding encoder = new ASCIIEncoding();
            byte[] buffer = encoder.GetBytes(a.ToString()+'$'+b.ToString()+'$');
            clientStream.Write(buffer, 0, buffer.Length);
            clientStream.Flush();
        }
        public int ReadCoordinateX()
        {
            return this.CoordinateX;
        }

        public int ReadCoordinateY()
        {
            return this.CoordinateY;
        }
        private void ListenForClients()
        {
                this.tcpListener.Start();
                TcpClient client = this.tcpListener.AcceptTcpClient();                              
                clients[0] = client;
                Thread ReadFromClient = new Thread(new ParameterizedThreadStart(this.ReadHandler));
                ReadFromClient.Start(client);

        }
        private void ReadHandler(object client)
        {
            TcpClient tcpClient = (TcpClient)client;
            NetworkStream clientStream = tcpClient.GetStream();
            byte[] buffer = new byte[10];
            int bytesRead;
            while (true)
            {
                buffer = new byte[10];
                bytesRead = 0;
                try
                {
                    bytesRead = clientStream.Read(buffer, 0, buffer.Length);
                }
                catch
                {
                    break;
                }
                if (bytesRead == 0)
                {
                    //the client has disconnected from the server
                    break;
                }
                //data received
                ASCIIEncoding encoder = new ASCIIEncoding();
                OnDataReceived(encoder.GetString(buffer, 0, buffer.Length));                
            }  
            tcpClient.Close();            
        }
        private void OnDataReceived(string text)
        {
            string first_number = "";
            string second_number = "";
            int index = 0;
            while (text[index] != '$')            
                first_number += text[index++];
            index++;
            while (text[index] != '$')
                second_number += text[index++];
            this.CoordinateX = Convert.ToInt32(first_number);
            this.CoordinateY = Convert.ToInt32(second_number);
            var myForm = Application.OpenForms["Form2"] as Form2;
            myForm.Text = "Turno N."+Convert.ToString(this.turno++);
        }     
    }
}

C# 客户端/服务器应用程序仅适用于 LAN,修复

您是否在两端的防火墙上打开了 3000 端口?

是的,当然^^如果您有路由器,也不要忘记编辑配置。