【问题标题】:No value is writtern in my tcp client/server program我的 tcp 客户端/服务器程序中没有写入任何值
【发布时间】:2026-01-22 13:05:01
【问题描述】:

在我的 TCP 套接字程序中,我必须将数据从客户端发送到服务器。在服务器端,我必须读取流并将其写入文件。但是文件被创建了,里面没有写任何东西。

客户端编码发送文件:

try
{

    Socket ss = new Socket("localhost", 5010);

    BufferedOutputStream put = new BufferedOutputStream(ss.getOutputStream());
    BufferedReader st = new BufferedReader(new InputStreamReader(ss.getInputStream()));

    File f = new File("e://read.txt");
    FileInputStream fis = new FileInputStream(f);
    byte buf[] = new byte[1024];
    int read;
    while((read = fis.read(buf, 0, 1024)) != -1)
    {
        put.write(buf,0,read);
        put.flush();
    }
    //d.close();
    System.out.println("File transfered");
    ss.close();

}
catch(Exception e)
{
    System.out.println(e);
}

服务器读取输入流并将其写入文件:

try
{
    ServerSocket ss = new ServerSocket(5010);
    Socket s = ss.accept();
    BufferedReader get = new BufferedReader(new InputStreamReader(s.getInputStream()));

    FileWriter writedata = new FileWriter("c://write.txt");

    BufferedWriter bw = new BufferedWriter(writedata);

    String line=bw.toString();
    while ((line = get.readLine()) != null) {
        bw.write(line + "\n");
    }
}
catch(Exception e)
{
    System.out.println(e);
}

有什么问题?

【问题讨论】:

  • 您忘记在while 语句之后添加bw.close()
  • 你试过用追加模式写吗? bw=new BufferedWriter(writedata, true)

标签: java sockets tcp io


【解决方案1】:

您忘记了 bw.close 和 bw.flush....下面是有效的代码...

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;


public class TestServer
{
    public static void main(String[] args)
    {
        try
        {
        ServerSocket ss=new ServerSocket(5010);
        Socket s=ss.accept();
        BufferedReader get= new BufferedReader(new InputStreamReader(s.getInputStream()));

        FileWriter writedata=new FileWriter("c://Test//testoutput.txt");

        BufferedWriter bw=new BufferedWriter(writedata);

        String line=bw.toString();
        while ((line = get.readLine()) != null) {

            bw.write(line + "\n");

        }
        bw.flush();
        bw.close();
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }
}


import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.net.Socket;

public class TestClient
{
    public static void main(String[] args)
    {
        try
        {

           Socket ss=new Socket("localhost",5010);

           BufferedOutputStream put=new BufferedOutputStream(ss.getOutputStream());
           BufferedReader st=new BufferedReader(new InputStreamReader(ss.getInputStream()));

           File f=new File("c://Test//testinput.txt");
           FileInputStream fis=new FileInputStream(f);
           byte buf[]=new byte[1024];
           int read;
           while((read=fis.read(buf,0,1024))!=-1)
           {
               put.write(buf,0,read);
               put.flush();
           }
           //d.close();
           System.out.println("File transfered");
           ss.close();
           ss.close();


        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }
}

【讨论】:

  • 谢谢。它有效。但源文件中只写入了一个字符,而不是全部内容
  • 我测试了我提到的各种文件的程序,它可以工作...请尝试运行确切的程序...
  • @Ameer 此代码仅适用于文本文件,即使对于那些可能会更改行终止符的文件。它会损坏二进制文件。一般来说,除非您知道数据是文本,否则不应使用 Readers 和 Writers。将line 初始化为bw.toString() 完全没有意义。
【解决方案2】:

除非您知道数据是文本,否则不要使用 Readers 和 Writers。使用 InputStreams 和 OutputStreams,然后复制它们:

while ((count = in.read(buffer)) > 0)
{
  out.write(buffer, 0, count);
}
out.close();
in.close();

在客户端和服务器端都使用这个逻辑。

注意事项:

  1. flush() 放在该循环内会适得其反。
  2. 如果buffer 大于4096(应该是),那么使用BufferedInputStream 是没有意义的。

【讨论】:

    最近更新 更多