Avatar billede agerled Nybegynder
05. april 2005 - 10:34 Der er 22 kommentarer

kommunikere med andre winform programmer på netværket

Hej.

Er det muligt at kommunikere med andre winform programmer på netværket. f.eks. læse en anden winforms dataset og sende popup beskeder til andre aktive programmer....???
Avatar billede arne_v Ekspert
05. april 2005 - 10:49 #1
Du kan kode en løsning med sockets eller remoting eller web services.

Men mig bekdnt er der ikke noget "færdigt" til det formål.
Avatar billede agerled Nybegynder
05. april 2005 - 12:53 #2
ok.

har du et kode eksempel på hvordan jeg laver en msgbox i en ekstern winform?
Avatar billede burningice Nybegynder
05. april 2005 - 17:32 #3
:) det er ikke bare et lille eksempel man kommer med... men jeg kan da godt strikke et samme med .net remoting senere i aften når jeg kommer hjem igen, hvis at arne ikke er kommet med noget inden da.
Avatar billede agerled Nybegynder
06. april 2005 - 08:39 #4
det lyder godt. det må du gerne... tak.
Avatar billede arne_v Ekspert
06. april 2005 - 09:37 #5
Helt ærligt forstår jeg ikke hvad du vil lære af det eksempel.

Men OK jeg poster et.
Avatar billede arne_v Ekspert
06. april 2005 - 09:37 #6
Imports System
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Threading

Namespace DefaultNamespace
    Public Class MainForm
    Inherits Form
        Private send As Button
        Private server As TcpListener
        Private client As TcpClient
        Private rdr As StreamReader
        Private wrt As StreamWriter
        Public Sub New()
            InitializeComponent
            server = New TcpListener(IPAddress.Any, 1234)
            server.Start
            client = server.AcceptTcpClient
            rdr = New StreamReader(client.GetStream)
            wrt = New StreamWriter(client.GetStream)
            call (New Thread(AddressOf Reader)).Start
        End Sub
        <STAThread()> _
        Public Shared Sub Main(ByVal args As String())
            Application.Run(New MainForm)
        End Sub
        Private Sub InitializeComponent()
            send = New Button
            SuspendLayout
            send.Location = New Point(50, 50)
            send.Size = New Size(100, 50)
            send.Text = "Send"
            AddHandler send.Click, AddressOf SendClick
            ClientSize = New Size(200, 150)
            Controls.Add(send)
            Text = "Server"
            ResumeLayout(False)
        End Sub
        Sub SendClick(ByVal sender As Object, ByVal e As System.EventArgs)
            wrt.WriteLine("Good evening sir")
            wrt.Flush
        End Sub
        Private Sub Reader()
            Dim line As String
            line = rdr.ReadLine
            While Not (line Is Nothing)
                MessageBox.Show(line)
                line = rdr.ReadLine
            End While
        End Sub
    End Class
End Namespace
Avatar billede arne_v Ekspert
06. april 2005 - 09:37 #7
Imports System
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Threading

Namespace DefaultNamespace
    Public Class MainForm
    Inherits Form
        Private send As Button
        Private client As TcpClient
        Private rdr As StreamReader
        Private wrt As StreamWriter
        Public Sub New()
            InitializeComponent
            client = New TcpClient("localhost", 1234)
            rdr = New StreamReader(client.GetStream)
            wrt = New StreamWriter(client.GetStream)
            call (New Thread(AddressOf Reader)).Start
        End Sub
        <STAThread()> _
        Public Shared Sub Main(ByVal args As String())
            Application.Run(New MainForm)
        End Sub
        Private Sub InitializeComponent()
            send = New Button
            SuspendLayout
            send.Location = New Point(50, 50)
            send.Size = New Size(100, 50)
            send.Text = "Send"
            AddHandler send.Click, AddressOf SendClick
            ClientSize = New Size(200, 150)
            Controls.Add(send)
            Text = "Client"
            ResumeLayout(False)
        End Sub
        Sub SendClick(ByVal sender As Object, ByVal e As System.EventArgs)
            wrt.WriteLine("Godaw do")
            wrt.Flush
        End Sub
        Private Sub Reader()
            Dim line As String
            line = rdr.ReadLine
            While Not (line Is Nothing)
                MessageBox.Show(line)
                line = rdr.ReadLine
            End While
        End Sub
    End Class
End Namespace
Avatar billede burningice Nybegynder
06. april 2005 - 09:59 #8
jeg har også et her, med remoting:

Først et interface der skal kendes på både server og klient:

using System;

namespace RemotingInterface
{
    public interface IRemote
    {
        void ShowMessageBox(string str);
    }
}

Dernæst det program som der skal kunne kaldes metoder i:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;

namespace _606585
{
    /// <summary>
    /// Summary description for Form1.
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
        private TcpChannel tcpChannel;
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.Container components = null;

        public Form1()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            tcpChannel = new TcpChannel(2343);
            ChannelServices.RegisterChannel(tcpChannel);

            // Register the object at a well known URI End point
            RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteClass), "Server/RemoteClass.tcp", WellKnownObjectMode.SingleCall);
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            //
            // Form1
            //
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(292, 273);
            this.Name = "Form1";
            this.Text = "Form1";

        }
        #endregion

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.Run(new Form1());
        }
    }
}

public class RemoteClass : MarshalByRefObject, RemotingInterface.IRemote
    {       
        public void ShowMessageBox(string str)
        {
            System.Windows.Forms.MessageBox.Show(str);
        }
    }

Og til sidst en klient som kalder en metode på "server"-programmet:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;

namespace Client
{
    /// <summary>
    /// Summary description for Form1.
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
        private System.Windows.Forms.Button button1;
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.Container components = null;

        public Form1()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            //
            // TODO: Add any constructor code after InitializeComponent call
            //
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            //
            // button1
            //
            this.button1.Location = new System.Drawing.Point(184, 48);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(96, 24);
            this.button1.TabIndex = 0;
            this.button1.Text = "button1";
            this.button1.Click += new System.EventHandler(this.button1_Click);
            //
            // Form1
            //
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(292, 273);
            this.Controls.Add(this.button1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);

        }
        #endregion

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.Run(new Form1());
        }

        private void button1_Click(object sender, System.EventArgs e)
        {
            RemotingInterface.IRemote obj = (RemotingInterface.IRemote)Activator.GetObject(typeof(RemotingInterface.IRemote), "tcp://localhost:2343/Server/RemoteClass.tcp");
            obj.ShowMessageBox("whe");
        }
    }
}
Avatar billede arne_v Ekspert
26. april 2005 - 00:23 #9
agerled>

Kommet videre ?
Avatar billede agerled Nybegynder
26. april 2005 - 07:39 #10
Hej.

Nej ikke endnu.... men dit eksemplel:


Imports System
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Threading

Namespace DefaultNamespace
    Public Class MainForm
    Inherits Form
        Private send As Button
        Private client As TcpClient
        Private rdr As StreamReader
        Private wrt As StreamWriter
        Public Sub New()
            InitializeComponent
            client = New TcpClient("localhost", 1234)
            rdr = New StreamReader(client.GetStream)
            wrt = New StreamWriter(client.GetStream)
            call (New Thread(AddressOf Reader)).Start
        End Sub
        <STAThread()> _
        Public Shared Sub Main(ByVal args As String())
            Application.Run(New MainForm)
        End Sub
        Private Sub InitializeComponent()
            send = New Button
            SuspendLayout
            send.Location = New Point(50, 50)
            send.Size = New Size(100, 50)
            send.Text = "Send"
            AddHandler send.Click, AddressOf SendClick
            ClientSize = New Size(200, 150)
            Controls.Add(send)
            Text = "Client"
            ResumeLayout(False)
        End Sub
        Sub SendClick(ByVal sender As Object, ByVal e As System.EventArgs)
            wrt.WriteLine("Godaw do")
            wrt.Flush
        End Sub
        Private Sub Reader()
            Dim line As String
            line = rdr.ReadLine
            While Not (line Is Nothing)
                MessageBox.Show(line)
                line = rdr.ReadLine
            End While
        End Sub
    End Class
End Namespace


Hvad er det præcist det gør?
Avatar billede arne_v Ekspert
26. april 2005 - 07:55 #11
Prøv og køre dem.

Det er 2 programmer med hver sin form med 1 knap på hver.

Når man klikker på den kommer der en besked op på det andet program.
Avatar billede agerled Nybegynder
26. april 2005 - 17:43 #12
jeg får denne fejl:

Additional information: Der kunne ikke oprettes forbindelse, fordi destinationscomputeren aktivt nægtede det


på denne linie:
  client = New TcpClient("localhost", 1234)
Avatar billede arne_v Ekspert
26. april 2005 - 18:06 #13
Har du startet server programmet først ?
Avatar billede agerled Nybegynder
26. april 2005 - 19:32 #14
jeg har copy-pasted denne kode:

Imports System
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Threading

Namespace DefaultNamespace
    Public Class MainForm
    Inherits Form
        Private send As Button
        Private client As TcpClient
        Private rdr As StreamReader
        Private wrt As StreamWriter
        Public Sub New()
            InitializeComponent
            client = New TcpClient("localhost", 1234)
            rdr = New StreamReader(client.GetStream)
            wrt = New StreamWriter(client.GetStream)
            call (New Thread(AddressOf Reader)).Start
        End Sub
        <STAThread()> _
        Public Shared Sub Main(ByVal args As String())
            Application.Run(New MainForm)
        End Sub
        Private Sub InitializeComponent()
            send = New Button
            SuspendLayout
            send.Location = New Point(50, 50)
            send.Size = New Size(100, 50)
            send.Text = "Send"
            AddHandler send.Click, AddressOf SendClick
            ClientSize = New Size(200, 150)
            Controls.Add(send)
            Text = "Client"
            ResumeLayout(False)
        End Sub
        Sub SendClick(ByVal sender As Object, ByVal e As System.EventArgs)
            wrt.WriteLine("Godaw do")
            wrt.Flush
        End Sub
        Private Sub Reader()
            Dim line As String
            line = rdr.ReadLine
            While Not (line Is Nothing)
                MessageBox.Show(line)
                line = rdr.ReadLine
            End While
        End Sub
    End Class
End Namespace

Hvordan starter jeg så server programmet?
Avatar billede agerled Nybegynder
26. april 2005 - 19:33 #15
nååå det er den anden kode. øjeblik..
Avatar billede arne_v Ekspert
26. april 2005 - 19:34 #16
06/04-2005 09:37:32 = server
06/04-2005 09:37:54 = client
Avatar billede agerled Nybegynder
26. april 2005 - 19:38 #17
OK det virker.

Er der en måde jeg kan lave en liste over alle instanser af mit program der kører på netværket?

Jeg vil så kunne vælge en brugers program og kunne fremkalde en pop-up i hans app.

Jeg opretter gerne et nyt spm. om det...
Avatar billede arne_v Ekspert
26. april 2005 - 19:58 #18
Så skal du nok over i noget multicast
Avatar billede arne_v Ekspert
26. april 2005 - 20:00 #19
Avatar billede arne_v Ekspert
26. april 2005 - 20:00 #20
Koden er desværre C# men alle klasser og metoder er jo de samme i VB.NET
Avatar billede agerled Nybegynder
26. april 2005 - 20:13 #21
OK... det er vist lidt uden for mit område i øjeblikket.

Hvad med en liste med grupper og brugere i active directory hvor man kan lave en NET SEND til en bruger eller en gruppe...
Avatar billede arne_v Ekspert
29. april 2005 - 21:18 #22
pas
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester