java网络文件传输的实现.docx
《java网络文件传输的实现.docx》由会员分享,可在线阅读,更多相关《java网络文件传输的实现.docx(8页珍藏版)》请在冰豆网上搜索。
java网络文件传输的实现
java网络文件传输的实现——Socket编程
AllRightsReserved!
本程序分为服务器和客户端两个小程序。
主要实现的功能是:
客户端向服务器端请求一个文件的传输连接,
服务器接收到请求命令后,要求客户端发送用户名和密码,
如果正确,就执行传输文件的过程,客户端接收完后,
保存到一个文件中并在屏幕上显示出来。
设计原理:
服务器端建立一个SocketServer等待客户端的连接,
每来一个客户端的请求连接,就创建一个新的线程对其进行单独服务,
然后继续等待其他的客户端的连接。
客户端向服务器发送文件传输请求,在服务器端要求鉴权时,
输入用户名和密码发送给服务器验证,如果验证通过就开始文件传输。
使用方法,如果需要重新编译的话输入以下两条命令:
javacSendFileSocket.java
javacSendFileClient.java
在命令行下的运行方式:
服务器端:
javaSendFileSocket
客户端:
javaSendFileClientserverIPAddress
例如:
javaSendFileClient192.168.0.153
服务器程序:
//packagezieckey.socket;
import.*;
importjava.io.*;
/**
*一个简单的多线程服务器程序,用于传输文件
*
*@authorzieckey
*/
publicclassSendFileSocketextendsThread
{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args)
{
/*if(args.length>0)//如果有参数输入就启动服务器程序
{
server();
}else
{
//否则启动客户端进程
client();
}*/
server();//启动服务器程序
}
privatestaticfinalint PORT =6000;
privateSocket s;
privatestaticfinalString name ="zieckey";
privatestaticfinalString password ="123456";
publicSendFileSocket(Sockets)
{
this.s=s;
}
publicvoidrun()
{
try
{
OutputStreamos=s.getOutputStream();
InputStreamis=s.getInputStream();
os.write("Hello,welcomeyou!
".getBytes());
byte[]buf=newbyte[100];
while(true)
{
intlen=is.read(buf);
StringrevStr=newString(buf,0,len);
System.out.println("Thisclientwantsto"+revStr);
StringfileName;
if(revStr.startsWith("get"))//表明客户端请求传输一个文件
{
os.write("Pleaseinputyournameandpassword!
Usingtheformat:
name@password"
.getBytes());
fileName=getFileName(revStr);
len=is.read(buf);
revStr=newString(buf,0,len);
System.out.println("Thereceivedusernameandpassword:
"+revStr);
if(revStr.startsWith("zieckey@123456"))
{
FileInputStreamfins=newFileInputStream(fileName);
//byte[]fielBuf=newbyte[100];
intdata;
while(-1!
=(data=fins.read()))//从文件中读取数据,每次读取1字节
{
os.write(data);//将读取到的数据写到网络数据流中发送给客户段
}
break;
}
}else
{
os.write("getingfile'susageis:
getfilename".getBytes());
}
}
os.close();
is.close();
s.close();
}catch(Exceptione)
{
e.printStackTrace();
}
}
/*
*作用:
从客户端发来了文件请求命令中提取出所请求的文件名
*参数:
客户端发来了文件请求命令字符串,应该以“get”开头
*返回值:
提取出所请求的文件名
*/
privateStringgetFileName(StringrevStr)
{
StringfileName;
fileName=revStr.substring(3);
while(fileName.startsWith(""))
{
fileName=fileName.substring
(1);
}
returnfileName;
}
publicstaticvoidserver()
{
System.out.println("Thisisserver");
try
{
ServerSocketss=newServerSocket(PORT);
intcount=0;
while(true)
{
//创建一个Socket等待客户端连接
Sockets=ss.accept();
count++;
System.out.println("Thisisthe"+count+"'stclientconnetion!
");
newSendFileSocket(s).start();//启动一个线程为这个客户端服务
}
}catch(Exceptionex)
{
ex.printStackTrace();
}
}
/*publicstaticvoidclient()
{
System.out.println("Thisisclient");
try
{
//创建一个Socket
Sockets=newSocket(InetAddress.getByName(null),PORT);
OutputStreamos=s.getOutputStream();//输出流
InputStreamis=s.getInputStream();//输入流
byte[]buf=newbyte[100];
intlen=is.read(buf);//从输入流中读取数据到buf
System.out.println(newString(buf,0,len));
//向输出流中写入数据,请求传输一个文件
os.write("getserver.txt".getBytes());
len=is.read(buf);//从输入流中读取数据到buf
StringtempStr=newString(buf,0,len);
if(tempStr.startsWith("Pleaseinputyournameandpassword"))