import java.io.*;
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),紅崗企業(yè)網(wǎng)站建設(shè),紅崗品牌網(wǎng)站建設(shè),網(wǎng)站定制,紅崗網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,紅崗網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
import java.net.*;public class ftpServer extends Thread{ public static void main(String args[]){
String initDir;
initDir = "D:/Ftp";
ServerSocket server;
Socket socket;
String s;
String user;
String password;
user = "root";
password = "123456";
try{
System.out.println("MYFTP服務(wù)器啟動(dòng)....");
System.out.println("正在等待連接....");
//監(jiān)聽(tīng)21號(hào)端口
server = new ServerSocket(21);
socket = server.accept();
System.out.println("連接成功");
System.out.println("**********************************");
System.out.println("");
InputStream in =socket.getInputStream();
OutputStream out = socket.getOutputStream();
DataInputStream din = new DataInputStream(in);
DataOutputStream dout=new DataOutputStream(out);
System.out.println("請(qǐng)等待驗(yàn)證客戶(hù)信息....");
while(true){
s = din.readUTF();
if(s.trim().equals("LOGIN "+user)){
s = "請(qǐng)輸入密碼:";
dout.writeUTF(s);
s = din.readUTF();
if(s.trim().equals(password)){
s = "連接成功。";
dout.writeUTF(s);
break;
}
else{s ="密碼錯(cuò)誤,請(qǐng)重新輸入用戶(hù)名:";br dout.writeUTF(s);br br }
}
else{
s = "您輸入的命令不正確或此用戶(hù)不存在,請(qǐng)重新輸入:";
dout.writeUTF(s);
}
}
System.out.println("驗(yàn)證客戶(hù)信息完畢...."); while(true){
System.out.println("");
System.out.println("");
s = din.readUTF();
if(s.trim().equals("DIR")){
String output = "";
File file = new File(initDir);
String[] dirStructure = new String[10];
dirStructure= file.list();
for(int i=0;idirStructure.length;i++){
output +=dirStructure[i]+"\n";
}
s=output;
dout.writeUTF(s);
}
else if(s.startsWith("GET")){
s = s.substring(3);
s = s.trim();
File file = new File(initDir);
String[] dirStructure = new String[10];
dirStructure= file.list();
String e= s;
int i=0;
s ="不存在";
while(true){
if(e.equals(dirStructure[i])){
s="存在";
dout.writeUTF(s);
RandomAccessFile outFile = new RandomAccessFile(initDir+"/"+e,"r");
byte byteBuffer[]= new byte[1024];
int amount;
while((amount = outFile.read(byteBuffer)) != -1){
dout.write(byteBuffer, 0, amount);break;
}break;
}
else if(idirStructure.length-1){
i++;
}
else{
dout.writeUTF(s);
break;
}
}
}
else if(s.startsWith("PUT")){
s = s.substring(3);
s = s.trim();
RandomAccessFile inFile = new RandomAccessFile(initDir+"/"+s,"rw");
byte byteBuffer[] = new byte[1024];
int amount;
while((amount =din.read(byteBuffer) )!= -1){
inFile.write(byteBuffer, 0, amount);break;
}
}
else if(s.trim().equals("BYE"))break;
else{
s = "您輸入的命令不正確或此用戶(hù)不存在,請(qǐng)重新輸入:";
dout.writeUTF(s);
}
}
din.close();
dout.close();
in.close();
out.close();
socket.close();
}
catch(Exception e){
System.out.println("MYFTP關(guān)閉!"+e);
}
}}
我這里有一個(gè)例子希望能夠幫助你
public class Client{
private Socket socket;
try{
Socket socket=new Socket ("localhoast',8088);
ip=InetAddress.getLocalHost();
String localip=ip.getHostAddress();
System.out.println(localip);
String name=ip.getHostName();
System.out.println(name);
}
catch(Exception e){
}
public void start(){
try{
Run r2=new Run();
Thread t1=new Thread(r2);
t1.setDaemon(true);
t1.start();
Scanner sc=new Scanner(System.in);
OutputStream os=socket.getOutputStream();
OutputStreamWriter osw=new OutputStreamWriter(os);
PrintWriter writer=new PrintWriter(osw,true);
while(true){
writer.println(sc.nextLine());
}
}catch(Exception e){
}
}
public static void main(String args[]){
Client client=new Client();
client.start();
}
class Run implements Runnable{
public void run() {
while(true){
try {
InputStream is=socket.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
while(true){
String str=br.readLine();
System.out.println("服務(wù)器說(shuō):"+str);
if("bye".equals(str)){
System.out.println("再見(jiàn)客戶(hù)端");
System.out.println("聊天結(jié)束");
}
}
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
1.TCP服務(wù)端的程序編寫(xiě)
package test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class MyTcp{
private BufferedReader reader;
private ServerSocket serverSocket;
private Socket socket;
/**
* 創(chuàng)建服務(wù)端的程序,讀取客戶(hù)端傳來(lái)的數(shù)據(jù)
*/
void getserver(){
try {
serverSocket = new ServerSocket(8998); //實(shí)例化服務(wù)端socket
System.out.println("服務(wù)器套接字已經(jīng)創(chuàng)建成功");
while (true) {
System.out.println("等待客戶(hù)機(jī)的連接:");
socket = serverSocket.accept(); //實(shí)例化socket對(duì)象
reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); //實(shí)例化BufferReader對(duì)象
getClientMessage();
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void getClientMessage() {
try {
while (true) {
System.out.println("客戶(hù)機(jī)傳來(lái)的信息是:"+reader.readLine());
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
MyTcp myTcp = new MyTcp(); //創(chuàng)建本類(lèi)對(duì)象
myTcp.getserver();
}
}
2.TCP客戶(hù)端程序編寫(xiě)
package test;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.PrintWriter;
import java.net.Socket;
import java.nio.channels.WritableByteChannel;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.BevelBorder;
public class MyTcpClient extends JFrame{
private PrintWriter printWriter;
Socket socket;
private JTextField jTextField = new JTextField();
private JTextArea jTextArea = new JTextArea();
Container container;
/**
* 創(chuàng)建的Tcp客戶(hù)端程序
*/
public MyTcpClient (String title) {
super(title);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
container = this.getContentPane();
final JScrollPane jScrollPane = new JScrollPane();
jScrollPane.setBorder(new BevelBorder(BevelBorder.RAISED)); //顯示邊框
getContentPane().add(jScrollPane,BorderLayout.CENTER);
jScrollPane.setViewportView(jTextArea);
container.add(jTextField,"South"); //將文本框放在窗體下面
jTextField.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
printWriter.println(jTextField.getText()); //將文本框的信息寫(xiě)入流(為下面的輸出流寫(xiě)入信息做準(zhǔn)備)
jTextArea.append(jTextField.getText() + "\n");
jTextArea.setSelectionEnd(jTextArea.getText().length());
jTextField.setText(null);
}
});
}
private void connect() {
jTextArea.append("嘗試連接中...\n");
try {
socket = new Socket("127.0.0.1",8998);
printWriter = new PrintWriter(socket.getOutputStream(),true); //將printwriter中的信息流寫(xiě)入到套接字的輸出流傳送給服務(wù)端
jTextArea.setText("已完成連接\n\n");
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
MyTcpClient myTcpClient = new MyTcpClient("向服務(wù)器發(fā)送數(shù)據(jù)");
myTcpClient.setSize(500,200);
myTcpClient.setVisible(true);
myTcpClient.connect();
}
}
3.效果展示
1先將服務(wù)端的程序跑起來(lái)
2再將客戶(hù)端的程序跑起來(lái)
3.客戶(hù)端和服務(wù)端進(jìn)行交互
摘要
本文解釋了如何利用庫(kù)用Java語(yǔ)言編寫(xiě)FTP客戶(hù)端代碼。它比較了FTP庫(kù)的一個(gè)完全列表,演示了每個(gè)庫(kù)的優(yōu)點(diǎn)和缺點(diǎn),并且?guī)椭鷽Q策者為他們的需要選擇適當(dāng)?shù)膸?kù)。另外,本文闡述了Fa?ade模式如何在取代一個(gè)庫(kù)時(shí)改變管理。最后,作者Jean-Pierre Norguet討論并解決了由于缺乏權(quán)威性的說(shuō)明書(shū)引起的一些問(wèn)題。
讓我們假設(shè)一個(gè)情景:我們要編寫(xiě)一個(gè)純Java應(yīng)用程序,該程序必須從運(yùn)行FTP服務(wù)器的遠(yuǎn)程計(jì)算機(jī)上下載文件。我們也通過(guò)遠(yuǎn)程文件信息,像名字、日期、或者尺寸,來(lái)過(guò)濾下載。
自己來(lái)寫(xiě)一個(gè)FTP協(xié)議處理,盡管是有可能,并且可能很有趣。但是這樣做也有可能有困難、花費(fèi)長(zhǎng)時(shí)間、并且有潛在的風(fēng)險(xiǎn)。既然我們不肯花費(fèi)時(shí)間、精力、或者金錢(qián)自己來(lái)寫(xiě)一個(gè)處理器,那我們推薦使用一個(gè)可重用的現(xiàn)有的軟件組件。萬(wàn)維網(wǎng)上有并且大量的庫(kù)可供使用。有了一個(gè)FTP客戶(hù)端庫(kù),下載一個(gè)文件用Java語(yǔ)言編寫(xiě)就像下面一樣簡(jiǎn)單:
FTPClient ftpClient = new FTPClient();
ftpClient.connect("", "user01", "pass1234");
ftpClient.download("C:\\Temp\\", "README.txt");
// Eventually other operations here ...
ftpClient.disconnect();
尋找一個(gè)適合我們需要的高質(zhì)量的Java FTP客戶(hù)端庫(kù)并不像他看起來(lái)那么簡(jiǎn)單;它可能相當(dāng)困難。要找到一個(gè)Java FTP客戶(hù)端庫(kù)需要花一些時(shí)間。接著,在我們找到所有的已存在的庫(kù)之后,我們選哪個(gè)?每個(gè)庫(kù)適合不同的需要。庫(kù)在質(zhì)量上是不等的,并且它們的設(shè)計(jì)有本質(zhì)的區(qū)別。每個(gè)提供一套不同的屬性和使用不同類(lèi)型的行話(huà)來(lái)描述他們。
因此,計(jì)算和比較FTP客戶(hù)端庫(kù)證明是困難而且令人迷惑的。重復(fù)使用已存在的組件是一個(gè)值得推薦的過(guò)程,但在這個(gè)例子中,啟動(dòng)它也是令人沮喪的。并且這有點(diǎn)羞愧:在選好的一個(gè)好的FTP庫(kù)之后,剩下的工作就是例程了。
本文旨在使選擇過(guò)程簡(jiǎn)短、容易、并且有價(jià)值。我首先列出了所有的FTP客戶(hù)端庫(kù)。接著,我定義和描述了庫(kù)應(yīng)該用某種方式找到的相關(guān)標(biāo)準(zhǔn)的一個(gè)表格。最后,我列出了一個(gè)總瀏覽的矩陣,該矩陣給出了庫(kù)間相互比較的過(guò)程的快速瀏覽。所有的信息提供了我們作出一個(gè)迅速、可靠、和長(zhǎng)期的決定所需的每件事。
使用JDK(Java 開(kāi)發(fā)工具集)的FTP支持
用于FTP的訪(fǎng)問(wèn)規(guī)范是用于注釋的請(qǐng)求:959(RFC959)。Sun Microsystems提供了JDK的一個(gè)RFC959執(zhí)行。但是它是內(nèi)部的、非文檔化的、并且不提供任何資源。當(dāng)RFC959在尚未公開(kāi)時(shí),它實(shí)際上是執(zhí)行RFC1738、URL規(guī)范的一個(gè)公共界面的后終端。如圖1。
圖1. 使用JDK的FTP支持。
RFC1738的一個(gè)執(zhí)行過(guò)程在JDK中作為標(biāo)準(zhǔn)給出。它為基本的FTP傳送做一個(gè)可推理的工作。它是公共的、文檔化的、并且提供源代碼。要使用它,我們可編寫(xiě)下面語(yǔ)句:
URL url = new URL(";type=i");
URLConnection urlc = url.openConnection();
InputStream is = urlc.getInputStream(); // To download
OutputStream os = urlc.getOutputStream(); // To upload
使用JDK的FTP客戶(hù)端嚴(yán)格的遵守標(biāo)準(zhǔn)推薦,但它有以下幾個(gè)說(shuō)明:
它從根本上區(qū)別于第三方的FTP客戶(hù)端庫(kù);這些執(zhí)行RFC959而不是RFC1738
RFC959用大多數(shù)的桌面FTP客戶(hù)端工具執(zhí)行。許多Java程序員使用這些工具連接到FTP服務(wù)器上。作為一個(gè)嘗試,這些工具及有可能優(yōu)先于類(lèi)似的RFC959庫(kù)。
URL 和URLConnection類(lèi)只開(kāi)放用于通訊的流。Sun庫(kù)不為構(gòu)造原始的FTP服務(wù)器響應(yīng)成為像String、 File、 RemoteFile、 或者 Calendar之類(lèi)的更合用的Java對(duì)象而提供直接支持。所以我們不得不編寫(xiě)更多的代碼,只是為了把數(shù)據(jù)寫(xiě)入一個(gè)文件中或者開(kāi)始一個(gè)目錄列表。
正像RFC1738的3.2部分解釋的一樣,"最優(yōu)化",F(xiàn)TP URL在每個(gè)操作后要求關(guān)閉(控制)連接。這對(duì)于傳送許多小文件是一種浪費(fèi)、并且毫無(wú)效率。而且,作了特別限制FTP服務(wù)器可能把會(huì)這樣一個(gè)通訊開(kāi)銷(xiāo)認(rèn)為一個(gè)是惡毒的網(wǎng)絡(luò)攻擊或者濫用而拒絕提供進(jìn)一步的服務(wù)。
最后,它缺乏幾個(gè)有用的屬性。
由于以上所有或者某種原因,可優(yōu)先使用一個(gè)第三方的庫(kù)。下面部分列出了可供選擇的第三方的庫(kù)。
見(jiàn):