解决方案 »
- 用RandomAccessFile类统计单词个数
- Java不能类型转换?!!!!!
- 谁知道哪个软件具有图象对比功能
- 关于socket通信的问题,客户端发完一个请求,得到相应的回应后,再发另外一个请求时,结果服务器端读不到
- 操作blob字段的错误,50 分
- 新手上路:为什么是Calendar calendar = new GregorianCalendar(pdt); ????
- 为什么我安装的MyEclipse里没有JFrame啊?怎么办
- 所有方法都用过了jsp死活就是显示不出中文哪位大侠给我一段代码能正确显示马上结帐
- 哪里有<Java 2核心技术 2 高级特性>下载?
- JEditPane控件显示中文问题
- 紧急求助!!!!
- 换成jdk1.8以后报错
而不是s.close();
while((len=br1.readLine())!=null){
System.out.println(len);
}
会不断尝试从服务器端接收数据,直到服务器端主动断开连接,如果服务器端以非正常形式断开连接,socket就会抛Connection Reset异常。总之socket用完不close,99%是错误的,虽然由于其他机制,在某些情况下就算不关也不会产生错误和严重后果,但这种做法依然是不好的。
关闭socket是正确的;
其实上面的程序若保证了server端那个打开的socket,client端没有阻塞于此socket上的 I/O 操作,server端没有关闭socket,上面程序也是能运行的。如:import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;public class FileTransClient { public static void main(String[] args) throws IOException {
//创建客户端对象
Socket socket=new Socket("localhost",9999);
//获取客户端的输出流对象
OutputStream out=socket.getOutputStream();
//使用字符打印流打印数据
PrintWriter pw=new PrintWriter(out,true);
//创建文件对象
File file=new File("D:\\help.txt");
//创建字符输入流读取文件
BufferedReader br=new BufferedReader(new FileReader(file));
String line=null;
while((line=br.readLine())!=null){
pw.println(line);
}
//告知服务端数据传送完毕
socket.shutdownOutput();
System.out.println("客户端已把文件传输完成!");
//用来接收服务端返回的数据信息
BufferedReader br1=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String len=null;
//System.out.println("--------------");
while(!(len=br1.readLine()).equalsIgnoreCase("end")){
System.out.println(len);
}
socket.close();
}}import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;public class FileTransServer {
/*
*1 服务端先接收客户端发送的数据
*2服务端把接收的数据保存到硬盘中
* */
public static void main(String[] args) throws IOException {
//创建服务端对象
ServerSocket ss=new ServerSocket(9999);
//获取客户端对象
Socket s=ss.accept();
//获取客户端的输入流
InputStream in=s.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(in));
//获取客户端的ip
String ip=s.getInetAddress().getHostAddress();
//定义一个变量
int count=1;
//创建服务端要保存的数据位置
File file=new File("tempfile\\"+ip+"("+")"+count+".txt");
while(file.exists()){
count++;
file=new File("tempfile\\"+ip+"("+")"+count+".txt");
}
FileWriter fw=new FileWriter(file);
String line=null;
while((line=br.readLine())!=null){
System.out.println(line);
fw.write(line+System.getProperty("line.separator"));
// System.getProperty("line.separator");
fw.flush();
}
fw.close();
System.out.println("文件已经保存成功");
//返回给客户端的数据
OutputStream out=s.getOutputStream();
out.write("文件保存成功\r\n".getBytes());
//new Thread(new Task(s)).start();
out.write("end\r\n".getBytes());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// s.close();
ss.close();
}}
你可以把Server端这些代码移除,放在Client端的循环后,让Server先退出;