此文贴上一个刚学习网络编程的一个小练习:文件上传案例
客户端代码
public class Demo02Client {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("day12-code\\2.jpg");
Socket socket = new Socket("127.0.0.1", 8888);
OutputStream os = socket.getOutputStream();
int len = 0;
byte[] bytes = new byte[1024];
while((len = fis.read(bytes)) != -1) {
os.write(bytes, 0, len);
}
//重要!禁用此套接字socket的输出流。
// 这样服务器端的网络字节输入流便不会发生阻塞。
socket.shutdownOutput();
InputStream is = socket.getInputStream();
while((len = is.read(bytes)) != -1) {
System.out.println(new String(bytes, 0, len));
}
fis.close();
socket.close();
}
}
服务器端代码
public class Demo02Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
while(true) {//死循环,使服务器端始终处于监听状态
new Thread(new Runnable() {//使用多线程提高服务器效率。每当一个客户端上传照片,便开启一个线程进行处理
@Override
public void run() {
try{ //因为线程的run()方法没有抛出异常,所以run()里面的代码也无法抛出异常。因此使用try\catch进行异常处理
Socket socket = serverSocket.accept();//侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。
InputStream is = socket.getInputStream();//网络字节输入流
File file = new File("day12-code\\upLoad");//判断服务器端存储文件的位置的文件夹是否存在
if(!file.exists()) {
file.mkdirs();
}
String fileName = "" + System.currentTimeMillis() + new Random().nextInt(1000) + ".jpg";//创建一个不重复的图片文件名
FileOutputStream fos = new FileOutputStream("day12-code\\upLoad\\" + fileName);
int len = 0;
byte[] bytes = new byte[1024];
while ((len = is.read(bytes)) != -1) {//读取客户端的网络字节流
fos.write(bytes, 0, len);//服务器端写入本地硬盘
}
OutputStream os = socket.getOutputStream();
os.write("服务器端收到!".getBytes());//服务器端返回给客户端 “确认接受” 这一消息
/*
此处可不写,因为下面有socket.close(),依旧会将此字节输出流关闭
socket.shutdownOutput();*/
socket.close();//关闭此套接字。 同时关闭与该客户端的通道。
fos.close();
}catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
}
注意事项:
此案的需要注意字节输入流read()方法的阻塞问题。

本文介绍了使用JAVA进行网络编程的小练习——文件上传案例,包括客户端和服务器端的代码实现。特别强调了在操作字节输入流时read()方法可能引发的阻塞问题,提醒开发者注意该问题的处理。
1648

被折叠的 条评论
为什么被折叠?



