Aplikacja klient-serwer

0

Witam. Potrzebuję napisać aplikację klient serwer w c# z tym że klient ma byc na Windows Phone 7.1. Problem polega na tym że klient nie chce połączyć się z serwerem

Kod serwera:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;

namespace server_App
{
    class Program
    {
        static void Main(string[] args)
        {
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Unspecified);
            s.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1001));
            s.Listen(5);

            int counter = 0;
            
            

            while (true)
            {
                Console.WriteLine("Waiting for connection...");
                Socket cli = s.Accept();
                Console.WriteLine("Połączono");



                try
                {
                    byte[] buffer = new byte[1024];
                    int wynik = cli.Receive(buffer);
                    String time = Encoding.ASCII.GetString(buffer, 0, wynik);
                    Console.WriteLine("Client >> " + time);

                    if (wynik != 0)
                    {
                        String respond = "Roger";
                        byte[] responddata = Encoding.ASCII.GetBytes(respond.ToString());
                        cli.Send(responddata);


                    }
                }
                catch { }
            }

            
            
        }
    }
} 

i kod klienta:
(MainPage)

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;

namespace BingClientv2
{
    public partial class MainPage : PhoneApplicationPage
    {
        // Constructor

        const int ECHO_PORT = 1001;

        public MainPage()
        {
            InitializeComponent();

        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            ClearLog();

            SocketClient client = new SocketClient();

            Log(String.Format("Łącze z serwerem '{0}' na porcie {1} (echo) ...", "localhost", ECHO_PORT), true);

            string result = client.Connect(ECHO_PORT);
            Log(result, false); Log(String.Format("Wysyłam '{0}' do serwera ...", TextBoxEcho.Text), true);

            result = client.Send(TextBoxEcho.Text);
            Log(result, false);

            Log("...", true);

            result = client.Receive();

            Log(result, false);
            client.Close();
        }

        private void Log(string message, bool isOutgoing)
        {
            string direction = (isOutgoing) ? ">> " : "<< ";
            ServerResponse.Text += Environment.NewLine + direction + message;
        }
        private void ClearLog()
        {
            ServerResponse.Text = String.Empty;
        }
    }
}

i klasa SocketClient:

 using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Net.Sockets;
using System.Threading;
using System.Text;

namespace BingClientv2
{
    public class SocketClient
    {
        Socket socket = null;
        static ManualResetEvent clientDone = new ManualResetEvent(false);
        const int TIMEOUT_MILLISECONDS = 5000;
        const int MAX_BUFFER_SIZE = 2048;

        public string Connect(int portnumber)
        {
            string result = string.Empty;

            IPEndPoint hostEntry = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1001);

            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Unspecified);

            SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();

            socketEventArg.RemoteEndPoint = hostEntry;
            socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
            {
                result = e.SocketError.ToString();
                clientDone.Set();
            });
            clientDone.Reset();
            socket.ConnectAsync(socketEventArg);
            clientDone.WaitOne(TIMEOUT_MILLISECONDS);

            return result;
        }

        public string Send(string data)
        {
            string response = "Timeout";

            if (socket != null)
            {
                SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
                socketEventArg.RemoteEndPoint = socket.RemoteEndPoint;
                socketEventArg.UserToken = null;
                socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
                {
                    response = e.SocketError.ToString();
                    clientDone.Set();
                });
                byte[] payload = Encoding.UTF8.GetBytes(data);
                socketEventArg.SetBuffer(payload, 0, payload.Length);
                clientDone.Reset();
                socket.SendAsync(socketEventArg);
                clientDone.WaitOne(TIMEOUT_MILLISECONDS);
            }
            else
            {
                response = "Socket nie zainicjalizowany";
            }
            return response;
        }

        public string Receive()
        {

            string response = "Timeout";
            if (socket != null)
            {
                SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
                socketEventArg.RemoteEndPoint = socket.RemoteEndPoint;
                socketEventArg.SetBuffer(new Byte[MAX_BUFFER_SIZE], 0, MAX_BUFFER_SIZE);
                socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
                {
                    if (e.SocketError == SocketError.Success)
                    {
                        response = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred);
                        response = response.Trim('\0');
                    }
                    else
                    {
                        response = e.SocketError.ToString();
                    }
                    clientDone.Set();
                });
                clientDone.Reset();
                socket.ReceiveAsync(socketEventArg);
                clientDone.WaitOne(TIMEOUT_MILLISECONDS);
            }
            else
            {
                response = "Socket nie zainicjalizowany";
            }
            return response;
        }

        public void Close()
        {
            if (socket != null)
            {
                socket.Close();
            }
        }
    }
}

Pomóżcie!

0

Dostajesz "Connection failed"?

Jeśli dobrze widzę, to problem polega na tym, że 127.0.0.1 emulatora i 127.0.0.1 twojego komputera to dwa różne localhosty. Po pierwsze, swoim serwerem nasłuchuj na 0.0.0.0 (albo na jakimś zewnętrznym adresie), po drugie, spróbuj połączyć się z jakimś zewnętrznym adresem twojego komputera, np. adresem w sieci lokalnej.

0

Jeśli chodzi o połączenie się klienta z adresem w sieci lokalnej to bez problemu.Mimo to ustawiłem nasłuchiwanie serwera na 0.0.0.0 ale nie rozwiązało to problemu. Z kolei jak chcę nasłuchiwać na adresie np 192.168.1.10 lub podobnym to wywala błąd "Żądany adres jest nieprawidłowy w tym kontekście"... :( Jakieś pomysły?:P

1 użytkowników online, w tym zalogowanych: 0, gości: 1