begin process at 2010 02 09 23:03:18
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C#

 > 

Archives

 > 

Au secours

 > 

Multi threading using TCP and socket


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Multi threading using TCP and socket

vendredi 10 septembre 2004 à 15:15:20 | Multi threading using TCP and socket

gdupasqu

Bonjour,
je suis entrain d'écrire un programme (client et serveur).
Le serveur fonctionne comme ceci:
1. Le serveur écoute sur un port fixé.
2. Lorsqu'un client se connecte, il lance un thread qui va lire les données du client et les écrire sur une fenêtre dos.

[b]Le client:[\b]
1. Le client se connecte sur un port défini par le serveur.
2. Lorsque le client est connecté, il envoie des données.

Pour que je puisse gérer la connection de plusieurs clients à la fois, chaque fois qu'un client se connecte, une socket est crée. J'ai donc un tableau de socket (fonction comme une pile). Lorsqu'un client se déconnecte, la socket se ferme et peu être réutilisée.

[b]J'ai le problème suivant du côté serveur:[\b]

Lorsqu'une socket a été fermée par close, elle ne peut pas être réouverte (Cannot access a disposed object...) Si je ne ferme pas la socket (Close()), je peux la réutiliser mais elle n'est plus utilisable (socket.available() = false). Pourriez-vous me donner une solution pour que je puisse réinitialiser une socket ou détruire un objet afin de le recréer.


Voici mon code du côté serveur:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Net.Sockets;
using System.Text;
using System.IO ;
using System.Net ;
using System.Threading ;



namespace ServerNS
{
public class ServerC
{

private int port = 2564; (fixe)
private bool stop = true;
private TcpListener socketListen;
private Thread threadServer;
private int numberSocket = 0;
private Socket[] socketListenerList = new Socket[100];

public void ServerM()
{
// Creation d'une thread au chargement associer a la fontion Ecoute()
threadServer = new Thread(new ThreadStart(Listen));
threadServer.Start() ;
Console.WriteLine("thread started");
}


public void Listen()
{
try
{
// initialisation de la socket d'ecoute
socketListen = new TcpListener(port);
socketListen.Start();
Console.WriteLine("Wait data");
// On accepte un client si celui ce presente a l'aide d'une autre socket
// clientSocket est donc associer au client

while(true){
// Block until a client is connected
socketListenerList[numberSocket] = socketListen.AcceptSocket();
Console.WriteLine("Socket Accepted");

Thread receiveThread;

// Call the thread receiveData when a remote socket is connected

receiveThread = new Thread(new ThreadStart(receiveData));
receiveThread.Start();

//Mettre en suspend le thread principal
threadServer.Suspend();
// Socket crée, incrémente ID
numberSocket++;
}
}
catch(Exception e)
{
Console.WriteLine("{0}",e);
stop = false;
socketListen.Stop();
socketListenerList[0].Close();
}
}

public void receiveData()
{
int SID = numberSocket;
Console.WriteLine("ID: {0}",SID);
// Resume le thread principal
threadServer.Resume();

// socket bloquant socketListenerList[SID].Blocking = true;
//attente de donnée arrivant du Client avec une boucle infinie
// Creation d'un tableau de byte pour contenir les donnés reçu
Byte[] buffer = new Byte[1024];

Console.WriteLine("available ?");

// Regarde si des données sont en attente
while(socketListenerList[SID].Available == 0);
Console.WriteLine("Yes");

// on met les bytes recuperé dans le tableau
socketListenerList[SID].Receive(buffer);

//On traduit les Bytes en caractère ASCII lisible
string data = Encoding.ASCII.GetString(buffer);

int length = buffer.Length;

for( int i = 0 ; i < length ; i++){
Console.Write(data[i]);
// Ecrit données sur stdout
if(buffer[i] == 0){
break;
}
}

//socketListenerList[SID].Shutdown(SocketShutdown.Both);
// Faut-il fermer la socket ?
socketListenerList[SID].Close();
// Socket fermée donc décrément ID
numberSocket--;
}



[STAThread]
static void Main()
{
ServerC serv = new ServerC();
serv.ServerM();
}



}
}



Cette discussion est classée dans : system, client, socket, thread, using


Répondre à ce message

Sujets en rapport avec ce message

Multi Threading en utilisant TCP [ par gdupasqu ] Bonjour,je suis entrain d'écrire un programme (client et serveur).Le serveur fonctionne comme ceci:1. Le serveur écoute sur un port fixé.2. Lorsqu'un Client IRC [Sockets/Threads] [ par SpecialCharacter ] Bonjour, je me suis mis à la programmation d'un petit client IRC Il ressemble en beaucoup de points à tous ceux des débutants je n'en doute pas. Il e controle listbox dans un thread [ par diego29 ] bonjour ,je souhaite afficher des nombres premiers dans une listbox à travers un threadvoici mon code sans erreur de compilation mais qui n'affiche ri WebService& appWindows [ par ange_sali ] Bonsoir; J'ai une projet nommé : client (application Windows avec csharp) Et une WebServic [C#] dataset typés [ par philo71 ] Bonjour, Je développe un appli en C# 2003 avec SQL serveur 2000.je cherche des infos sur les datasets typés, j'ai quelques questions a vous poser. Je problème avec thread jouant un son! [ par othland ] slt tlm;je voulais concevoir un programme qui lance un thread qui lui même surveille l'horloge système pour lancer un son, le problème c'est que quand pb: ou placer un thread???? [ par othland ] slt tlm;c'est la première fois que je travaille avec des thread sous visual C#.j'ai un programme qui gère plusieurs fenêtres...etc.je veux qu'en paral Comparaison entre C# et C!!!! [ par moihenry ] Voila j'ai un problème : j'envoi une commande a un serveur cod: "ÿÿÿÿgetstatus" //pour avoir les info des serveurje recois cette réponse : ÿÿÿÿdisconn Threads en csharp [ par moi411 ] Bonsoir à tous,Pour être bref le thread que j'utilise marche mais seulement avec l'utilisation d'une MessageBox dans le programme principal...Mon prog Cross-Thread Erreur [ par piradom ] Bonjour, voila j'suis un debutant en programmation, je suis tomber sur cette source, mais lorsque je lance l'application, Visual Studio m'indique qu'i


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,702 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales