Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

wrproject

[SOCKETS]como criar servidor que não bloqueia

Recommended Posts

wrproject

Boas pessoal,eu criei uma janela em windowsforms,com um botao para enviar bytes para o cliente.

Acontece que quando oservidor esta em listening a janela bloqueiae nem da sequer para fechar o programa.

Algum sabe o k posso fazer?

Share this post


Link to post
Share on other sites
magician

Ou usas um socket assíncrono ou então usa uma thread em paralelo para receber os dados assim o interface não congela.


I haven’t lost my mind; it’s backed up on DVD somewhere!

Share this post


Link to post
Share on other sites
wrproject

Podias dar-me algumas luzes de como criar uma thread que fica aguardar pelos clientes de modo a nao congelar a interface?

Share this post


Link to post
Share on other sites
pedrotuga

Em C# ainda é mais simples que noutras linguagens. Basta-te criar uma thread que recebe um método como parâmetro. E depois inicia-la com  o método Start(), como está neste exemplo:

System.Threading.Thread newThread;
newThread = new System.Threading.Thread(anObject.AMethod);
newThread.Start();

Tirei o exemplo daqui:

http://msdn.microsoft.com/en-us/library/ms173178(VS.80).aspx

Share this post


Link to post
Share on other sites
wrproject

Agora tenho outro problema,eu criei uma thread que vai chmar um método da propria classe,mas incrivelmente ele da-me o seguinte erro:

Cannot create instance of 'Window1' defined in assembly 'ServerViewer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. Exception has been thrown by the target of an invocation.  Error in markup file 'Window1.xaml' Line 1 Position 9.

em baixo ponho o meu código actual:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Drawing;
using System.Drawing.Imaging;
using System.ComponentModel;
using System.Data;
using System.Threading;
using System.Windows.Forms;
using System.IO;
using System.Net.Sockets;

namespace ServerViewer
{



   




    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    /// 

    public partial class Window1 : Window
    {
        Thread oThread;

        const int portNo = 8245;

        public static TcpListener listener;

        private static Bitmap bmpScreenshot;

        private static Graphics gfxScreenshot;

        static TcpClient cliente;
        

        public Window1()
        {
            InitializeComponent();


            System.Net.IPAddress[] a =
System.Net.Dns.GetHostAddresses(System.Net.Dns.GetHostName());


            System.Net.IPAddress localAdd = a[0];
            //System.Windows.MessageBox.Show(a[0].ToString());
          listener = new TcpListener(localAdd, portNo);
            listener.Start();

            //trhead que vai aguardar por conexões
            Window1 tt = new Window1();
            new Thread(tt.Listening).Start();
            tt.Listening();
            

            
        
        }


        void OnCloseForm(object sender, CancelEventArgs e)
        {
            
            //terminar a thread
            oThread.Abort();
            listener.Stop();
            
            
        }


       

       
       

        public void Listening()
        {


            //Window1 janela = new Window1();



            
                //Quando um cliente conceta ao servidor,a caixa de texto é actualizada por
                //"cliente conectado"
            while (true)
            {
                cliente = listener.AcceptTcpClient();
                System.Windows.MessageBox.Show("conectado");

            }
             //   janela.state.Text = "Cliente conectado";
            
            //tt.Text = "ooo";
           // System.Windows.Controls.TextBox t=new Window1().state;
           // t.Text = "elizeu";
            //this.listener

        }


        
        private void BtPrintClicked(object sender, RoutedEventArgs e)
        {
            

            
            //quando este botao é clicado,é enviado um bitmap pro cliente

            this.Hide();

            bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

            // Create a graphics object from the bitmap

            gfxScreenshot = Graphics.FromImage(bmpScreenshot);

            // Take the screenshot from the upper left corner to the right bottom corner

            gfxScreenshot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);

            // Save the screenshot to the specified path that the user has chosen

            MemoryStream ms = new MemoryStream();
            bmpScreenshot.Save(ms, ImageFormat.Png);

            System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
            Byte[] data=encoding.GetBytes("ola elizeu");
            

            

            //this.Close();

        }



    }

    }

Share this post


Link to post
Share on other sites
wrproject

Pois quis dizer xaml,é o habito lol.

Mas voltando ao problema,eu só consio criar uma thread para o método listening se o mesmo for static,mas se não for static ja não consigo lancaro método numa thread.

Eu preciso que este método nao seja estatico para ser possivel alterar o texto da textbox quando o cliente conectar.

Share this post


Link to post
Share on other sites
vbmaster

Se fosse em C tinhas a chamada de sistema select que te possibilita definir um timeout.

Mas isso seria em linux...

Share this post


Link to post
Share on other sites
vitortomaz

Eu preciso que este método nao seja estatico para ser possivel alterar o texto da textbox quando o cliente conectar.

Em WPF ele deixa outra thread mudar objectos da "thread gráfica"? (thread gráfica é a thread que criou os objectos gráficos)

Share this post


Link to post
Share on other sites
wrproject

Criei um código para enviar um conjunto de bytes de um bitmap,acontece que eu no cliente defino o tamanho do buffer da seguinte maneira:

data=new byte[client.ReceiveBufferSize];

Quando envio texto,funciona na perfeição,mas quando tento mandar um bitmap,ele n manda  aimagem completa e da erro,o que devo fazer para corrigir a situação?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.