-2

重複の可能性:
tcp/ipクライアントサーバーがインターネット上で機能しない

私は先週、クライアントからサーバーへ、またはサーバーからクライアントへといくつかの整数を送信することになっている単純なWindowsフォームアプリケーションの作業に費やしました。これまでのところ、私はそれをlannsで機能させることができましたが、オープンインターネットで機能させる方法について何かアイデアはありますか?必要な場合のコードは次のとおりです(noobとも呼ばれますが、このサイトがコードを処理する方法がわかり...ません。思ったとおりに動作しません。失敗した場合に備えて、投稿を編集してください)

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

2 に答える 2

0

両側のファイアウォールで 3000 ポートを開いていますか?

于 2013-01-25T19:46:21.387 に答える
0

はい、もちろん^^ ルーターをお持ちの場合は、構成も忘れずに編集してください。

于 2013-01-25T20:05:47.787 に答える