客户端实现键盘录入文件名上传文件,服务端实现接收文件并回馈消息给客户端
看代码,看结果:
class Client2
{
public static void main(String[] args) throws Exception
{
//1、创建Socket服务,指定服务端地址和访问端口
Socket sk = new Socket("127.0.0.1",9999);
//键盘录入文件名字,读取判断
System.out.println("请输入文件名:");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String name = br.readLine();
File file = new File(name);
//判断是否传入正确文件名
//--isFile()当且仅当此抽象路径名表示的文件存在且 是一个标准文件时,返回 true;否则返回 false
while(!(file.isFile()))
{
System.out.println("请正确输入文件名:");
name = br.readLine();
file = new File(name);
}
//判断文件是否存在,通过上面认识到exists不用判断了
// if(!file.exists())
// throw new RuntimeException("该文件不存在,请输入正确的文件名");
//因为文件可以是非文本文件
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
//获取Socket服务的输出流
ObjectOutputStream bos = new ObjectOutputStream(sk.getOutputStream());
//需要先把文件名发送给服务端,以便让服务端创建同名文件
bos.writeObject(file);
byte[] buf = new byte[1024];
int len;
while ((len=bis.read(buf))!=-1)
{
bos.write(buf,0,len);
}
bis.close();
sk.shutdownOutput();
InputStream ins = sk.getInputStream();
byte[] bufin = new byte[1024];
int lens;
lens = ins.read(bufin);
System.out.println(new String(bufin,0,lens));
sk.close();
}
}
//郁闷了,其他文件都能上传,唯独txt格式的上传了,在服务端只创建了同名文件,而内容为空---------???
class ServerCode2 implements Runnable
{
private Socket sk;
public ServerCode2(Socket sk)
{
this.sk = sk;
}
public void run()
{
try
{
//一般先把IP 和 port取出
String ip = sk.getInetAddress().getHostAddress();
int port = sk.getPort();
System.out.println(ip+"--"+port+"..is connected.");
//获取socket服务的读取流,先用它来获取文件名,那就可以用字符读取流的缓冲区
ObjectInputStream objin = new ObjectInputStream(sk.getInputStream());
//对象流,获取读取出来的对象是Object类型,需要向下转型
File clientFile = (File)objin.readObject();
String name = clientFile.getName();
File dir = new File("c:\\");
File file = new File(dir, name);
//判断是否存在,如果已存在,则在文件名后面加上数字用来区别和避免覆盖
int count = 1;
while(file.exists())
{
name = clientFile.getName();
int index = name.lastIndexOf(".");
name = name.substring(0,index)+"("+(count++)+")"+name.substring(index);
file = new File(dir,name);
}
FileOutputStream fos = new FileOutputStream(file);
byte[] buf = new byte[1024];
int len = 0;
while ((len = objin.read(buf))!=-1)
{
fos.write(buf,0,len);
}
//读取完成后该反馈信息给客户端,把信息写入Socket的输出流
OutputStream outs = sk.getOutputStream();
byte[] bufout = "上传成功".getBytes();
outs.write(bufout,0,bufout.length);
fos.close();
sk.close();
}
catch (Exception e)
{
throw new RuntimeException("接收上传文件失败");
}
}
}
class Server2
{
public static void main(String[] arg) throws Exception
{
//创建服务端点,指定一个监听的端口
ServerSocket ss = new ServerSocket(9999);
//服务器原理:把处理客户端访问的共用代码封装到实现Runnable接口的run方法中,
//可以通过创建多线程实现多线程并发处理,也就是客户端并发访问。
while (true)
{
Socket sk = ss.accept();
new Thread(new ServerCode(sk)).start();
}
}
}
结果就是这样,只要是txt的上传完成都只是在服务端创建同名文件,但是内容是空的,其他格式的都没有问题,帮忙看看
|