求一个比较完整的基于TCP/IP的网络收与发程序!越简单越好,多些各位了! 任何一本jsp书籍中都可以找到的,而且讲的要详细的多 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不是web编程,是Java的tcp/ip通讯方面的编程! //file:DownloadServer.javapackage tcpdownload;import java.net.*;import java.io.*;public class DownloadServer { private int port; //监听端口 private String downloadRoot; //下载根目录 private boolean stop; //停止服务标志 public DownloadServer(int port,String downloadRoot) throws Exception{ //只允许使用大于1023的非保留端口号,若使用了保留端口号,则抛出异常 if (port>=1024) this.port = port;else throw new Exception("请使用大于1023的端口号。");File file = new File(downloadRoot);//若提供的目录存在,且确实是一个目录,则将该目录设为下载根目录,否则抛出异常if ((file.exists())&&(file.isDirectory())){//若提供的目录名最后一个字符不是"\",则在最后添加"\"字符,以便稍后生成完整文件路径String temp = downloadRoot.substring(downloadRoot.length()-1,downloadRoot.length());if (!temp.equals("\\")) downloadRoot += "\\";this.downloadRoot = downloadRoot; //将提供的目录设为下载根目录} else throw new Exception("不存在目录"+downloadRoot); stop = false; //停止服务标志初始化为false }//检查文件是否真实存在,核对下载密码,若文件不存在或密码错误,则返回-1,否则返回文件长度//此处只要密码不为空就认为是正确的 private long getFileLength(String fileName,String password){ //若文件名或密码为null,则返回-1if ((fileName==null)||(password==null)) return -1;//若文件名或密码长度为0,则返回-1 if ((fileName.length()==0)||(password.length()==0)) return -1; String filePath = downloadRoot + fileName; //生成完整文件路径File file = new File(filePath);//若文件不存在,则返回-1 if (!file.exists()) return -1; return file.length(); //返回文件长度 } //用指定输出流发送指定文件 private void sendFile(DataOutputStream out,String fileName) throws Exception{ String filePath = downloadRoot + fileName; //生成完整文件路径 //创建与该文件关联的文件输入流FileInputStream in = new FileInputStream(filePath); byte[] buf = new byte[8192];int len;//反复读取该文件中的内容,直到读到的长度为-1 while((len=in.read(buf))>=0){ out.write(buf,0,len); //将读到的数据,按读到的长度写入输出流 out.flush(); } out.close(); in.close(); }//提供下载服务 public void download() throws IOException{System.out.println("下载服务器启动...");//创建监听端口port的ServerSocket对象ServerSocket server = new ServerSocket(port);//始终提供下载服务,直到stop为true while(!stop){ System.out.println("等待下载请求...");Socket socket = server.accept(); //等待请求并建立连接//获取socket的输入流并包装成BufferedReader BufferedReader in = new BufferedReader( new InputStreamReader(socket.getInputStream())); //获取socket的输出流并包装成DataOutputStreamDataOutputStream out = new DataOutputStream(socket.getOutputStream()); try{ String parameterString = in.readLine(); //接收下载请求参数//下载请求参数字符串为自定义的格式,由下载文件相对于下载根目录的路径和//下载密码组成,两者间以字符"@"分隔,此处按"@"分割下载请求参数字符串 String[] parameter = parameterString.split("@"); String fileName = parameter[0]; //获取相对文件路径 String password = parameter[1]; //获取下载密码//打印请求下载相关信息 System.out.print(socket.getInetAddress().getHostAddress()+"提出下载请求,"); System.out.print("请求下载文件"+fileName+":");//检查文件是否真实存在,核对下载密码,获取文件长度 long len = getFileLength(fileName,password); out.writeLong(len); //向客户端返回文件大小 out.flush(); //若获取的文件长度大于等于0,则允许下载,否则拒绝下载if (len >= 0){ System.out.println("允许下载"); System.out.println("正在下载文件"+fileName+"..."); sendFile(out,fileName); //向客户端发送文件 System.out.println("下载完毕"); } else { System.out.println("下载文件不存在或密码错误,拒绝下载!"); } } catch(Exception e){ System.out.println(e.toString()); } finally{ socket.close(); //关闭socket } } //end while System.out.println("文件下载服务器已关闭."); } public static void main(String[] args) {try{//包装标准输入为BufferedReader BufferedReader systemIn = new BufferedReader( new InputStreamReader(System.in));String root = "C:\\"; //下载根目录初始化为C盘根目录 while(true){ System.out.print("请输入下载服务器的下载根目录:"); root = systemIn.readLine().trim(); //从标准输入读取下载根目录 File file = new File(root);//若该目录确实存在且为目录,则跳出循环 if ((file.exists()) && (file.isDirectory())) break; //否则打印目录无效信息 System.out.println("目录"+root+"无效,请重新输入!");}//创建DownloadServer对象,采用8021端口 DownloadServer server = new DownloadServer(8021, root); server.download(); //启动下载服务 } catch(Exception e){ System.out.println(e.toString()); } }} //file:DownloadClientpackage tcpdownload;import java.net.*;import java.io.*;public class DownloadClient { private Socket socket; //客户端socket public DownloadClient(String host,int port) throws Exception{ //初始化socket,连接指定地址和指定端口号socket = new Socket(host,port); }//向服务器提出下载请求,返回下载文件的大小 private long request(String fileName,String password) throws IOException{ //获取socket的输入流并包装成DataInputStreamDataInputStream in = new DataInputStream(socket.getInputStream());//获取socket的输出流并包装成PrintWriter PrintWriter out = new PrintWriter( new OutputStreamWriter(socket.getOutputStream()));//生成下载请求字符串 String requestString = fileName + "@" + password; out.println(requestString); //发出下载请求 out.flush(); return in.readLong(); //接收并返回下载文件长度 }//接收并保存文件 private void receiveFile(String localFile) throws Exception{//获取socket的输入流并包装成BufferedInputStreamBufferedInputStream in = new BufferedInputStream(socket.getInputStream());//获取与指定本地文件关联的文件输出流 FileOutputStream out = new FileOutputStream(localFile); byte[] buf = new byte[8192];int len;//反复读取该文件中的内容,直到读到的长度为-1 while((len=in.read(buf))>=0){ out.write(buf,0,len); //将读到的数据,按读到的长度写入输出流 out.flush(); } out.close(); in.close(); }//从服务器下载文件 public void download() throws Exception{try{//将标准输入包装成BufferedReader BufferedReader systemIn = new BufferedReader( new InputStreamReader(System.in)); System.out.print("请输入下载密码:"); String password = systemIn.readLine(); //从标准输入读取下载密码 System.out.print("请输入要下载的文件路径:"); String downloadFile = systemIn.readLine();//从标准输入读取下载文件名 System.out.print("保存至本地文件:");String localFile = systemIn.readLine(); //从标准输入读取本地文件名//向服务器提出下载请求,并获取下载文件长度long fileLength = request(downloadFile,password);//若获取的文件长度大于等于0,说明允许下载,否则说明拒绝下载 if(fileLength>=0){ System.out.println("下载文件大小:"+fileLength+" B"); System.out.println("正在下载..."); receiveFile(localFile); //从服务器接收文件并保存至本地文件 System.out.println("文件"+downloadFile+"已下载至本地"+localFile); } else{ System.out.println("下载文件"+downloadFile+"不存在或下载密码错误!"); } } catch(IOException e){ System.out.println(e.toString()); } finally{ socket.close(); //关闭socket } } public static void main(String[] args) {try{//创建DownloadClient对象,连接本机上的服务器 DownloadClient client = new DownloadClient("127.0.0.1", 8021); client.download(); //启动客户端下载程序 } catch(Exception e){ System.out.println(e.toString()); } }} 关于继承中遇到的一些问题,希望大家来帮帮我 解释下“数值”型赋值给“对象”型。 java继承的问题 [SQLServer]将截断字符串或二进制数据这个是什么回事? 关于搭建基于LINUX系统下的J2EE开发平台 高分求助,乱码问题,解决马上给分,决不拖延。 如何在提交right.jsp的时候把直赋给left.jsp里的text 吉大的JAVA视频教程 作了个 server程序,只能往数据库插入一条数据, 为什么 ( 如何在java中使用JMail类包 请教一个算法问题!!!!!!!!! 为什么.properties文件中不能用中文键值,怎么办? 请帮忙
import java.io.*;public class DownloadServer { private int port; //监听端口
private String downloadRoot; //下载根目录
private boolean stop; //停止服务标志 public DownloadServer(int port,String downloadRoot) throws Exception{
//只允许使用大于1023的非保留端口号,若使用了保留端口号,则抛出异常
if (port>=1024) this.port = port;
else throw new Exception("请使用大于1023的端口号。");
File file = new File(downloadRoot);
//若提供的目录存在,且确实是一个目录,则将该目录设为下载根目录,否则抛出异常
if ((file.exists())&&(file.isDirectory())){
//若提供的目录名最后一个字符不是"\",则在最后添加"\"字符,以便稍后生成完整文件路径
String temp = downloadRoot.substring(downloadRoot.length()-1,
downloadRoot.length());
if (!temp.equals("\\")) downloadRoot += "\\";
this.downloadRoot = downloadRoot; //将提供的目录设为下载根目录
}
else throw new Exception("不存在目录"+downloadRoot);
stop = false; //停止服务标志初始化为false
}//检查文件是否真实存在,核对下载密码,若文件不存在或密码错误,则返回-1,否则返回文件长度
//此处只要密码不为空就认为是正确的
private long getFileLength(String fileName,String password){
//若文件名或密码为null,则返回-1
if ((fileName==null)||(password==null)) return -1;
//若文件名或密码长度为0,则返回-1
if ((fileName.length()==0)||(password.length()==0)) return -1;
String filePath = downloadRoot + fileName; //生成完整文件路径
File file = new File(filePath);
//若文件不存在,则返回-1
if (!file.exists()) return -1;
return file.length(); //返回文件长度
} //用指定输出流发送指定文件
private void sendFile(DataOutputStream out,String fileName) throws Exception{
String filePath = downloadRoot + fileName; //生成完整文件路径
//创建与该文件关联的文件输入流
FileInputStream in = new FileInputStream(filePath);
byte[] buf = new byte[8192];
int len;
//反复读取该文件中的内容,直到读到的长度为-1
while((len=in.read(buf))>=0){
out.write(buf,0,len); //将读到的数据,按读到的长度写入输出流
out.flush();
}
out.close();
in.close();
}//提供下载服务
public void download() throws IOException{
System.out.println("下载服务器启动...");
//创建监听端口port的ServerSocket对象
ServerSocket server = new ServerSocket(port);
//始终提供下载服务,直到stop为true
while(!stop){
System.out.println("等待下载请求...");
Socket socket = server.accept(); //等待请求并建立连接
//获取socket的输入流并包装成BufferedReader
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
//获取socket的输出流并包装成DataOutputStream
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
try{
String parameterString = in.readLine(); //接收下载请求参数
//下载请求参数字符串为自定义的格式,由下载文件相对于下载根目录的路径和
//下载密码组成,两者间以字符"@"分隔,此处按"@"分割下载请求参数字符串
String[] parameter = parameterString.split("@");
String fileName = parameter[0]; //获取相对文件路径
String password = parameter[1]; //获取下载密码
//打印请求下载相关信息
System.out.print(socket.getInetAddress().getHostAddress()
+"提出下载请求,");
System.out.print("请求下载文件"+fileName+":");
//检查文件是否真实存在,核对下载密码,获取文件长度
long len = getFileLength(fileName,password);
out.writeLong(len); //向客户端返回文件大小
out.flush();
//若获取的文件长度大于等于0,则允许下载,否则拒绝下载
if (len >= 0){
System.out.println("允许下载");
System.out.println("正在下载文件"+fileName+"...");
sendFile(out,fileName); //向客户端发送文件
System.out.println("下载完毕");
}
else {
System.out.println("下载文件不存在或密码错误,拒绝下载!");
}
}
catch(Exception e){
System.out.println(e.toString());
}
finally{
socket.close(); //关闭socket
}
} //end while
System.out.println("文件下载服务器已关闭.");
} public static void main(String[] args) {
try{
//包装标准输入为BufferedReader
BufferedReader systemIn = new BufferedReader(
new InputStreamReader(System.in));
String root = "C:\\"; //下载根目录初始化为C盘根目录
while(true){
System.out.print("请输入下载服务器的下载根目录:");
root = systemIn.readLine().trim(); //从标准输入读取下载根目录
File file = new File(root);
//若该目录确实存在且为目录,则跳出循环
if ((file.exists()) && (file.isDirectory())) break;
//否则打印目录无效信息
System.out.println("目录"+root+"无效,请重新输入!");
}
//创建DownloadServer对象,采用8021端口
DownloadServer server = new DownloadServer(8021, root);
server.download(); //启动下载服务
}
catch(Exception e){
System.out.println(e.toString());
}
}}
import java.io.*;public class DownloadClient { private Socket socket; //客户端socket public DownloadClient(String host,int port) throws Exception{
//初始化socket,连接指定地址和指定端口号
socket = new Socket(host,port);
}//向服务器提出下载请求,返回下载文件的大小
private long request(String fileName,String password) throws IOException{
//获取socket的输入流并包装成DataInputStream
DataInputStream in = new DataInputStream(socket.getInputStream());
//获取socket的输出流并包装成PrintWriter
PrintWriter out = new PrintWriter(
new OutputStreamWriter(socket.getOutputStream()));
//生成下载请求字符串
String requestString = fileName + "@" + password;
out.println(requestString); //发出下载请求
out.flush();
return in.readLong(); //接收并返回下载文件长度
}//接收并保存文件
private void receiveFile(String localFile) throws Exception{
//获取socket的输入流并包装成BufferedInputStream
BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
//获取与指定本地文件关联的文件输出流
FileOutputStream out = new FileOutputStream(localFile);
byte[] buf = new byte[8192];
int len;
//反复读取该文件中的内容,直到读到的长度为-1
while((len=in.read(buf))>=0){
out.write(buf,0,len); //将读到的数据,按读到的长度写入输出流
out.flush();
}
out.close();
in.close();
}//从服务器下载文件
public void download() throws Exception{
try{
//将标准输入包装成BufferedReader
BufferedReader systemIn = new BufferedReader(
new InputStreamReader(System.in));
System.out.print("请输入下载密码:");
String password = systemIn.readLine(); //从标准输入读取下载密码
System.out.print("请输入要下载的文件路径:");
String downloadFile = systemIn.readLine();//从标准输入读取下载文件名
System.out.print("保存至本地文件:");
String localFile = systemIn.readLine(); //从标准输入读取本地文件名
//向服务器提出下载请求,并获取下载文件长度
long fileLength = request(downloadFile,password);
//若获取的文件长度大于等于0,说明允许下载,否则说明拒绝下载
if(fileLength>=0){
System.out.println("下载文件大小:"+fileLength+" B");
System.out.println("正在下载...");
receiveFile(localFile); //从服务器接收文件并保存至本地文件
System.out.println("文件"+downloadFile+"已下载至本地"+localFile);
}
else{
System.out.println("下载文件"+downloadFile+"不存在或下载密码错误!");
}
}
catch(IOException e){
System.out.println(e.toString());
}
finally{
socket.close(); //关闭socket
}
} public static void main(String[] args) {
try{
//创建DownloadClient对象,连接本机上的服务器
DownloadClient client = new DownloadClient("127.0.0.1", 8021);
client.download(); //启动客户端下载程序
}
catch(Exception e){
System.out.println(e.toString());
}
}}