鱼C论坛

 找回密码
 立即注册
查看: 554|回复: 3

[已解决]socket类出现的问题,代码纠错

[复制链接]
发表于 2023-4-14 21:18:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这是客户端的代码
public class Client{
        public static void main(String args[])throws IOException {
    //创建Socket对象,并连接服务器
    Socket socket = new Socket("127.0.0.1",10000);
    //读取本地文件的数据,并写到服务器中

    BufferedReader brd = new BufferedReader(new InputStreamReader(new FileInputStream("d://新建文件夹//xinyue.txt"), "UTF-8"));
    String s1 = brd.readLine();
    System.out.println(s1);
    BufferedWriter x = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
   
    x.write(s1);
    //往服务器写出结束标记
    socket.shutdownOutput();
    socket.close();
}
}
服务端的代码
public class Serverx{
        public static void main(String args[]) throws IOException{
        //创建对象并绑定端口       
    ServerSocket ss = new ServerSocket(10000);
    //等待客户端连接
   
    Socket socket = ss.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    BufferedWriter bh = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d://新建文件夹//xiao.txt"), "UTF-8"));
    String s;
   
     while ((s = br.readLine()) != null) {
             System.out.println(s);
            bh.write(s);
            bh.newLine();
            bh.flush();
        }
  socket.close();
    ss.close();
}
}
为什么新建的文件“xiao”为空
最佳答案
2023-4-14 21:41:21
问题在于,客户端和服务端之间的数据传输没有使用换行符,而在服务端读取数据时使用了readLine()方法,它会读取到换行符为止。我们需要修改客户端和服务端代码来解决这个问题。

首先在客户端代码中,在x.write(s1);后面添加一个换行符。将其更改为:

  1. x.write(s1);
  2. x.newLine();
  3. x.flush();
复制代码


然后在服务端代码中,在写入到文件时,我们需要删除bh.newLine();。现在你的服务端代码应该是这样的:

  1. import java.io.*;
  2. import java.net.ServerSocket;
  3. import java.net.Socket;

  4. public class Serverx{
  5.     public static void main(String args[]) throws IOException{
  6.         //创建对象并绑定端口
  7.         ServerSocket ss = new ServerSocket(10000);
  8.         //等待客户端连接
  9.         Socket socket = ss.accept();

  10.         BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  11.         BufferedWriter bh = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d://新建文件夹//xiao.txt"), "UTF-8"));
  12.         String s;

  13.         while ((s = br.readLine()) != null) {
  14.             System.out.println(s);
  15.             bh.write(s);
  16.             bh.flush();
  17.         }
  18.         socket.close();
  19.         ss.close();
  20.     }
  21. }
复制代码


现在运行代码,你应该能看到新建的文件“xiao.txt”包含客户端发送的数据。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-14 21:38:03 | 显示全部楼层
根据你提供的客户端和服务端代码,可以看出你的程序是将从本地读取的文件中的第一行数据发送给服务器,服务器接收到数据后将其写入到本地的 "xiao.txt" 文件中。

由于你只读取了文件的第一行数据,所以客户端发送给服务器的也只有这一行数据。如果文件中只有一行数据,那么服务端写入的 "xiao.txt" 文件中也只会有这一行数据。

如果你的 "xiao.txt" 文件是空的,可能有以下原因:

新建的 "xiao.txt" 文件并没有在客户端发送数据之前被清空,导致之前的内容仍然存在,从而覆盖了客户端发送的数据。

客户端发送的文件中只有空行或者第一行数据是空的,导致服务端接收到的数据也为空。

你可以检查以上两个原因来解决问题。此外,你也可以在客户端发送数据之前打印出从文件中读取的数据,以便更好地排查问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-14 21:41:21 | 显示全部楼层    本楼为最佳答案   
问题在于,客户端和服务端之间的数据传输没有使用换行符,而在服务端读取数据时使用了readLine()方法,它会读取到换行符为止。我们需要修改客户端和服务端代码来解决这个问题。

首先在客户端代码中,在x.write(s1);后面添加一个换行符。将其更改为:

  1. x.write(s1);
  2. x.newLine();
  3. x.flush();
复制代码


然后在服务端代码中,在写入到文件时,我们需要删除bh.newLine();。现在你的服务端代码应该是这样的:

  1. import java.io.*;
  2. import java.net.ServerSocket;
  3. import java.net.Socket;

  4. public class Serverx{
  5.     public static void main(String args[]) throws IOException{
  6.         //创建对象并绑定端口
  7.         ServerSocket ss = new ServerSocket(10000);
  8.         //等待客户端连接
  9.         Socket socket = ss.accept();

  10.         BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  11.         BufferedWriter bh = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d://新建文件夹//xiao.txt"), "UTF-8"));
  12.         String s;

  13.         while ((s = br.readLine()) != null) {
  14.             System.out.println(s);
  15.             bh.write(s);
  16.             bh.flush();
  17.         }
  18.         socket.close();
  19.         ss.close();
  20.     }
  21. }
复制代码


现在运行代码,你应该能看到新建的文件“xiao.txt”包含客户端发送的数据。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-14 21:44:36 | 显示全部楼层
歌者文明清理员 发表于 2023-4-14 21:38
根据你提供的客户端和服务端代码,可以看出你的程序是将从本地读取的文件中的第一行数据发送给服务器,服务 ...

验证之后发现服务端接收的数据为空,所以文件为空,所以这又是为啥呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 17:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表