[Mono-devel-list] xmlserializer and sockets

ultrakorne ultrakorne at paranoici.org
Thu Dec 2 12:39:47 EST 2004


hi, i have some problems with my client talk to my server...
i am using xmlserializer to serialize object and send them to the other 
side of the connection. I need to send / recive by both client and 
server. client after login waits all the time listening for objects on a 
thread, and sends objects on users events on the main thread. server 
waits connections, start a new thread for each connection and after 
validating login waits for object, and answer with an object to every 
incoming object.

If i send only one packet, all works fine, i tryed many solution but i 
cannot send 2 packets, or send and recive...

here is my code:

LoginPacket is a class with informations

SERVER SIDE:
the method run of this class is launched as a thread to serve a client, 
with a socket initializated (and passed as parameter)
now for testing it will only waits for 2 login packets

public class ServeClient {
  	private Socket sock;
   	public ServeClient(Socket s) {
   		this.sock = s;
   	}
  	public void Run(){
		NetworkStream networkStream = new NetworkStream(sock);
  			
  		//waiting for login request
		LoginPacket lp;
		this.DeserializeMessage( networkStream, out lp);
		
		LoginPacket lp2;
		this.DeserializeMessage( networkStream, out lp2);
		
		
		Console.WriteLine("Incoming login request: {0}", lp.Nick);
		
		networkStream.Close();
		sock.Close();
	}
	// this will deserialize the message, and put it in message
	public bool DeserializeMessage(NetworkStream networkStream,out 
LoginPacket message) {
		Byte []buffer=new Byte[500];
		XmlSerializer deserializer=new XmlSerializer(typeof(LoginPacket));
		int count=networkStream.Read(buffer,0,buffer.Length);
		if(count <= 0) {
			message=null;
			return false;
		}
		MemoryStream memoryStream=new MemoryStream(buffer,0,count);
		message= ((LoginPacket)deserializer.Deserialize(memoryStream));
		return true;
	}
}

CLIENT SIDE:
// run is launched as a thread, this thread will wait listening after
// login succed. now for testing it will only send 2 login requests
class ListenerThread {
	private TcpClient client; //FIXME : it is no syncronized
	public void Run() {
		client = new TcpClient( "localhost", 6666);;
		
		
		LoginPacket login = new LoginPacket( PacketType.LOGIN_REQUEST, "nick", 
"pass");
		
		LoginPacket login2 = new LoginPacket( PacketType.LOGIN_REQUEST, 
"nick2", "pass2");
			

		this.Send(login);
		this.Send(login2);

		client.Close();
		
	}
	//send a loginpacket
   	public void Send(LoginPacket message) {
		NetworkStream netWorkStream=null;
		XmlSerializer serializer=new XmlSerializer(message.GetType()); 
//Fixme: metterlo fuori dal metodo
		netWorkStream = client.GetStream();
		Stream stream=(Stream)netWorkStream;
		serializer.Serialize(stream,message); 	
	}
}

thx if someone can solve my problems.

regards
sam



More information about the Mono-devel-list mailing list