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

wrproject

[SOCKETS]como criar servidor que não bloqueia

12 mensagens neste tópico

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?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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();

        }



    }

    }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A mensagem de erro parece-me clara:

erro na linha 1 coluna 9 do ficheiro Window1.xaml

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

dizes que criaste um projecto windowsForms mas na realidade criaste foi um projecto WPF (*.xaml é WPF)

era isso que querias fazer?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

Mas isso seria em linux...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora