0

我坚持使用这种客户端-服务器编程,我希望服务器在其中维护一个文件,该文件存储客户端发送的数据。代码如下:

客户端:

public class ClientSide {
    public static void main(String[] argv) throws Exception {

        String sentence;
        BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in));
        Socket clientSocket = new Socket("localhost", 6789);
        DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
        sentence = inFromUser.readLine();
        outToServer.writeBytes(sentence + '\n');            
        clientSocket.close();
}
}

服务器端:

public class ServerSide {
     public static void main(String[] args) throws IOException {
            File file=new File("s1.txt");
            ServerSocket servsock = new ServerSocket(6789);

            Socket sock = servsock.accept();
            byte[] mybytearray = new byte[1024];
            InputStream is = sock.getInputStream();
            FileOutputStream fos = new FileOutputStream(file,true);
            BufferedOutputStream bos = new BufferedOutputStream(fos);

            int bytesRead = is.read(mybytearray, 0, mybytearray.length);
            bos.write(mybytearray, 0, bytesRead);

            bos.close();
            sock.close();

            BufferedReader write=new BufferedReader(new FileReader(file));
            String line;
            while((line=write.readLine())!=null) {
                System.out.println(line);
            }

     }
}

现在,当用户向服务器发送数据时,例如“ Vinayak ”是发送到服务器的数据,只有第一个字符,即“ V ”被写入文件。我一定在代码中遗漏了一些东西,我找不到它。另外,我在这里问了类似的问题,但是无法得到想要的结果

4

1 回答 1

1

您应该检查读取操作实际上是否在服务器端读取了您想要的尽可能多的字节。请参阅InputStream 的 javadocs

实际读取的字节数以整数形式返回。在输入数据可用、检测到文件结尾或引发异常之前,此方法会一直阻塞。

...

InputStream 类的 read(b, off, len) 方法只是重复调用方法 read()。如果第一个此类调用导致 IOException,则该异常会从对 read(b, off, len) 方法的调用中返回。如果对 read() 的任何后续调用导致 IOException,则捕获该异常并将其视为文件结尾;到该点读取的字节存储在 b 中,并返回发生异常之前读取的字节数

将您的服务器读取代码更改为循环:

    int bytesRead = -1;
    while ((bytesRead = is.read(mybytearray, 0, mybytearray.length)) != -1) {
        System.out.println(bytesRead);
        bos.write(mybytearray, 0, bytesRead);
    }

服务器端输出:

1
85
9
9
    ...
5
10
8
 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin fermentum facilisis nulla id aliquet. Suspendisse venenatis condimentum erat adipiscing interdum. Etiam aliquet iaculis mauris lacinia lacinia. Morbi nec nisi est. Duis vel nunc a risus scelerisque feugiat. Morbi eget odio ac arcu vehicula facilisis vel ut nibh. Morbi sodales tristique ante eu aliquam. Ut a leo nisi. Morbi eu purus sed lectus mattis tincidunt.
于 2013-05-09T08:57:25.813 回答