отправка и получение файлов одновременно - PullRequest
0 голосов
/ 31 октября 2011

Я новичок в программировании сокетов, поэтому у меня есть вопрос. Я пытаюсь создать два приложения, сервер и клиент, которые должны отправлять и получать файлы между собой через Интернет (отправлять и получать файлы). Будет только один сервер и только один клиент, поэтому я решил, что мне не нужно асинхронное сокетное соединение. Я пытался отправлять и получать файлы только через одно сокетное соединение, но это не сработало. Теперь я пытаюсь с двумя сокетами, работающими в разных потоках, используя один и тот же IP и разные порты, но это больше не работает. Должен ли я найти проблему в моем источнике, или мне придется использовать асинхронное сокетное соединение?

Это мое приложение на стороне сервера. Код для обоих сокетов довольно похож, единственный Разница в том, какой порт я использую.

// My main thread starts another one, for the receiving of files
    public static void StartListening() {
        t = new Thread(receiveFile);
        t.Start();
        sendFile();
    }

//

        static void sendFile()
        {
            IPAddress ipAddress = IPAddress.Parse("192.168.1.101");
            IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 10999);
            Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream,   ProtocolType.Tcp);
            try
            {
                listener.Bind(localEndPoint);
                listener.Listen(10);
                while (true)
                {
                    handler = listener.Accept();
                    //code after connecting for sending files
                    while(true) {
                       //...
                    }
                }
            }
            catch(Exception e) {}
         }


    static void receiveFile()
    {
        IPAddress ipAddress = IPAddress.Parse("192.168.1.101");
        IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);
        Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        try
        {
            listener.Bind(localEndPoint);
            listener.Listen(10);
            while(true) {
                handler = listener.Accept();
                //code after connecting for receiving files
                while(true) {
                    //... 
                }
            }
        }
        catch(Exception e) {}
     }

И это код в моем клиентском приложении для подключения к сокетам. Опять же, разница только в розетках:

//Again i start a second thread, for the second socket
public static void StartClient() {
    t = new Thread(receiveFile);
    t.Start();
    sendFile();
}

static void sendFile()
{
    try
    {
        IPAddress ipAddress = IPAddress.Parse("95.110.62.74");
        IPEndPoint remoteEP = new IPEndPoint(ipAddress, 11000);
        sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        try
        {
            sender.Connect(remoteEP);
            //Code  for sending to the server after connecting
            while (true) { }
        }
        catch(Exception e) {}
    }
    catch(Exception e) { }

}

static void receiveFile()
{
    try
    {
        IPAddress ipAddress = IPAddress.Parse("95.110.62.74");
        IPEndPoint remoteEP = new IPEndPoint(ipAddress, 10999);
        sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        try
        {
            sender.Connect(remoteEP);
            //Code  for sending to the server after connecting
            while (true) { }
        }
        catch(Exception e) {}
    }
    catch(Exception e) { }
}

Я использую разные IP-адреса в своем серверном и клиентском приложении, потому что мой сервер находится за маршрутизатором, и я сказал маршрутизатору переадресовать соединение на оба сервера. Когда я запускаю обе программы, они подключаются только через один из сокетов, каждый раз, когда они разные, я имею в виду, что когда-то они подключаются к одному через порт 10999, иногда к другому, но никогда не к обоим.

Я не уверен, если я все объяснил ясно :)

Заранее спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...