Сокеты C # не могут отправлять данные - PullRequest
0 голосов
/ 04 октября 2011

Здравствуйте, ребята, этот метод отправляет файл на клиентский компьютер

        private void StartServer()
    {
        TcpListener lsn = new TcpListener(IPAddress.Any, 27015);
        Socket sck;

        try
        {
            while (true)
            {
                lsn.Start();
                sck = lsn.AcceptSocket();
                byte[] b = new byte[100];
                int k = sck.Receive(b);
                string recived = "";

                for (int i = 0; i < k; i++)
                {
                    recived = "" + recived + "" + Convert.ToChar(b[i]).ToString();
                }

                if (recived == "Version")
                {
                    string _ipPort = sck.RemoteEndPoint.ToString();

                    var parts = _ipPort.Split(':');
                    _IPAddr = IPAddress.Parse(parts[0]);
                    _Port = Convert.ToInt32(parts[1]);
                    sck.Send(System.Text.Encoding.ASCII.GetBytes("1.1.0.0"));
                }

                k = sck.Receive(b);
                recived = "";

                for (int i = 0; i < k; i++)
                {
                    recived = "" + recived + "" + Convert.ToChar(b[i]).ToString();
                }

                if (recived == "Update")
                {
                    fName = "Cannonball.mp3";

                    byte[] fileName = Encoding.UTF8.GetBytes(fName);
                    byte[] fileData = File.ReadAllBytes("D:\\Cannonball.mp3");
                    byte[] fileNameLen = BitConverter.GetBytes(fileName.Length);

                    clientData = new byte[4 + fileName.Length + fileData.Length];

                    fileNameLen.CopyTo(clientData, 0);
                    fileName.CopyTo(clientData, 4);
                    fileData.CopyTo(clientData, 4 + fileName.Length);

                    if (sck.Connected == true)
                    {
                        sck.Send(clientData);
                        sck.Close();
                    }

                }
            }
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message.ToString());
        }
    }

Когда он продолжается до последнего, если оценка ничего не делает.Я написал этот код

Socket sck1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                        sck1.Connect(_IPAddr, _Port);
                        sck1.Send(clientData);

, но Visual Studio выдает ошибку, которая не может установить соединение.Я попробовал порт 999, который, как я знал, был открыт sck1.Connect(_IPAddr, 999);, и клиент получил файл.Кто-нибудь знает, как я могу отправить файл этой удаленной конечной точки (sck.RemoteEndPoint), который получил сервер?

Ответы [ 2 ]

1 голос
/ 04 октября 2011

Если sck1.Connect(_IPAddr, 999) подключается к некоторому сокету на компьютере сервера, то по крайней мере значение _IPAddr является правильным.

Вы проверяли, какое значение имеет _Port, когда вы пытаетесь подключиться? Соответствует ли он номеру порта, который слушает сервер?

Если эти числа совпадают, вы можете попробовать следующее, чтобы проверить, доступен ли ваш сервер:

  • Запустить приложение сервера
  • На клиентском компьютере откройте браузер и введите: http://111.11.11.111:27015 (замените 111 на действительный IP-адрес)
  • Если сервер принимает сокет в то время, сервер доступен, и вам нужно сосредоточиться на клиентском приложении, а не на сервере.
1 голос
/ 04 октября 2011

Попробуйте использовать TCPClient и TCPListener вместо сокетов.

РЕДАКТИРОВАТЬ: Поскольку у вас здесь более одной проблемы.Я решил показать вам, как мне нравится делать что-то подобное.

using System;
using System.Net;
using System.Net.Sockets;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Threading;

public static class Server
{
    private static Thread _listenThread;

    public static IPEndPoint ServerEp { get; set; }

    private static TcpListener _listener;

    // Listens for clients and creates a new thread to talk to each client on
    private static void ListenMain()
    {
        /* Start Lisening */

        _listener = new TcpListener(ServerEp);
        _listener.Start();

        while (true)
        {
            TcpClient newClient = _listener.AcceptTcpClient();

            // Create a thread to handle client communication
            var clientThread = new Thread((ClientComm)) {IsBackground = true};



            clientThread.Start(newClient);
        }

    }

    // The Client Communcation Method
    private static void ClientComm(object clientobject)
    {
        TcpClient client = (TcpClient) clientobject;
        NetworkStream stream = client.GetStream();

        while (true)
        {
            try
            {
                var message = RecieveMessage(client);

                // process the message object as you see fit.
            }
            catch
            {
                if (!client.Connected)
                {
                    break;
                }
            }

            // you could create a wrapper object for the connections
            // give each user a name or whatever and add the disconnect code here
        }
    }

    private static DataMessage RecieveMessage(TcpClient client)
    {
        NetworkStream stream = client.GetStream();

        IFormatter formatter = new BinaryFormatter();

        return (DataMessage)formatter.Deserialize(stream);
    }

    public static void SendMessage(DataMessage message, TcpClient client)
    {
        IFormatter formatter = new BinaryFormatter();

        formatter.Serialize(client.GetStream(), message);
    }

    // Starts...
    // You could add paramaters to this if you need to I like to set with Server.Etc
    public static void Start()
    {
        try
        {
            if (_listenThread.IsAlive) return;
        }
        catch (NullReferenceException)
        {
            _listenThread = new Thread(ListenMain) { IsBackground = true };
        }

        _listenThread.Start();
    }
}

// Must be in both client and server in a shared .dll
// All properties must be serializable
[Serializable]
public class DataMessage
{
    public string StringProp{ get; set; }

    public int IntProp { get; set; }

    public bool BoolProp { get; set; }

    // will cause an exception on serialization. TcpClient isn't marked as serializable.
  /*   public TcpClient Client { get; set; } */
}

Я отправлю своего клиента, если понадоблюсь.:) Удачи!

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