當前位置:首頁 » 文件管理 » socket發送多個文件夾

socket發送多個文件夾

發布時間: 2023-11-25 21:14:58

c語言socket文件傳輸問題

伺服器端(發送文件):首先打開文件【fopen】,用rb方式打開,既可以發送文本文件,也可以發送二進制文件,在無錯時初始化套接字socket,即初始化socket庫【WSAStartup】,分配socket【socket】,填充伺服器的地址,即填充sockaddr_in結構,然後進行綁定【bind】,設置套接字為監聽套接字【listen】,接收連接【accept】,至此伺服器阻塞,等待客戶端的連接。
客戶端(接收文件):首先打開文件【fopen】,用wb方式打開,在無錯時初始化套接字socket,即初始化socket庫【WSAStartup】,分配socket【socket】,填充客戶端的地址,即填充sockaddr_in結構,然後進行綁定【bind】,再填充伺服器的地址結構,然後調用【connect】進行連接,當連接成功後,第一階段的工作便結束了。
第二階段,發送文件。
伺服器端:使用循環while,結束條件是(!feof(fp)),fp是文件指針,feof檢測當前的文件讀取指針是否到達文件尾部,若到達了就返回真,否則返回假。然後在循環內部依次調用【fread】、【send】進行發送。這里有一個問題需要注意,調用fread的時候有兩個參數是要每次讀多少位元組和讀多少次,將第一個設置為1,將第二個設置為緩沖區的大小,用一個變數記錄實際讀到多少位元組,即【fread】的返回值,然後將其傳遞給【send】,就可以實現發送文件了,在發送完成後斷開連接【closesocket】,關閉文件【fclose】。
客戶端:使用while死循環,調用【recv】接收文件,【fwrite】寫入文件,這里也有個和上面類似的問題,就是要將recv的返回值傳遞給fwrite的第三個參數,即受到了多少位元組,就向文件中寫多少位元組。當recv返回值為0時(連接斷開時)退出循環,【closesocket】關閉套接字,調用【fclose】關閉文件。

Ⅱ 關於用java的SOCKET傳輸文件

點對點傳輸文件
/*
import java.io.*;
import java.net.*;
import java.util.*;
*/
private HttpURLConnection connection;//存儲連接
private int downsize = -1;//下載文件大小,初始值為-1
private int downed = 0;//文加已下載大小,初始值為0
private RandomAccessFile savefile;//記錄下載信息存儲文件
private URL fileurl;//記錄要下載文件的地址
private DataInputStream fileStream;//記錄下載的數據流
try{
/*開始創建下載的存儲文件,並初始化值*/
File tempfileobject = new File("h:\\webwork-2.1.7.zip");
if(!tempfileobject.exists()){
/*文件不存在則建立*/
tempfileobject.createNewFile();
}
savefile = new RandomAccessFile(tempfileobject,"rw");

/*建立連接*/
fileurl = new URL("https://webwork.dev.java.net/files/documents/693/9723/webwork-2.1.7.zip");
connection = (HttpURLConnection)fileurl.openConnection();
connection.setRequestProperty("Range","byte="+this.downed+"-");

this.downsize = connection.getContentLength();
//System.out.println(connection.getContentLength());

new Thread(this).start();
}
catch(Exception e){
System.out.println(e.toString());
System.out.println("構建器錯誤");
System.exit(0);
}
public void run(){
/*開始下載文件,以下測試非斷點續傳,下載的文件存在問題*/
try{
System.out.println("begin!");
Date begintime = new Date();
begintime.setTime(new Date().getTime());
byte[] filebyte;
int onecelen;
//System.out.println(this.connection.getInputStream().getClass().getName());
this.fileStream = new DataInputStream(
new BufferedInputStream(
this.connection.getInputStream()));
System.out.println("size = " + this.downsize);
while(this.downsize != this.downed){
if(this.downsize - this.downed > 262144){//設置為最大256KB的緩存
filebyte = new byte[262144];
onecelen = 262144;
}
else{
filebyte = new byte[this.downsize - this.downed];
onecelen = this.downsize - this.downed;
}
onecelen = this.fileStream.read(filebyte,0,onecelen);
this.savefile.write(filebyte,0,onecelen);
this.downed += onecelen;
System.out.println(this.downed);
}
this.savefile.close();
System.out.println("end!");
System.out.println(begintime.getTime());
System.out.println(new Date().getTime());
System.out.println(begintime.getTime() - new Date().getTime());
}
catch(Exception e){
System.out.println(e.toString());
System.out.println("run()方法有問題!");
}
}

/***
//FileClient.java
import java.io.*;
import java.net.*;
public class FileClient {
public static void main(String[] args) throws Exception {

//使用本地文件系統接受網路數據並存為新文件

File file = new File("d:\\fmd.doc");

file.createNewFile();

RandomAccessFile raf = new RandomAccessFile(file, "rw");

// 通過Socket連接文件伺服器

Socket server = new Socket(InetAddress.getLocalHost(), 3318);
//創建網路接受流接受伺服器文件數據
InputStream netIn = server.getInputStream();
InputStream in = new DataInputStream(new BufferedInputStream(netIn));
//創建緩沖區緩沖網路數據

byte[] buf = new byte[2048];

int num = in.read(buf);

while (num != (-1)) {//是否讀完所有數據

raf.write(buf, 0, num);//將數據寫往文件

raf.skipBytes(num);//順序寫文件位元組

num = in.read(buf);//繼續從網路中讀取文件

}
in.close();
raf.close();
}
}

//FileServer.java
import java.io.*;
import java.util.*;
import java.net.*;
public class FileServer {
public static void main(String[] args) throws Exception {

//創建文件流用來讀取文件中的數據

File file = new File("d:\\系統特點.doc");

FileInputStream fos = new FileInputStream(file);

//創建網路伺服器接受客戶請求

ServerSocket ss = new ServerSocket(8801);

Socket client = ss.accept();

//創建網路輸出流並提供數據包裝器

OutputStream netOut = client.getOutputStream();

OutputStream doc = new DataOutputStream(
new BufferedOutputStream(netOut));

//創建文件讀取緩沖區

byte[] buf = new byte[2048];

int num = fos.read(buf);
while (num != (-1)) {//是否讀完文件
doc.write(buf, 0, num);//把文件數據寫出網路緩沖區
doc.flush();//刷新緩沖區把數據寫往客戶端
num = fos.read(buf);//繼續從文件中讀取數據
}
fos.close();
doc.close();
}
}
*/

linux下socket如何傳輸一個目錄以及目錄下的子文件子目錄

socket編程,需要一個伺服器端和一個客戶端
傳輸文件夾的話可以在伺服器端進行發送在客戶端進行接收
方法是,在指定埠建立偵聽,比如8888,使用的協議可以是tcp/ip或者udp/ip
udp是種無鏈接不可靠的協議,建議傳輸文件還是使用tcp協議
客戶端通過connect函數連接伺服器端後就可進行數據傳輸

其實文件傳輸本質就是數據傳輸,我們在伺服器端只需要使用opendir函數「打開」文件夾
再使用readdir函數遍歷文件夾即可,將所有讀到的文件名進行判斷,比如判斷該文件是否為文件夾,或者是否會特殊文件,比如軟鏈接,socket文件,管道文件等等,如果是文件夾則進行該文件夾進行遞歸(即進入該文件夾後施行前面相同的方法,以此類推下去,直到讀取完所有的文件夾),並將該文件夾名稱發送給客戶端,客戶端接收到該文件夾名稱後使用mkdir函數創建一個文件夾,如果為一般文件將該文件名和所在目錄發送到客戶端,客戶端創建該文件(如果是多級文件夾則客戶端則進入文件夾)讀取該文件(fopen或者open),可以一邊讀取文件內容一邊將讀取的內容發送給客戶端,客戶端則將接收到的內容寫入到文件即可

這里需要注意的就是伺服器端與客戶端需要規劃好一定的規則,也就是需要建立一個簡單的伺服器與客戶端通信的協議
比如最簡單的我們使用 文件類型:文件名 來表明傳輸的數據的意義
伺服器端在檢查文件夾內的文件時通過不同的文件類型來制定不同的標簽,客戶端通過檢測這些標簽來確定下一步的操作
比如伺服器檢測到一個文件夾則會發送 文件夾:該文件夾的名稱
客戶端在接收到該數據後進行解析,解析到冒號前的文件類型為文件夾則創建一個冒號後的文件夾名稱(這里文件夾名稱包括多級目錄,我們也可以設置的更完善點,比如 文件類型:文件夾:文件夾:文件夾,最後一個文件夾名稱則為客戶端需要創建的文件夾,前面的則是該文件夾所在的絕對路徑)
有了這種簡明的協議就可以更好地完成socket文件夾復制工作

熱點內容
sql資料庫的埠 發布:2025-01-22 12:20:02 瀏覽:362
安卓最終幻想8怎麼設置中文 發布:2025-01-22 12:19:23 瀏覽:651
怎麼查電腦配置和網路 發布:2025-01-22 12:19:16 瀏覽:586
linuxsnmp查看 發布:2025-01-22 12:17:49 瀏覽:37
安卓數據線怎麼接藍牙 發布:2025-01-22 12:07:29 瀏覽:229
扣扣賬號多少次密碼不正確會被封 發布:2025-01-22 12:07:19 瀏覽:400
python是32位還是64位 發布:2025-01-22 11:51:41 瀏覽:894
鈴聲多多緩存文件夾 發布:2025-01-22 11:51:39 瀏覽:724
java按鍵精靈 發布:2025-01-22 11:49:31 瀏覽:81
python配色 發布:2025-01-22 11:46:40 瀏覽:613