写了个测试代码,功能是客户端发一个文件路径给服务器,服务器读取文件后传给客户端,并在客户端控制台显示文件内容。
现在服务器端debug运行到String fileName = bufReader.readLine();就一直死在这了,由于是新手,能想的办法都试了。求大神帮忙了
客户端import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;public class RemoteClient {
public static void main(String[] args) {
try {
Socket client = new Socket("127.0.0.1", 4000);
InputStream inputFromSocket = client.getInputStream();
OutputStream outputToSocket = client.getOutputStream();

BufferedWriter bufWriter = new BufferedWriter(new OutputStreamWriter(outputToSocket));
bufWriter.write("F:/temp/RemoteFile.txt");
bufWriter.flush();
// PrintWriter pWriter = new PrintWriter(outputToSocket);
// pWriter.println("F:/temp/RemoteFile.txt");


BufferedReader bufReader = new BufferedReader(new InputStreamReader(inputFromSocket));
String line=null;
while((line=bufReader.readLine()) !=null){
System.out.println(line +"\n");
}

bufWriter.close();
bufReader.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}
服务器端import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;public class RemoteServer { public static void main(String[] args) {
try {
ServerSocket  server = new ServerSocket(4000);
Socket incomingConnection = null;
InputStream inputFromSocket = null;
OutputStream outputToScoket = null;
while(true){
incomingConnection = server.accept();
inputFromSocket = incomingConnection.getInputStream();
outputToScoket = incomingConnection.getOutputStream();

//input处理
BufferedReader bufReader = new BufferedReader(new InputStreamReader(inputFromSocket));
String fileName = bufReader.readLine();

FileReader fileReader = new FileReader(new File(fileName));
BufferedReader bufFile = new BufferedReader(fileReader);
//output处理
PrintWriter pWriter = new PrintWriter(outputToScoket);

//将文件的string输入到pWriter
String line = null;
while((line = bufFile.readLine()) != null){
pWriter.write(line +"\n");
// pWriter.print(line + "\n");
// pWriter.println(line);
}

pWriter.close();
bufFile.close();
bufReader.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}socketJava测试

解决方案 »

  1.   

    readLine是读一行数据,你发送的时候没有换行符,所以一直等在那里了。
    bufWriter.write("F:/temp/RemoteFile.txt\n");
      

  2.   


       但还是有些疑惑,例如我从一个.txt文本中读取内容,就一行,没有用到回车之类的换行符,
    可是用bufferedRead.readLine()还是可以读到这段文本呀? 难道是文本默认在后面都有换行符吗?
      

  3.   

    客户端读取文件直接用文件流读取即可,为什么要用socket获取流了?//这里通过socket获取的IO是建立在客户端好服务器端之间的,如果对方不发送即没有通过output输出,那么就会
    //一直处于等待状态,所以你应该new一个io来操作文件,然后把需要的东西通过socket获取的io发送给对方。
    OutputStream outputToSocket = client.getOutputStream();
    BufferedWriter bufWriter = new BufferedWriter(new OutputStreamWriter(outputToSocket));
      

  4.   


    只是自己测试的代码。现实中,客户和服务器不在同一台机上,也可能遇到类似的问题吧
    不敢是不是一台机子,读取文件的流不应该通过socket获取,除非你是读取通过另一端发送过来的。socket建立的流通道只有一方发送,另一方的input才会读取内容,否则就会一直处于等待状态。lz好好理理思路。
      

  5.   


    只是自己测试的代码。现实中,客户和服务器不在同一台机上,也可能遇到类似的问题吧
    不敢是不是一台机子,读取文件的流不应该通过socket获取,除非你是读取通过另一端发送过来的。socket建立的流通道只有一方发送,另一方的input才会读取内容,否则就会一直处于等待状态。lz好好理理思路。   恩~我的想法是客户端发一个文件名给服务器,服务器将读到的文件流直接给了socket,再通过readLine获取流中的内容。和你说的一边在发送,另一边read类似吧。现在发现阻塞的原因是 bufWriter.write("F:/temp/RemoteFile.txt");在服务器端readLine不到(加了"\n"可以)。 
       现在的不太理解为什么bufferedReader.readLine()读取文本文件时,一行也能读取,文本会自动补/n吗?我用UltraEdit转成二进制也没有看到结尾字符呢。
      

  6.   


    只是自己测试的代码。现实中,客户和服务器不在同一台机上,也可能遇到类似的问题吧
    不敢是不是一台机子,读取文件的流不应该通过socket获取,除非你是读取通过另一端发送过来的。socket建立的流通道只有一方发送,另一方的input才会读取内容,否则就会一直处于等待状态。lz好好理理思路。   恩~我的想法是客户端发一个文件名给服务器,服务器将读到的文件流直接给了socket,再通过readLine获取流中的内容。和你说的一边在发送,另一边read类似吧。现在发现阻塞的原因是 bufWriter.write("F:/temp/RemoteFile.txt");在服务器端readLine不到(加了"\n"可以)。 
       现在的不太理解为什么bufferedReader.readLine()读取文本文件时,一行也能读取,文本会自动补/n吗?我用UltraEdit转成二进制也没有看到结尾字符呢。在输出客户端和服务器端额输出流
    bufWriter.write("...")
    bufWriter.flush();//强制刷新缓冲区
      

  7.   

    使用socket转输文件时,需要对传输的内容进行编解码工作。因为在传输的过程中,是以二进制的方式进行转送。输送时,你要对传输的内容进行编码,服务端收到时要进行解码。既然你传一行,那么就需要有换行符号,服务器才能知道你传送完了一行。