導航:首頁 > 版本升級 > socket服務端上傳文件

socket服務端上傳文件

發布時間:2023-08-21 14:11:23

1. 基於mfc的socket編程怎麼進行文件傳輸

1. 採用了多線程的方法,文件傳輸時使用ad()開啟新線程

void CClientsockDlg::OnBnClickedSend()
{
pThreadSend = AfxBeginThread(Thread_Send,this);/
}

文件的發送和接收都開起了新線程

UINTThread_Send(LPVOID lpParam)
{
代碼略…
}

2. 支持從配置文件configuration.ini中獲取伺服器參數

採用GetPrivateProfileString()和GetPrivateProfileInt()分別獲取位於ServerConfiguration.ini文件中的String類型的IP和int類型的port
CString IP;
int port;
GetPrivateProfileString
(L"ServerConfiguration",L"IP",L"沒有讀取到數據!",IP.GetBuffer(10),10,L".\\configuration.ini");
port=GetPrivateProfileInt(L"ServerConfiguration",L"port",0,L".\\configuration.ini");

3. 採用了面向對象的設計方式,功能之間按模塊劃分
MFC本身具有良好的面向對象的特性,本程序嚴格按照MFC框架結構編寫代碼,每個按鈕對應一個功能函數,降低了代碼之間的耦合性,有利於程序的擴展和復用。

void CServersockDlg::OnBnClickedChoose()
void CServersockDlg::OnBnClickedSend()
void CServersockDlg::OnBnClickedRecvdata()
void CServersockDlg::OnBnClickedAbout()
void CServersockDlg::OnBnClickedWriteini()

4. 採用了CSocket類,代碼相對更簡單
CSocket類是MFC框架對socket編程中的winsockAPI的封裝,因此通過這個類管理收發數據更加便利。代碼也跟那個既簡單易懂。
//創建
if(!Clientsock.Socket())
{
CString str;
str.Format(_T("Socket創建失敗:%d"),GetLastError());
AfxMessageBox(str);
}
//連接
if(!Clientsock.Connect(IP,port))
{
CString str;
str.Format(_T("Socket連接失敗:%d"),GetLastError());
AfxMessageBox(str);
}
else
{
AfxMessageBox(_T("Socket連接成功"));
代碼略…
//發送
while(nSize<FindFileData.nFileSizeLow)
{
szBuff = new char[1024];
memset(szBuff,0x00,1024);
nSend =file.Read(szBuff,1024);
Clientsock.Send(szBuff,nSend);//發送數據
nSize += nSend;
}
file.Close();
delete szBuff;
Clientsock.Close();
(dlg->GetDlgItem(IDC_SEND))->EnableWindow(TRUE);
AfxMessageBox(_T("文件發送成功"));
dlg->SetDlgItemTextW(IDC_FILEPATHNAME,_T(""));
}
return 0;

5. 支持數據在伺服器與客戶端之間雙向傳輸

本程序不但可以從客戶端往伺服器端傳文件,而且可以從伺服器端往客戶端傳文件。
但是互傳文件的方式並不是完全相同的。
伺服器端不管是接收文件還是發送文件始終是對綁定的埠進行監聽。
//綁定
if(!Serversock.Bind(port))
{
CString str;
str.Format(_T("Socket綁定失敗: %d"),GetLastError());
AfxMessageBox(str);
}
//監聽
if(!Serversock.Listen(10))
{
CString str;
str.Format(_T("Socket監聽失敗:%d"),GetLastError());
AfxMessageBox(str);
}

客戶端不管是接收文件還是發送文件始終是進行連接。
if(!Clientsock.Connect(IP,port))
{
CString str;
str.Format(_T("Socket連接失ì敗:%d"),GetLastError());
AfxMessageBox(str);
}
else
{
略…

6. 完全圖形化操作界面

二.軟體使用說明

客戶端主界面如圖所示:

單擊「選擇文件」彈出文件對話框,選擇一個要發送的文件,同時保存文件的路徑。
單擊「發送」則會讀取ServerConfiguration.ini文件中的配置信息(IP和port),並根據此信息建立Socket連接,發送文件。注意:伺服器端應該先單擊了「接受客戶端數據」,否則發送失敗。
單擊「接收」也會讀取ServerConfiguration.ini文件中的配置信息(IP和port),並根據此信息建立Socket連接,接收文件。注意:伺服器端應該先選擇了向客戶端發送的文件,並單擊了「發送」,否則接受失敗。
單擊「讀取配置文件」,會從ServerConfiguration.ini文件中讀取配置信息,並以可編輯的文本形式顯示出來,修改完後,單擊「寫入配置文件」,會將修改後的信息保存到配置文件中。
單擊「關於」可以了解到軟體相關信息。
代碼注釋里有更詳細的說明

伺服器端主界面如圖所示

u 單擊「接受客戶端數據」,開始監聽客戶端的鏈接。
u 單擊「選擇文件」彈出文件對話框,選擇一個要發送的文件,同時保存文件的路徑。
u 單擊「發送」則會讀取ServerConfiguration.ini文件中的配置信息(port),並監聽對應埠,准備發送文件。注意:客戶端選擇「接收」以後才能發送成功。
u 單擊「讀取配置文件」,會從ServerConfiguration.ini文件中讀取配置信息,並以可編輯的文本形式顯示出來,修改完後,單擊「寫入配置文件」,會將修改後的信息保存到配置文件中。但是伺服器的IP是不可以修改的,它是在程序開始運行時從伺服器所在機器的網卡上獲取的。
u 單擊「關於」可以了解到軟體相關信息。
u 代碼注釋里有更詳細的說明

代碼下載地址:http://download.csdn.net/detail/leixiaohua1020/6320417

在此附上客戶端使用CSocket發起連接的代碼
[cpp] view plain
//----------------------------發送文件的線程------------------------------
UINT Thread_Send(LPVOID lpParam)
{
CClientsockDlg *dlg=(CClientsockDlg *)lpParam;
(dlg->GetDlgItem(IDC_SEND))->EnableWindow(FALSE);

CSocket Clientsock; //definition socket.
if(!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
}

CString IP;
int port;
GetPrivateProfileString(L"ServerConfiguration",L"IP",L"沒有讀取到數據!",IP.GetBuffer(100),100,L".\\configuration.ini");
port=GetPrivateProfileInt(L"ServerConfiguration",L"port",0,L".\\configuration.ini");
//創建
if(!Clientsock.Socket())
{
CString str;
str.Format(_T("Socket創建失敗: %d"),GetLastError());
AfxMessageBox(str);
}
//連接
// if(!Clientsock.Connect(_T("127.0.0.1"),8088))
if(!Clientsock.Connect(IP,port))
{
CString str;
str.Format(_T("Socket連接失敗: %d"),GetLastError());
AfxMessageBox(str);
}
else
{
AfxMessageBox(_T("Socket連接成功"));
WIN32_FIND_DATA FindFileData;
CString strPathName; //定義用來保存發送文件路徑的CString對象
dlg->GetDlgItemTextW(IDC_FILEPATHNAME,strPathName);
FindClose(FindFirstFile(strPathName,&FindFileData));
Clientsock.Send(&FindFileData,sizeof(WIN32_FIND_DATA));

CFile file;
if(!file.Open(strPathName,CFile::modeRead|CFile::typeBinary))
{
AfxMessageBox(_T("文件不存在"));
return 1;
}

UINT nSize = 0;
UINT nSend = 0;

char *szBuff=NULL;
//發送
while(nSize<FindFileData.nFileSizeLow)
{
szBuff = new char[1024];
memset(szBuff,0x00,1024);
nSend = file.Read(szBuff,1024);
Clientsock.Send(szBuff,nSend);//發送數據
nSize += nSend;
}
file.Close();
delete szBuff;
Clientsock.Close();
(dlg->GetDlgItem(IDC_SEND))->EnableWindow(TRUE);
AfxMessageBox(_T("文件發送成功"));
dlg->SetDlgItemTextW(IDC_FILEPATHNAME,_T(""));
}
return 0;
}

以及伺服器端使用CSocket監聽的代碼:
[cpp] view plain
//----------------------------監聽文件的線程------------------------------
UINT Thread_Func(LPVOID lpParam) //接收文件的線程函數
{
CServersockDlg *dlg = (CServersockDlg *)lpParam; //獲取對話框指針
(dlg->GetDlgItem(IDC_RECVDATA))->EnableWindow(FALSE);

if(!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
}

CString IP;
int port;
GetPrivateProfileString(L"ServerConfiguration",L"IP",L"沒有讀取到數據!",IP.GetBuffer(100),100,L".\\configuration.ini");
port=GetPrivateProfileInt(L"ServerConfiguration",L"port",0,L".\\configuration.ini");

char errBuf[100]={0};// 臨時緩存

SYSTEMTIME t; //系統時間結構

CFile logErrorfile;
if(!logErrorfile.Open(_T("logErrorfile.txt"),CFile::modeCreate|CFile::modeReadWrite))
{
return 1;
}

CSocket Serversock;
CSocket Clientsock;
//創建
if(!Serversock.Socket())
{
CString str;
str.Format(_T("Socket創建失敗: %d"),GetLastError());
AfxMessageBox(str);
}

BOOL bOptVal = TRUE;
int bOptLen = sizeof(BOOL);
Serversock.SetSockOpt(SO_REUSEADDR,(void *)&bOptVal,bOptLen,SOL_SOCKET);

//綁定
if(!Serversock.Bind(port))
{
CString str;
str.Format(_T("Socket綁定失敗: %d"),GetLastError());
AfxMessageBox(str);
}
//監聽
if(!Serversock.Listen(10))
{
CString str;
str.Format(_T("Socket監聽失敗: %d"),GetLastError());
AfxMessageBox(str);
}

GetLocalTime(&t);
sprintf_s(errBuf,"伺服器已經啟動...正在等待接收文件...\r\n時間:%d年%d月%d日 %2d:%2d:%2d \r\n",t.wYear,t.wMonth,t.wDay,
t.wHour,t.wMinute,t.wSecond);
int len = strlen(errBuf);
logErrorfile.Write(errBuf,len);
AfxMessageBox(_T("啟動成功等待接收文件"));
while(1)
{
//AfxMessageBox(_T("伺服器啟動成功..."));
if(!Serversock.Accept(Clientsock)) //等待接收
{
continue;
}
else
{
WIN32_FIND_DATA FileInfo;
Clientsock.Receive(&FileInfo,sizeof(WIN32_FIND_DATA));

CFile file;
file.Open(FileInfo.cFileName,CFile::modeCreate|CFile::modeWrite);
//AfxMessageBox(FileInfo.cFileName);
int length = sizeof(FileInfo.cFileName);
logErrorfile.Write(FileInfo.cFileName,length);
//Receive文件的數據

UINT nSize = 0;
UINT nData = 0;

char *szBuff=NULL;

while(nSize<FileInfo.nFileSizeLow)
{
szBuff = new char[1024];
memset(szBuff,0x00,1024);
nData=Clientsock.Receive(szBuff,1024);
file.Write(szBuff,nData);
nSize+=nData;
}

delete szBuff;
Serversock.Close();
Clientsock.Close();
file.Close();
(dlg->GetDlgItem(IDC_RECVDATA))->EnableWindow(TRUE);
sprintf_s(errBuf,"文件接收成功...\r\n時間:%d年%d月%d日 %2d:%2d:%2d \r\n",t.wYear,t.wMonth,t.wDay,
t.wHour,t.wMinute,t.wSecond);
int len = strlen(errBuf);
logErrorfile.Write(errBuf,len);
//AfxMessageBox(_T("文件接收成功..."));
break;
}
}
return 0;
}

2. c# c/s結構Socket上傳文件的代碼

  1. 發送端(client)

  2. private void button2_Click(object sender, EventArgs e)
    {

    this.button2.Enabled = false;
    Thread TempThread = new Thread(new ThreadStart(this.StartSend));
    TempThread.Start();

    }

    private void StartSend()
    {
    //FileInfo EzoneFile = new FileInfo(this.textBox1.Text);

    string path = @"E:old F directoryTangWeikangge ew1.jpg";

    FileInfo EzoneFile = new FileInfo(path);

    FileStream EzoneStream = EzoneFile.OpenRead();

    int PacketSize = 100000;

    int PacketCount = (int)(EzoneStream.Length / ((long)PacketSize));

    // this.textBox8.Text = PacketCount.ToString();

    // this.progressBar1.Maximum = PacketCount;

    int LastDataPacket = (int)(EzoneStream.Length - ((long)(PacketSize * PacketCount)));

    // this.textBox9.Text = LastDataPacket.ToString();
    IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("163.180.117.229"), 7000);

    Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    client.Connect(ipep);

    // TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(EzoneFile.Name));

    // TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketSize.ToString()));

    // TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketCount.ToString()));

    // TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(LastDataPacket.ToString()));

    byte[] data = new byte[PacketSize];

    for(int i=0; i<PacketCount; i++)
    {
    EzoneStream.Read(data, 0, data.Length);

    TransferFiles.SendVarData(client, data);

    // this.textBox10.Text = ((int)(i + 1)).ToString();

    // this.progressBar1.PerformStep();
    }

    if(LastDataPacket != 0)
    {
    data = new byte[LastDataPacket];

    EzoneStream.Read(data, 0, data.Length);

    TransferFiles.SendVarData(client,data);

    // this.progressBar1.Value = this.progressBar1.Maximum;
    }
    client.Close();

    EzoneStream.Close();

    this.button2.Enabled = true;
    }

  3. 接收端(server)

  4. private void button2_Click(object sender, EventArgs e)
    {
    //int i = 0;
    //FileStream recfs = new FileStream("E:\kangge.jpg", FileMode.OpenOrCreate);
    //Byte[] recbyte = new Byte[2000000];
    //Socket hostsocket = receive.Accept();
    //BinaryWriter newfilestr = new BinaryWriter(recfs);
    //hostsocket.Receive(recbyte, recbyte.Length, SocketFlags.None);
    //for (i = 0; i < recbyte.Length; i++)
    //{
    // newfilestr.Write(recbyte, i, 1);
    //}
    //recfs.Close();

    //hostsocket.Shutdown(SocketShutdown.Receive);
    //hostsocket.Close();

    this.button2.Enabled = false;
    Thread TempThread = new Thread(new ThreadStart(this.StartReceive));
    TempThread.Start();

    }
    private void StartReceive()
    {
    IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("163.180.117.229"), 7000);

    Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    server.Bind(ipep);

    server.Listen(10);

    Socket client = server.Accept();

    // IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;

    // string SendFileName = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));

    // string BagSize = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));

    // int bagCount = int.Parse(System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client)));

    // string bagLast = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));
    int file_name = 1;

    string fileaddr = "E:\old F directory\TangWei\Copy of kangge\" + file_name.ToString() + ".jpg";

    FileStream MyFileStream = new FileStream(fileaddr, FileMode.Create, FileAccess.Write);

    // int SendedCount = 0;

    while(true)
    {
    byte[] data = TransferFiles.ReceiveVarData(client);
    if(data.Length == 0)
    {
    break;
    }
    else
    {
    // SendedCount++;
    MyFileStream.Write(data, 0, data.Length);
    }
    }

    MyFileStream.Close();

    client.Close();

    this.button2.Enabled = true;
    }

  5. 公共類。 TransferFiles

  6. class TransferFiles
    {

    public TransferFiles()
    {

    }

    public static int SendVarData(Socket s, byte[] data) // return integer indicate how many data sent.
    {
    int total = 0;
    int size = data.Length;
    int dataleft = size;
    int sent;
    byte[] datasize = new byte[4];
    datasize = BitConverter.GetBytes(size);
    sent = s.Send(datasize);//send the size of data array.

    while (total < size)
    {
    sent = s.Send(data, total, dataleft, SocketFlags.None);
    total += sent;
    dataleft -= sent;
    }

    return total;
    }

    public static byte[] ReceiveVarData(Socket s) // return array that store the received data.
    {
    int total = 0;
    int recv;
    byte[] datasize = new byte[4];
    recv = s.Receive(datasize, 0, 4, SocketFlags.None);//receive the size of data array for initialize a array.
    int size = BitConverter.ToInt32(datasize, 0);
    int dataleft = size;
    byte[] data = new byte[size];

    while (total < size)
    {
    recv = s.Receive(data, total, dataleft, SocketFlags.None);
    if (recv == 0)
    {
    data = null;
    break;
    }
    total += recv;
    dataleft -= recv;
    }

    return data;

    }
    }

3. 用java socket實現一個伺服器對多個客戶端的文件傳輸

通過socket可以用如下方式進行。
1.啟動服務端代碼。
2.啟動客戶端自動連接服務端。
3.服務端上傳文件,保存文件和路徑。
4.將路徑發送給連接服務端的客戶端。

4. 怎麼用java的socket進行文件傳輸誰能給個簡單的例子,包括發送端和接收端。

java中的網路信息傳輸方式是基於TCP協議或者UD協議P的,socket是基於TCP協議的

例子1
(1)客戶端程序:
import java.io.*;
import java.net.*;
public class Client
{ public static void main(String args[])
{ String s=null;
Socket mysocket;
DataInputStream in=null;
DataOutputStream out=null;
try{
mysocket=new Socket("localhost",4331);
in=new DataInputStream(mysocket.getInputStream());
out=new DataOutputStream(mysocket.getOutputStream());
out.writeUTF("你好!");//通過 out向"線路"寫入信息。
while(true)
{
s=in.readUTF();//通過使用in讀取伺服器放入"線路"里的信息。堵塞狀態,
//除非讀取到信息。
out.writeUTF(":"+Math.random());
System.out.println("客戶收到:"+s);
Thread.sleep(500);
}
}
catch(IOException e)
{ System.out.println("無法連接");
}
catch(InterruptedException e){}
}
}
(2)伺服器端程序:
import java.io.*;import java.net.*;
public class Server
{ public static void main(String args[])
{ ServerSocket server=null;
Socket you=null;String s=null;
DataOutputStream out=null;DataInputStream in=null;
try{ server=new ServerSocket(4331);}
catch(IOException e1){System.out.println("ERRO:"+e1);}
try{ you=server.accept();
in=new DataInputStream(you.getInputStream());
out=new DataOutputStream(you.getOutputStream());
while(true)
{
s=in.readUTF();// 通過使用in讀取客戶放入"線路"里的信息。堵塞狀態,
//除非讀取到信息。

out.writeUTF("你好:我是伺服器");//通過 out向"線路"寫入信息.
out.writeUTF("你說的數是:"+s);
System.out.println("伺服器收到:"+s);
Thread.sleep(500);
}
}
catch(IOException e)
{ System.out.println(""+e);
}
catch(InterruptedException e){}
}
}

例子(2)
(1) 客戶端
import java.net.*;import java.io.*;
import java.awt.*;import java.awt.event.*;
import java.applet.*;
public class Computer_client extends Applet implements Runnable,ActionListener
{ Button 計算;TextField 輸入三邊長度文本框,計算結果文本框;
Socket socket=null;
DataInputStream in=null; DataOutputStream out=null;
Thread thread;
public void init()
{ setLayout(new GridLayout(2,2));
Panel p1=new Panel(),p2=new Panel();
計算=new Button(" 計算");
輸入三邊長度文本框=new TextField(12);計算結果文本框=new TextField(12);
p1.add(new Label("輸入三角形三邊的長度,用逗號或空格分隔:"));
p1.add( 輸入三邊長度文本框);
p2.add(new Label("計算結果:"));p2.add(計算結果文本框);p2.add(計算);
計算.addActionListener(this);
add(p1);add(p2);
}
public void start()
{ try
{ //和小程序所駐留的伺服器建立套接字連接:
socket = new Socket(this.getCodeBase().getHost(), 4331);
in =new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
}
catch (IOException e){}
if(thread == null)
{ thread = new Thread(this);
thread.start();
}
}
public void run()
{ String s=null;
while(true)
{ try{ s=in.readUTF();//堵塞狀態,除非讀取到信息。

計算結果文本框.setText(s);
}
catch(IOException e)
{ 計算結果文本框.setText("與伺服器已斷開");
break;
}
}
}
public void actionPerformed(ActionEvent e)
{ if(e.getSource()==計算)
{ String s=輸入三邊長度文本框.getText();
if(s!=null)
{ try { out.writeUTF(s);
}
catch(IOException e1){}
}
}
}
}

(2) 伺服器端
import java.io.*;import java.net.*;
import java.util.*;import java.sql.*;
public class Computer_server
{ public static void main(String args[])
{ ServerSocket server=null;Server_thread thread;
Socket you=null;
while(true)
{ try{ server=new ServerSocket(4331);
}
catch(IOException e1)
{ System.out.println("正在監聽"); //ServerSocket對象不能重復創建。
}
try{ you=server.accept();
System.out.println("客戶的地址:"+you.getInetAddress());
}
catch (IOException e)
{ System.out.println("正在等待客戶");
}
if(you!=null)
{ new Server_thread(you).start(); //為每個客戶啟動一個專門的線程。
}
else
{ continue;
}
}
}
}
class Server_thread extends Thread
{ Socket socket;Connection Con=null;Statement Stmt=null;
DataOutputStream out=null;DataInputStream in=null;int n=0;
String s=null;
Server_thread(Socket t)
{ socket=t;
try { in=new DataInputStream(socket.getInputStream());
out=new DataOutputStream(socket.getOutputStream());
}
catch (IOException e)
{}
}
public void run()
{ while(true)
{ double a[]=new double[3] ;int i=0;
try{ s=in.readUTF();堵塞狀態,除非讀取到信息。

StringTokenizer fenxi=new StringTokenizer(s," ,");
while(fenxi.hasMoreTokens())
{ String temp=fenxi.nextToken();
try{ a[i]=Double.valueOf(temp).doubleValue();i++;
}
catch(NumberFormatException e)
{ out.writeUTF("請輸入數字字元");
}
}
double p=(a[0]+a[1]+a[2])/2.0;
out.writeUTF(" "+Math.sqrt(p*(p-a[0])*(p-a[1])*(p-a[2])));
sleep(2);
}
catch(InterruptedException e){}
catch (IOException e)
{ System.out.println("客戶離開");
break;
}
}
}
}

這些例子都是Java2實用教程上的.

5. linux下socket文件傳輸問題

如果你的客戶端在發送文件時,每次都重新connect,再進行數據傳輸,則你的程序無回法解決數據的區分。答
如果客戶端是一次connect循環發送,後台服務循環接收,則
(1)如果你的服務端只有一個進程(不支持並發),則A和B不會同時運行,只能按順序接收完A再接收B
(2)如果,每一個新鏈接上來,你都建立一個新的進程去工作,則不會有問題。

6. java socket傳送文件

客戶端代碼如下:

importjava.io.DataOutputStream;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.IOException;
importjava.net.InetSocketAddress;
importjava.net.Socket;

/**
*文件發送客戶端主程序
*@authoradmin_Hzw
*
*/
publicclassBxClient{

/**
*程序main方法
*@paramargs
*@throwsIOException
*/
publicstaticvoidmain(String[]args)throwsIOException{
intlength=0;
doublesumL=0;
byte[]sendBytes=null;
Socketsocket=null;
DataOutputStreamdos=null;
FileInputStreamfis=null;
booleanbool=false;
try{
Filefile=newFile("D:/天啊.zip");//要傳輸的文件路徑
longl=file.length();
socket=newSocket();
socket.connect(newInetSocketAddress("127.0.0.1",48123));
dos=newDataOutputStream(socket.getOutputStream());
fis=newFileInputStream(file);
sendBytes=newbyte[1024];
while((length=fis.read(sendBytes,0,sendBytes.length))>0){
sumL+=length;
System.out.println("已傳輸:"+((sumL/l)*100)+"%");
dos.write(sendBytes,0,length);
dos.flush();
}
//雖然數據類型不同,但JAVA會自動轉換成相同數據類型後在做比較
if(sumL==l){
bool=true;
}
}catch(Exceptione){
System.out.println("客戶端文件傳輸異常");
bool=false;
e.printStackTrace();
}finally{
if(dos!=null)
dos.close();
if(fis!=null)
fis.close();
if(socket!=null)
socket.close();
}
System.out.println(bool?"成功":"失敗");
}
}

服務端代碼如下:

importjava.io.DataInputStream;
importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.net.ServerSocket;
importjava.net.Socket;
importjava.util.Random;
importcom.boxun.util.GetDate;


/**
*接收文件服務
*@authoradmin_Hzw
*
*/
publicclassBxServerSocket{

/**
*工程main方法
*@paramargs
*/
publicstaticvoidmain(String[]args){
try{
finalServerSocketserver=newServerSocket(48123);
Threadth=newThread(newRunnable(){
publicvoidrun(){
while(true){
try{
System.out.println("開始監聽...");
/*
*如果沒有訪問它會自動等待
*/
Socketsocket=server.accept();
System.out.println("有鏈接");
receiveFile(socket);
}catch(Exceptione){
System.out.println("伺服器異常");
e.printStackTrace();
}
}
}
});
th.run();//啟動線程運行
}catch(Exceptione){
e.printStackTrace();
}
}

publicvoidrun(){
}

/**
*接收文件方法
*@paramsocket
*@throwsIOException
*/
publicstaticvoidreceiveFile(Socketsocket)throwsIOException{
byte[]inputByte=null;
intlength=0;
DataInputStreamdis=null;
FileOutputStreamfos=null;
StringfilePath="D:/temp/"+GetDate.getDate()+"SJ"+newRandom().nextInt(10000)+".zip";
try{
try{
dis=newDataInputStream(socket.getInputStream());
Filef=newFile("D:/temp");
if(!f.exists()){
f.mkdir();
}
/*
*文件存儲位置
*/
fos=newFileOutputStream(newFile(filePath));
inputByte=newbyte[1024];
System.out.println("開始接收數據...");
while((length=dis.read(inputByte,0,inputByte.length))>0){
fos.write(inputByte,0,length);
fos.flush();
}
System.out.println("完成接收:"+filePath);
}finally{
if(fos!=null)
fos.close();
if(dis!=null)
dis.close();
if(socket!=null)
socket.close();
}
}catch(Exceptione){
e.printStackTrace();
}
}
}

7. 關於用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();
}
}
*/

閱讀全文

與socket服務端上傳文件相關的資料

熱點內容
中海達靜態數據大概多少內存 瀏覽:599
蘋果6s手機文件管理器 瀏覽:107
qq頭像非主流女生捂臉 瀏覽:736
java判斷string編碼 瀏覽:941
excel工資簿如何匹配相同數據 瀏覽:159
視頻課程學習有哪些app 瀏覽:375
鐵模編程怎麼學 瀏覽:298
數學網路研修研究問題有哪些 瀏覽:677
stl文件怎麼列印 瀏覽:427
json格式變數寫法 瀏覽:68
廣州寄文件去吉林多少錢 瀏覽:254
蘋果APP文件夾創建 瀏覽:903
黃米是什麼app 瀏覽:417
word如何插入一個新文件夾 瀏覽:357
word文件夾前面有個符號 瀏覽:350
把word轉換成語音 瀏覽:220
linuxfile文件 瀏覽:454
如何用網路打普通電話 瀏覽:463
linux進程打開的文件 瀏覽:134
新購u盤無法儲存文件 瀏覽:553

友情鏈接