黑马程序员技术交流社区
标题:
网络编程:客户端上传文件到服务端问题
[打印本页]
作者:
薛飞飞
时间:
2012-4-9 22:43
标题:
网络编程:客户端上传文件到服务端问题
从客户端往服务端传送文件:为什么启动客户端并输入路径后服务端没反应....
运行程序代码:
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Service {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
while(true){
Socket socket = serverSocket.accept();
new Thread(new Server(socket));
}
}
}
客户端代码:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException {
// 读键盘,用户输入一个文件路径,绝对路径
System.out.println("请输入文件的绝对路径:");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
File file = new File(line);
if(!file.exists()) {
System.out.println("文件不存在");
return;
}
String filename = file.getName();
//建立客户端,并向服务端发送文件(文件名,文件内容)
Socket clientSocket = new Socket("127.0.0.1",8888);
OutputStream out = clientSocket.getOutputStream();
//发送文件名
out.write(filename.getBytes());
//发送换行符,将文件名和文件内容的数据隔开
out.write("\r\n\r\n".getBytes());
//发送文件内容的数据
InputStream in = new FileInputStream(file);
int len;
byte[] byts = new byte[1024];
while((len=in.read(byts))!=-1){
out.write(byts, 0, len);
}
//阻塞读取结果
InputStream inputStream = clientSocket.getInputStream();
len = inputStream.read(byts);
String s = new String(byts,0,len);
System.out.println(s);
clientSocket.close();
}
}
服务器代码:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
class Server implements Runnable{
private Socket socket;
public Server(Socket socket){
this.socket = socket;
}
public void run() {
try{
Thread.sleep(100);
InputStream in = socket.getInputStream();
int pos = 0;
byte[] byts = new byte[1024];
while(true) {
int ch = in.read();
//当读到"\r\n\r\n"时就中断读取,并获取此时读取\r之前的字符个数
if(ch=='\r'&&(ch=in.read())=='\n'&&(ch=in.read())=='r'&&(ch=in.read())=='\n') {
break;
}
byts[pos++] = (byte)ch;
}
//在服务端创建文件 1. 获得文件名
String filename = new String(byts,0,pos);
//在服务端创建文件 2.约定存放文件的目录d:\\upload
File uploadDir = new File("d:\\upload");
File target = new File(uploadDir,filename);
//创建文件 先创建目录,再创建文件
target.getParentFile().mkdirs();
target.createNewFile();
//读取文件数据
OutputStream out = new FileOutputStream(target);
int len;
byts = new byte[1024];
//因为读取文件数据时,客户端可能会暂时停止发送,这时用!=-1判断就不准了!
while(true) {
len=in.read(byts);
out.write(byts, 0, len);
if(len<1024) {
break;
}
}
System.out.println("上传结束");
out.close();
//通知客户端上传结束
OutputStream outputStream = socket.getOutputStream();
outputStream.write("上传完毕".getBytes());
}catch(Exception e){
e.printStackTrace();
}finally{
if(socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
作者:
薛飞飞
时间:
2012-4-10 19:48
靠,一天了,都没人能回答我的问题吗...
作者:
刘少伟
时间:
2012-4-10 22:59
本帖最后由 刘少伟 于 2012-4-10 23:36 编辑
1、Service里new了一个线程,要让它运行。
new Thread(new Server(socket)).start();
2、Server里,判断\r\n\r\n的地方,第三个判断少了个“\”
这样运行,上传是成功的。你试试、
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2