2010-07-28 18 views
7

Ich entwickle zwei Anwendung ist Server-Anwendung und andere ist für Handheld-Gerät Anwendung kommunizieren beide über drahtlose Verbindung.Hier Client ist Handheld und Server ist mein Computer, wo Server-Anwendung ausgeführt wird. wenn ich Dateien vom Client zum Server sende es perfekt ohne Fehler senden, aber wenn Client-Anforderung für Dateien des Server produziert Fehler so etwas wie „Es kann keine Verbindung hergestellt werden, da der Zielcomputer aktiv verweigert 192.168.1.5:9050“Senden und Empfangen von Dateien Socket-Programmierung

seitigen Code

Server:

private bool SendData(string StrIP) 
    { 

     try 
     { 
      string strmyFile = Directory.GetCurrentDirectory() + "\\" + "XML" + @"\Login.xml"; 
      char[] delimiter = splitter.ToCharArray(); 
      split = strmyFile.Split(delimiter); 
      int limit = split.Length; 
      fName = split[limit - 1].ToString(); 

      byte[] fileName = Encoding.UTF8.GetBytes(fName); //file name 
      byte[] fileData = File.ReadAllBytes(strmyFile); //file 
      using (FileStream stream = File.OpenRead(strmyFile)) 
      { 
       fileData = new byte[stream.Length]; 
       stream.Read(fileData, 0, fileData.Length); 
      } 

      byte[] fileNameLen = BitConverter.GetBytes(fileName.Length); //lenght of file name 
      clientData = new byte[4 + fileName.Length + fileData.Length]; 

      fileNameLen.CopyTo(clientData, 0); 
      fileName.CopyTo(clientData, 4); 
      fileData.CopyTo(clientData, 4 + fileName.Length); 

      System.Net.IPAddress ipAdd = System.Net.IPAddress.Parse(StrIP); 

      try 
      { 
       Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
       IPEndPoint ipEnd = new IPEndPoint(ipAdd, 9050); 
       clientSock.Connect(ipEnd); //target machine's ip address and the port number 
       clientSock.Send(clientData); 
       clientSock.Close(); 
       ind = 1; 

       //Socket Sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
       //IPEndPoint ipEnd = new IPEndPoint(ipAdd, 9050); 
       //Sock.Bind(ipEnd);//target machine's ip address and the port number 
       //Sock.Listen(100); 

       //Socket clientSock = Sock.Accept(); 

       //clientSock.Send(clientData); 
       //clientSock.Close(); 
       //ind = 1; 
      } 
      catch (Exception ex) 
      { 

       req = false; 
       return false; 

      } 
      req = true; 
     } 
     catch (Exception ex) 
     { 

     } 
     return true; 
    } 


    public class StateObject 
    { 
     // Client socket. 
     public Socket workSocket = null; 

     public const int BufferSize = 1024 * 5000; 
     // Receive buffer. 
     public byte[] buffer = new byte[BufferSize]; 
    } 

    public static ManualResetEvent allDone = new ManualResetEvent(false); 

    public void StartListening() 
    { 


     byte[] bytes = new Byte[1024 * 5000]; 
     IPEndPoint ipEnd = new IPEndPoint(IPAddress.Any, 9050); 
     Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     try 
     { 
      listener.Bind(ipEnd); 
      listener.Listen(100); 

      while (true) 
      { 
       allDone.Reset(); 
       // string ip = listener.RemoteEndPoint.ToString(); 
       listener.BeginAccept(new AsyncCallback(AcceptCallback), listener); 
       allDone.WaitOne(); 

      } 
     } 
     catch (Exception ex) 
     { 

     } 

    } 


    public void AcceptCallback(IAsyncResult ar) 
    { 

     allDone.Set(); 


     Socket listener = (Socket)ar.AsyncState; 
     Socket handler = listener.EndAccept(ar); 

     StateObject state = new StateObject(); 
     state.workSocket = handler; 
     handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, 
     new AsyncCallback(ReadCallback), state); 

     flag = 0; 

    } 

    private bool req = false; 
    public void ReadCallback(IAsyncResult ar) 
    { 
     try 
     { 

      int fileNameLen = 1; 
      String content = String.Empty; 
      StateObject state = (StateObject)ar.AsyncState; 
      Socket handler = state.workSocket; 
      string[] str = new string[2]; 
      str = handler.RemoteEndPoint.ToString().Split(':'); 
      string path = Directory.GetCurrentDirectory() + "\\TEST\\" + str[0].ToString(); 
      if (!Directory.Exists(path)) 
      { 
       Directory.CreateDirectory(path); 
      } 
      if (req == false) 
      { 
       Sender snddata = new Sender(); 
       snddata.sendme(str[0].ToString()); 
       SendData(str[0].ToString()); 
      } 

      int bytesRead = handler.EndReceive(ar); 

      if (bytesRead > 0) 
      { 
        if (flag == 0) 
        { 
         fileNameLen = BitConverter.ToInt32(state.buffer, 0); 
         string fileName = Encoding.UTF8.GetString(state.buffer, 4, fileNameLen); 
         receivedPath = Directory.GetCurrentDirectory() + "\\TEST\\" + str[0].ToString() + @"\" + fileName; 
         flag++; 
        } 
        if (flag >= 1) 
        { 
         BinaryWriter writer = new BinaryWriter(File.Open(receivedPath, FileMode.Append)); 
         if (flag == 1) 
         { 
          writer.Write(state.buffer, 4 + fileNameLen, bytesRead - (4 + fileNameLen)); 
          flag++; 
         } 
         else 
          writer.Write(state.buffer, 0, bytesRead); 
         writer.Close(); 
         handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, 
         new AsyncCallback(ReadCallback), state); 
        } 
      } 
      else 
      { 

       Invoke(new MyDelegate(LabelWriter)); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 

     } 
    } 
public class Sender 
{ 
    public void sendme(string strIP) 
    { 
     try 
     { 
      // MessageBox.Show("That program can transfer small file. I've test up to 850kb file"); 
      IPEndPoint ipEnd = new IPEndPoint(IPAddress.Any, 9050); 
      Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); 
      sock.Bind(ipEnd); 
      sock.Listen(100); 

      while (true) 
      { 
       //clientSock is the socket object of client, so we can use it now to transfer data to client 
       Socket clientSock = sock.Accept(); 


       string fileName = "Login.xml";// "Your File Name"; 
       string filePath = Directory.GetCurrentDirectory() + "\\" + "XML" + @"\" ;//Your File Path; 
       byte[] fileNameByte = Encoding.ASCII.GetBytes(fileName); 

       byte[] fileData = File.ReadAllBytes(filePath + fileName); 
       byte[] clientData = new byte[4 + fileNameByte.Length + fileData.Length]; 
       byte[] fileNameLen = BitConverter.GetBytes(fileNameByte.Length); 

       fileNameLen.CopyTo(clientData, 0); 
       fileNameByte.CopyTo(clientData, 4); 
       fileData.CopyTo(clientData, 4 + fileNameByte.Length); 


       clientSock.Send(clientData); 
       //MessageBox.Show("File:{0} has been sent." + fileName); 
      } 
      //sock.Shutdown(SocketShutdown.Both); 
      //sock.Close(); 


      // Console.ReadLine(); 
      //sendme(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("File Receiving fail." + ex.Message); 
     } 
    } 
} 

Client-Seite Code:

public class StateObject 
    { 
     // Client socket. 
     public Socket workSocket = null; 

     public const int BufferSize = 1024; 
     // Receive buffer. 
     public byte[] buffer = new byte[BufferSize]; 
    } 

    public static ManualResetEvent allDone = new ManualResetEvent(false); 

    public void StartListening() 
    { 
     byte[] bytes = new Byte[1024]; 
     IPAddress address = IPAddress.Parse(ServerIP); 
     IPEndPoint ipEnd = new IPEndPoint(address, 9050); 
     Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     try 
     { 
      listener.Bind(ipEnd); 
      listener.Listen(100); 

      while (true) 
      { 
       allDone.Reset(); 
       // string ip = listener.RemoteEndPoint.ToString(); 
       listener.BeginAccept(new AsyncCallback(AcceptCallback), listener); 
       allDone.WaitOne(); 

      } 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 


    } 


    public void AcceptCallback(IAsyncResult ar) 
    { 

     allDone.Set(); 


     Socket listener = (Socket)ar.AsyncState; 
     Socket handler = listener.EndAccept(ar); 


     StateObject state = new StateObject(); 
     state.workSocket = handler; 
     handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, 
     new AsyncCallback(ReadCallback), state); 
     flag = 0; 
    } 

    public void ReadCallback(IAsyncResult ar) 
    { 

     try 
     { 

      int fileNameLen = 1; 
      String content = String.Empty; 
      StateObject state = (StateObject)ar.AsyncState; 
      Socket handler = state.workSocket; 
      //string[] str = new string[2]; 
      //str = handler.RemoteEndPoint.ToString().Split(':'); 
      string path = mypath + "@Login.XML"; 
      if (!Directory.Exists(path)) 
      { 
       Directory.CreateDirectory(path); 
      } 

      int bytesRead = handler.EndReceive(ar); 

      if (bytesRead > 0) 
      { 

       if (flag == 0) 
       { 
        fileNameLen = BitConverter.ToInt32(state.buffer, 0); 
        string fileName = Encoding.UTF8.GetString(state.buffer, 4, fileNameLen); 
        receivedPath = mypath + "@Login.XML"; 
        flag++; 
       } 
       if (flag >= 1) 
       { 
        BinaryWriter writer = new BinaryWriter(File.Open(receivedPath, FileMode.Append)); 
        if (flag == 1) 
        { 
         writer.Write(state.buffer, 4 + fileNameLen, bytesRead - (4 + fileNameLen)); 
         flag++; 
        } 
        else 
         writer.Write(state.buffer, 0, bytesRead); 
        writer.Close(); 
        handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, 
        new AsyncCallback(ReadCallback), state); 
       } 

      } 
      else 
      { 

       Invoke(new MyDelegate(LabelWriter)); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 

     } 
    } 
    public void LabelWriter() 
    { 
     MessageBox.Show("Data has been received"); 
     Programs p = new Programs(); 
     p.GetFile(serverIP); 
    } 

dieser Code wird verwendet Datei vom Server zu erhalten.

private void GetLoginTemp() 
    { 
     Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     try 
     { 
      char[] delimiter = splitter.ToCharArray(); 
      byte[] fileName = Encoding.UTF8.GetBytes("empty"); //file name 
      byte[] fileData; 
      fileData = Encoding.UTF8.GetBytes("empty"); 
      //byte[] fileData = reads.ReadToEnd().to; //file 
      byte[] fileNameLen = BitConverter.GetBytes(fileName.Length); //lenght of file name 
      clientData = new byte[4 + fileName.Length + fileData.Length]; 

      fileNameLen.CopyTo(clientData, 0); 
      fileName.CopyTo(clientData, 4); 
      fileData.CopyTo(clientData, 4 + fileName.Length); 
      System.Net.IPAddress ipAdd = System.Net.IPAddress.Parse(serverIP); 

      IPEndPoint ipEnd = new IPEndPoint(ipAdd, 9050); 
      clientSock.Connect(ipEnd); //target machine's ip address and the port number 
      clientSock.Send(clientData); 

      byte[] clientData1 = new byte[1024 * 5000]; 
      string receivedPath = mypath + @"\XML" + @"\Login.xml"; 

      int receivedBytesLen = clientSock.Receive(clientData1); 

      int fileNameLen1 = BitConverter.ToInt32(clientData1, 0); 
      string fileName1 = Encoding.ASCII.GetString(clientData1, 4, fileNameLen1); 

      BinaryWriter bWrite = new BinaryWriter(File.Open(receivedPath + fileName, FileMode.Append)); ; 
      bWrite.Write(clientData, 4 + fileNameLen1, receivedBytesLen - 4 - fileNameLen1); 
      //clientSock.Shutdown(SocketShutdown.Send); 

      clientSock.Close(); 
     } 
     catch (Exception ex) 
     { 
      clientSock.Close(); 
      MessageBox.Show(ex.Message); 
     } 
    } 

Antwort

8

Sie scheinen zu denken, dass Sie eine zweite TCP-Verbindung in der Richtung benötigen, in der die Datei ausgeführt wird. Dies ist nicht notwendig, da die TCP-Verbindung Vollduplex-Stream ist. Es ist auch nie ein gutes Design, sich vom Server zurück zum Client zu verbinden, der hinter einem NAT-Gateway/Firewall steckt. Dies ist das Problem mit FTP (siehe active vs passive ftp).

Verwenden Sie dieselbe Verbindung, die der Client bereits eingerichtet hat. Sie benötigen eine Art von Protokoll auf der Basis von TCP, um die andere Seite wissen zu lassen, wann und wie viel Daten zu erwarten sind. Dies wurde hier oft diskutiert, siehe zum Beispiel this SO question.

0

gerade von dem Fehler, den Sie bekommen (ich habe den gleichen Fehler viele, viele Male bekommen) Überprüfen Sie, ob die zugrunde liegenden Stream Sie für Ihre Kommunikation verwenden nicht geschlossen ist, oder dass Sie versuchen, nicht re- Verwenden Sie einen geschlossenen Stream.

Haben Sie eine bestimmte Zeile, in der der Fehler auftritt?

+0

Brandon Gesicht, das ich diesen Fehler „Keine Verbindung hergestellt werden konnte, da der Zielcomputer aktiv verweigert 192.168.1.5:9050“ Dieser Fehler ich Gesicht in senddata-Funktion. –

+0

Haben Sie eine Zeilennummer oder andere Informationen? Ich habe den Code durchgesehen und ich denke, dass Sie versuchen, den serverseitigen Code auf Client und Server auszuführen. Sie müssen eine Seite als Zuhörer haben und eine, die aktiv ausgeht und den Hörer sucht, wenn er die Daten benötigt. Da TCP verbindungsorientiert ist, sollte nach der ersten Verbindung die gesamte Übertragung unter Verwendung des in der Verbindung eingerichteten Streams stattfinden. – Brandon

0

Sie sollten die Systemfirewalls überprüfen, um sicherzustellen, dass die Verbindung zulässig ist. Die Verwendung von Ping und Telnet eignet sich hervorragend zum Debuggen.

0

Wenn es nicht der Firewall ist, denke ich, es so einfach wie der Server setzen, um zu hören (starten Sie den Server)

ich dieses Stück Code würde vorschlagen, Ihr Problem lösen:

var prg = StateObject(); 
prg.StartListening; 

nachdem Sie diese verwalten werde, erklären Sie mir bitte, wenn die Datei über 8 KB

voll gesendet wird