黑马程序员技术交流社区
标题:
客户端和服务端文件传输问题
[打印本页]
作者:
张淼
时间:
2012-9-27 12:20
标题:
客户端和服务端文件传输问题
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class UploadClient {
public static void main(String[] args) {
Socket s = null;
BufferedReader br = null;
try {
s = new Socket("192.168.1.100", 10001);
br = new BufferedReader(new FileReader("a.txt"));
PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
String line = null;
while ((line = br.readLine()) != null) {
pw.println(line);
}
BufferedReader brServer = new BufferedReader(new InputStreamReader(
s.getInputStream()));
String text = brServer.readLine();
System.out.println("Server:" + text);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (s != null) {
try {
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
--------------------------上面是客户端,下面是服务端-------------------------------------------
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class UploadServer {
public static void main(String[] args) {
ServerSocket ss = null;
PrintWriter pw = null;
try {
ss = new ServerSocket(10001);
Socket s = ss.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(
s.getInputStream()));
pw = new PrintWriter(new FileWriter("b.txt"), true);
String line = null;
while ((line = br.readLine()) != null) {
pw.println(line);
}
PrintWriter pw2 = new PrintWriter(s.getOutputStream(), true);
pw2.println("上传文件成功");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ss != null) {
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
我的问题是:当先开启服务端,后开启客户端的情况下,没有任何反应。
上课的时候老师讲了,说是readLine()是阻塞式的,但是我还是没理解,具体两个程序是阻塞在了哪条语句呢,以及阻塞式是什么意思?应该怎么理解呢?
作者:
冯培军
时间:
2012-9-27 14:15
/*
通常的,对一个文件描述符指定的文件或设备, 有两种工作方式: 阻塞 与非阻塞 。
所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待 状态, 直到有东西可读或者可写为止。
而对于非阻塞状态, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待 。
*/
readLine()方法是阻塞式的方法,通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。
但是你只是PrintWriter pw = new PrintWriter(s.getOutputStream(), true); 没有写换回或回车。
这个时候服务器短实际上是接受到客户端了,也就是服务器端运行到这里了String str = br.readLine(); 但是客户端这个时候已经运行完毕,并且关闭了连接。
所以就会出现异常。你PrintWriter pw = new PrintWriter(s.getOutputStream()+"\n",true)这样写试试。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2