c#客户端/服务器应用程序仅适用于lans,修复?

时间:2013-01-25 19:42:46

标签: c# forms sockets client lan

  

可能重复:
  tcp/ip client server not working over internet

我上周花了一个简单的Windows窗体应用程序,该应用程序应该从客户端到服务器或从服务器到客户端发送几个整数。到目前为止,我只是设法使它适用于兰斯,任何关于如何使其在开放互联网上工作的想法? 这是代码,如果你需要它(也叫我noob但我不知道这个网站如何处理代码,...没有做我认为它做的所以随时编辑我的帖子,如果我fail2format)

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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