2012-07-23 72 views
0

任何人都可以給我一個關於如何發送文件從Java服務器到C#客戶端,並從C#接收完整的確認消息到Java的小教程。其實我是C#的新手,不知道如何做套接字編程。我長期堅持下去。嘗試了很多代碼。有些代碼會收到不完整的文件,其中一些會陷入死循環。在這方面請幫助我。 感謝發送文件從Java到C#使用套接字

編輯 這是我曾嘗試:

C#服務器:

{ 

      IPAddress ipAd = IPAddress.Parse("192.168.1.131"); 
      // use local m/c IP address, and 

      // use the same in the client 


      /* Initializes the Listener */ 
      TcpListener myList = new TcpListener(ipAd, 5600); 

      /* Start Listeneting at the specified port */ 
      myList.Start(); 

      Console.WriteLine("The server is running at port 5600..."); 
      Console.WriteLine("The local End point is :" + 
           myList.LocalEndpoint); 
      Console.WriteLine("Waiting for a connection....."); 
     m: 
      clientSock = myList.AcceptSocket(); 

      //clientSock.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReceiveTimeout,10000); 


      Console.WriteLine("Connection accepted from " + clientSock.RemoteEndPoint); 

      //byte[] b = new byte[100]; 
      //int k = clientSock.Receive(b); 
      string fileName = "hello.wav"; 


      NetworkStream networkStream = new NetworkStream(clientSock); 

      StreamReader sr = new StreamReader(networkStream); 

      //read file length 
      int length = int.Parse(sr.ReadLine()); 

      if (networkStream.CanRead) 
      { 
       BinaryWriter bWrite = new BinaryWriter(File.Open(receivedPath + fileName, FileMode.Create)); 
       int receivedBytesLen = -1; 
       byte[] clientData = new byte[4096 * 5000]; 

       receivedBytesLen = networkStream.Read(clientData, 0, clientData.Length); 
       bWrite.Write(clientData, 0, receivedBytesLen); 

       do 
       { 
        receivedBytesLen = networkStream.Read(clientData, 0,clientData .Length); 
        bWrite.Write(clientData, 0, receivedBytesLen); 
       } while (receivedBytesLen > 0); 

       bWrite.Close(); 
       networkStream.Close(); 


      } 


      Console.WriteLine("Client:{0} connected & File {1} started received.", clientSock.RemoteEndPoint, fileName); 
      Console.WriteLine("File: {0} received & saved at path: {1}", fileName, receivedPath); 


      Recognizer_2 recognizeVoice = new Recognizer_2(clientSock); 
      recognizeVoice.recognize_wav(); // Acknowledgement 
      Console.WriteLine("\nResult Sent to the Client"); 
      goto m; 
     } 

Java客戶端:

 Socket socket = new Socket("192.168.1.131", 5600); 


     BufferedReader response_Stream = new BufferedReader(
       new InputStreamReader(socket.getInputStream())); 
     File f = new File(mFileName); 
     byte[] buffer = new byte[(int) f.length()]; 
     FileInputStream fis = new FileInputStream(f); 

     BufferedInputStream bis = new BufferedInputStream(fis); 


     bis.read(buffer, 0, buffer.length); 
     OutputStream outputStream = socket.getOutputStream(); 
     outputStream.write(buffer); 

     outputStream.flush(); 

     String final_Result_String = ""; 

     if (response_Stream != null) { 
      String respose_text = ""; 
      while ((respose_text = response_Stream.readLine()) != null) { 

       final_Result_String += respose_text; 

      } 

     } 

     Toast.makeText(getApplicationContext(), final_Result_String, 1) 
       .show(); 
     outputStream.close(); 

    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 

    } 
+0

套接字幾乎沒有意義:你想使用哪種協議?它的定義是否是自定義的? – 2012-07-23 07:48:40

+0

[你有什麼嘗試?](http://mattgemmell.com/2008/12/08/what-have-you-tried/)I.e.請向我們展示一些代碼,請參閱http://sscce.org/。 – 2012-07-23 07:49:27

+0

我想使用TCP協議。 – 2012-07-23 07:49:35

回答

0

還有所使用的語言之間沒有任何的Dependance服務器或客戶端。

只是數據的結構很重要!

您應該搜索一些關於使用C#進行套接字編程的教程。 例如:http://www.codeproject.com/Articles/10649/An-Introduction-to-Socket-Programming-in-NET-using

但語言並不重要,瞭解數據在網絡上發送時如何格式化。

編輯:你應該在數據中添加一個或兩個字節來指示它的長度。這並不是因爲一旦收到所有數據,就沒有數據可讀。

+0

謝謝,但是我被卡在了代碼的某個地方。無法接收完整文件 – 2012-07-23 07:56:38

+0

也許你沒有使用一個好的測試來知道什麼時候停止閱讀緩衝區中可用的字節數是不夠的,將長度加到你發送的數據上 – 2012-07-23 07:57:39

+0

可能是......任何像樣的解決方案你有什麼???我應該在循環條件下寫什麼??? – 2012-07-23 07:58:51