g1024:Καλησπέρα σας.
Προσπαθώ να φτιάξω μία Κλάση σε C# όπου θα μπορώ σε μελλοντικά μου Projects να την κάνω Instanse και να παίρνω μεσώ Δικτύου κάποια δεδομένα απο ένα μηχάνημα.
Εχω δημιουργησει ένα Event για να "λεέι" στην φόρμα (απ' οπου θα κάνω instanse την κλάση) ότι ήρθαν δεδομένα.Παραθέτω τον κώδικα της κλάσης και της φόρμας.
ΚΛΑΣΗ....
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Windows.Forms;
namespace Telemanager
{
public enum ConnectionType //Ο τύπος της σύνδεσης (Serial ή Network)
{
Serial,
NetWork
}
public delegate void gotData();
class PbxCon
{
private Socket client; // To Socket
private byte[] data = new byte[1024]; // Τα Δεδομένα Πρός αποστολή.
private int size = 1024; // Το μέγεθος του Buffer.
public string stringData = ""; // Τα εισερχόμενα Δεδομένα.
Socket newSocket = new Socket(AddressFamily.InterNetwork, // Δημιουργούμε ένα νέο Socket Με πρωτόκολλο TCP και
SocketType.Stream, ProtocolType.Tcp); // για ανταλλαγή δεδομένων ροής.
public event gotData tcpStream; // Αυτό το Event θα καλείτε για να κάνει fire triger ότι ήρθαν δεδομένα.
public PbxCon(string Host, int tcpPort) // Η μέθοδος όπου ξεκινά η σύνδεση του με τον Host.
{
newSocket.BeginConnect(Host, tcpPort, new AsyncCallback(Connected), newSocket); // Δημιουργία ασύγχρωνης επικοινωνίας με τον Host όπου για την κατάσταση της σύνδεσης
} // θα μας τα στείλει στην μέθοδο Connected.
private void Connected(IAsyncResult iar)
{
client = (Socket)iar.AsyncState;
try
{
client.EndConnect(iar);
// MessageBox.Show("Connected to: " + client.RemoteEndPoint.ToString());
client.BeginReceive(data, 0, size, SocketFlags.None,
new AsyncCallback(ReceiveData), client);
}
catch (SocketException)
{
MessageBox.Show("Error connecting");
}
}
private void ReceiveData(IAsyncResult iar)
{
// MessageBox.Show("We Have Data!");
Socket remote = (Socket)iar.AsyncState;
int recv = remote.EndReceive(iar);
if (recv > 1)
{
stringData += Encoding.ASCII.GetString(data, 0, recv);
client.BeginReceive(data, 0, size, SocketFlags.None,
new AsyncCallback(ReceiveData), client);
remote.EndReceive(iar);
Thread thNew = new Thread(new ThreadStart(houstonWeHaveData));
thNew.Start();
}
}
}
private void houstonWeHaveData()
{
tcpStream();
}
}
private void SendData(IAsyncResult iar)
{
Socket remote = (Socket)iar.AsyncState;
int sent = remote.EndSend(iar);
remote.BeginReceive(data, 0, size, SocketFlags.None,
new AsyncCallback(ReceiveData), remote);
}
public void Send(string n)
{
byte[] message = Encoding.ASCII.GetBytes(n);
client.BeginSend(message, 0, message.Length, SocketFlags.None,
new AsyncCallback(SendData), client);
}
}
}
ΦΟΡΜΑ....
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
namespace Telemanager
{
public partial class Form1 : Form
{
private PbxCon n;
public Form1()
{
InitializeComponent();
n = new PbxCon("127.0.0.1", 5100);
n.tcpStream += new gotData(n_Message);
}
private void button1_Click(object sender, EventArgs e)
{
textBox1.Text = n.stringData;
}
public void n_Message()
{
textBox1.Text = n.stringData;
}
}
}
Το πρόβλημα μου έιναι το εξής ,όταν γίνεται Fire το Event tcpStream κλεινει η εφαρμογή μου (χωρίς να κλείσει το IDE του Visual Studio) χωρίς κανένα μηνυμα λάθους, αν βγάλω το textBox1.Text = n.stringData; και βάλω τα δεδομένα να εμφανιστούν σε ένα MessageBox δουλέυει κακονικά!!!
Καμια ιδέα;
Ευχαριστώ.
Μετα κόπον και βασάνον πρόσθεσα τον παραπάνω κώδικα και έστρωσε!
Ευχαριστώ.