java socket缓冲区和字符串

时间:2013-09-28 21:22:39

标签: java sockets buffer

对于作业,我尝试发送文件和与该文件对应的一些参数。 所以,我发送我的文件后,我的字符串。 问题是我的参数转到我的文件而不是我的变量。我理解这个问题,我的循环,只要他收到一些东西,继续写入文件,但我想停止它,并将我的参数从我的文件外面。

这是我的代码客户端:

public static void transfert(InputStream in, OutputStream out) throws IOException{
        PrintWriter printOut;
        byte buf[] = new byte[1024];   
        int n;
        while((n=in.read(buf))!=-1)
            out.write(buf,0,n);


        printOut = new PrintWriter(out);
        printOut.println("add");
        System.out.println("envoie !!!");
        printOut.println("1");
        printOut.println("3");
       // out.write(getBytes("add"),0,0);
        printOut.flush();
    }

这里是我的服务器代码:

public static void transfert(InputStream in, OutputStream out, boolean closeOnExit) throws IOException
    {        
        byte buf[] = new byte[1024];

        int n;
        while((n=in.read(buf))!=-1)
            out.write(buf,0,n);

        buffIn = new BufferedReader (new InputStreamReader(in));
        String nom_methode = buffIn.readLine();
        String param1 = buffIn.readLine();
        String param2 = buffIn.readLine();
        System.out.println("methode:"+nom_methode+"param1:"+param1+"param2:"+param2);

        if (closeOnExit)
        {
            in.close();
            out.close();
        }     
    }

编辑: 我仍然想念一些东西,现在我的线程出错,我认为问题出在我的循环中,我在输入中读取了我的文件。 而且,实际上param仍然在我的文件中而不是在我的参数中...为什么循环不会在EOF之后停止?

错误:

Exception in thread "Thread-0" java.lang.IndexOutOfBoundsException
    at java.io.FileOutputStream.writeBytes(Native Method)
    at java.io.FileOutputStream.write(FileOutputStream.java:318)
    at serveurthread.AcceptClient.transfert(AcceptClient.java:45)
    at serveurthread.AcceptClient.run(AcceptClient.java:84)
    at java.lang.Thread.run(Thread.java:722)

client:
 public static void transfert(InputStream in, OutputStream out) throws IOException{
        PrintWriter printOut;
        printOut = new PrintWriter(out);
        byte buf[] = new byte[1024];   
        int n;
        while((n=in.read(buf))!=-1)
            out.write(buf,0,n);


        printOut.print('\u0004');
        printOut.flush();
        printOut.println("add");   
        System.out.println("envoie !!!");
        printOut.println("1");
        printOut.println("3");
       // out.write(getBytes("add"),0,0);
        printOut.flush();
    }

服务器:

public static void transfert(InputStream in, OutputStream out, boolean closeOnExit) throws IOException
    {        
        byte buf[] = new byte[1024];

    int n;
    while((n=in.read(buf))!= (int)'\u0004'){
        out.write(buf,0,n);
    }

    buffIn = new BufferedReader (new InputStreamReader(in));
    String nom_methode = buffIn.readLine();
    String param1 = buffIn.readLine();
    String param2 = buffIn.readLine();
    System.out.println("methode:"+nom_methode+"param1:"+param1+"param2:"+param2);

    if (closeOnExit)
    {
        in.close();
        out.close();
    }     
}

1 个答案:

答案 0 :(得分:-1)

您需要在流中使用某种标记来表示文件的结尾。我建议'\u0004'这是EOF角色。基本上,在写完文件后写下这个字符,然后调整服务器中的循环,如下所示:

while((n=in.read(buf))!=(int)'\u0004')
    out.write(buf,0,n);

现在,服务器在必要时停止读取文件,然后可以到处读取字符串。

此外,read返回读取的字节数,而不是char。我将通过声明字节而不是字节数组一次传递一个字节。