Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c语言中的TCP IP安卓客户端(电话)和PC服务器#_C#_Android - Fatal编程技术网

C# c语言中的TCP IP安卓客户端(电话)和PC服务器#

C# c语言中的TCP IP安卓客户端(电话)和PC服务器#,c#,android,C#,Android,我想从我的手机发送一个大文件到PC服务器,这个文件是用c#写的,代码如下 客户端 File sdFile=new File(mRcordFilePath); byte[] mybytearray = new byte[(int) sdFile.length()]; FileInputStream fis = null; try { fis = new FileInputStream(sdFile); } catch (FileNotFou

我想从我的手机发送一个大文件到PC服务器,这个文件是用c#写的,代码如下

客户端

    File sdFile=new File(mRcordFilePath);

    byte[] mybytearray = new byte[(int) sdFile.length()];
    FileInputStream fis = null;
    try {
        fis = new FileInputStream(sdFile);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    BufferedInputStream bis = new BufferedInputStream(fis);
    DataInputStream dis = new DataInputStream(bis);
    OutputStream os;

    try {

        os = socket.getOutputStream();
        DataOutputStream dos = new DataOutputStream(os);
        String name=sdFile.getName();
        dos.writeUTF(name);
        dos.writeLong(mybytearray.length);
        int read;
        while((read = dis.read(mybytearray)) != -1) {
            dos.write(mybytearray, 0, read);
        }

        Toast.makeText(getApplicationContext(),
                "Veri Gönderildi !", Toast.LENGTH_SHORT).show();
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
服务器端

服务器部分

            int fileNameLen = 1;
            String content = String.Empty;
            StateObject state = (StateObject)ar.AsyncState;
            Socket handler = state.workSocket;
            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 = @"C:\Users\Hankishan\Desktop\kayıtlar\" + 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));
        }
如果我运行这个代码, 在接收文件(例如123.wav)时,此行有错误

string fileName = Encoding.UTF8.GetString(state.buffer, 4, fileNameLen);
如果我将代码更改为

fileNameLen = state.buffer[1];
string fileName = Encoding.UTF8.GetString(state.buffer, 2, fileNameLen);
没关系。但此时收到的文件已损坏,无法在PC中播放,
我能做什么?什么问题?

我解决了这个问题。代码在这里

公共void ReadCallback(IAsyncResult ar)

{

int fileNameLen=1;
String content=String.Empty;
StateObject状态=(StateObject)ar.AsyncState;
套接字处理程序=state.workSocket;
int bytesRead=handler.EndReceive(ar);
如果(字节读取>0)
{
如果(标志==0)
{
fileNameLen=state.buffer[1];
//fileNameLen=BitConverter.ToInt32(state.buffer,0);
字符串文件名=Encoding.UTF8.GetString(state.buffer,2,fileNameLen);
receivedPath=@“C:\Users\Hankishan\Desktop\kayitlar\”+文件名;
flag++;
}
如果(标志>=1)
{
BinaryWriter=新的BinaryWriter(File.Open(receivedPath,FileMode.Append));
如果(标志==1)
{
writer.Write(state.buffer,2+fileNameLen,bytesRead-(2+fileNameLen));
flag++;
}
其他的
{
如果(标志==2)
{
for(int i=0;i
            int fileNameLen = 1;
            String content = String.Empty;
            StateObject state = (StateObject)ar.AsyncState;



            Socket handler = state.workSocket;
            int bytesRead = handler.EndReceive(ar);

            if (bytesRead > 0)
            {
                if (flag == 0)
                {
                    fileNameLen = state.buffer[1];
                    //fileNameLen = BitConverter.ToInt32(state.buffer, 0);
                    string fileName = Encoding.UTF8.GetString(state.buffer, 2, fileNameLen);
                    receivedPath = @"C:\Users\Hankishan\Desktop\kayitlar\" + fileName;
                flag++;
            }
            if (flag >= 1)
            {
                BinaryWriter writer = new BinaryWriter(File.Open(receivedPath, FileMode.Append));
                if (flag == 1)
                {

                    writer.Write(state.buffer, 2 + fileNameLen, bytesRead - (2 + fileNameLen));
                    flag++;
                }
                else
                {
                    if (flag == 2)
                    {
                        for (int i = 0; i < state.buffer.Length; i++)
                        {
                            if (i + 8 == 1023)
                                break;
                            state.buffer[i] = state.buffer[i + 8];
                        }
                        writer.Write(state.buffer, 0, bytesRead);
                        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));
        }

        }