使用Socket将文件从Java发送到C#

时间:2012-07-23 07:47:19

标签: c# java android sockets file-transfer

任何人都可以给我一个关于如何从java服务器向c#客户端发送文件以及从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();

    }

1 个答案:

答案 0 :(得分:0)

服务器或客户端使用的语言之间没有依赖关系。

只是数据的结构很重要!

您应该使用C#搜索有关套接字编程的一些教程。 例如:http://www.codeproject.com/Articles/10649/An-Introduction-to-Socket-Programming-in-NET-using

但语言并不重要,了解数据在网络上发送时的格式化。

编辑:您应该在数据中添加一个或两个字节来指示它的长度。这并不是因为一旦收到所有数据,你就没有数据可读。