-2

可能重复:
tcp/ip 客户端服务器无法通过 Internet 工作

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

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 回答