30. september 2003 - 14:51Der er
21 kommentarer og 1 løsning
Socket, Objekter
HEjsa
Jeg har en class Packet indeholdende nogle instansvariabler og dertilhørende get/set metoder. denne klasses instantieres i et objekt som skal sendes over netværk via stream sockets. Hvordan lader dette sig gøre, når man kun kan kan sende byte[]. med andre ord. Hvordan konverterer man en hel klasse til et byteArray så det kan sendes med sockets? Og hvordan konverterer man det tilbage igen efter modtagelse på destinationen?
I et inbound callcenter, hvor identiteten på den, der ringer ind, skal bekræftes, kan kontrollen nu foregå i telefonkøen. Det understøtter fem centrale KPI'er for callcentre.
Jeg har leget med et lignende eksempel og kan konstatere det fungerer. MEn min fejl må da skyldes en anden ting. Du skal nok få point da du har besvaret mit spørgsmål, men håber du er interesseret i at komme med et byd på fejlen.
jeg har en SocketServer og en SocketClient. Disse befinder sig i henholdsvis namespace TidsurServer og namespace SimpleClient. Objektet (class Packet) bliver serialiseret fint og afsendt. Men ved modtagelse får jeg følgende fejl når jeg prøver at tilgå objektet med: Console.WriteLine("ClientID " + packet.IClientId + " PAcketID " + packet.IPacketID + " Command " + packet.SCommand + " UserName " + packet.SUserName + "HostName " + packet.SHostName + " kort " + packet.IKort + " Nummer " + packet.INummer);
Fejl: Serialization Error occured! :Cannot find the assembly simpleClient, Version=1.0.1369.11748, Culture=neutral, PublicKeyToken=null. Packet received! An unhandled exception of type 'System.NullReferenceException' occurred in TidsurServer.exe
//Identify and connect to the remote endpoint. IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Parse("EN IPDADRESSE!!!!!!!!!!!!!"), SAMPLETCPPORT);
soc.Connect(remoteIpEndPoint);
//Packet containing LogIn Information // create a packet so the client gets its ID. A packet ID of 1 //indicates that the stream is sent from client Packet packet = new Packet( -1, 1, "login", "sbm", "sbm", 1, 2); Console.WriteLine("Sending Packet To :" + soc.RemoteEndPoint);
Server: using System; using System.Threading; using System.Globalization; using System.Net; using System.Net.Sockets; using System.Runtime.Serialization.Formatters.Binary; using System.IO;
class Server { //Network Variables private const int port = 9999; private Socket soc; private Socket acceptSocket; //System variables private Packet packet;
public void serverRunning() { byte[] received = new byte[1024]; //initialising listenSocket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//making endpoint to bind to IPEndPoint localIpEndPoint = new IPEndPoint(IPAddress.Parse("EN IPADRESSE!!!!!!!!!"), port);
//binding soc.Bind(localIpEndPoint);
//Listening for client connections soc.Listen(10);
Console.WriteLine("Server is listening for Client Connection Attempts"); Console.WriteLine("");
acceptSocket = soc.Accept();
Console.WriteLine("Client connected!");
int bytesReceived = acceptSocket.Receive(received, acceptSocket.Available, SocketFlags.None);
koden kompilerer. Der laves en exception når jeg prøver at udskrive iClientId fra packet objektet på serversiden efter at have modtaget objektet. På client siden laver jeg et packet objekt om til bytearray og tilbage igen og udskriver for at vise det kan lade sig gøre... derefter sender jeg til serveren
accepterede lige dit svar. Server og client ligger i hver sin mappe med hver sin packetklasse. De er så identiske. MEn måske jeg sku ligge packet i sin egen folder og dermed bruge præcist den samme fil begge steder?
jeg har nu løst problemet. Jeg delte class Packet sourcefilen mellem klienten og serveren således objektet på henh. server og klient-side bliver oprettet udfra samme sourcefil. Og så virker det. Men takker for din interesse og den hjælp du har givet.
Det er godt nok længe siden jeg baksede med det problem :-). Helt tilbage i 2003 så det kniber altså med at huske det.
Hvis jeg husker rigtigt (hvilket aboslut ikke kan garanteres) så havde jeg den samme source-fil (Packet.cs) liggende 2 steder. Dvs. både i min server mappe og en tilsvarende i min client mappe. Jeg vil tro jeg endte med at oprette en anden mappe (måske: util) og lagde Packet.cs deri og lod client og server refere til den fil.
Men, som sagt. Det ligger adskillige år tilbage og jeg ovenstående projekt er for længst out of sight :-).
Håber denne kommentar kan bruges til noget. Ellers har jeg nok ikke rigtig flere ideer.
Jeg fik det løst ved at bruge en binder, og deri kunne jeg replace assembly og typename, så de stemte overens med applikatiolnen.
Synes godt om
Ny brugerNybegynder
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.