利用java socket实现文件传输

利用java socket实现文件传输,第1张

1.服务器

package sterning

import java.io.BufferedInputStream

import java.io.DataInputStream

import java.io.DataOutputStream

import java.io.File

import java.io.FileInputStream

import java.net.ServerSocket

import java.net.Socket

public class ServerTest {

int port = 8821

void start() {

Socket s = null

try {

ServerSocket ss = new ServerSocket(port)

while (true) {

// 选择进行传输的文件

String filePath = "D:\\lib.rar"

File fi = new File(filePath)

System.out.println("文件长度:" + (int) fi.length())

// public Socket accept() throws

// IOException侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。

s = ss.accept()

System.out.println("建立socket链接")

DataInputStream dis = new DataInputStream(new BufferedInputStream(s.getInputStream()))

dis.readByte()

DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)))

DataOutputStream ps = new DataOutputStream(s.getOutputStream())

//将文件名及长度传给客户端。这里要真正适用所有平台,例如中文名的处理,还需要加工,具体可以参见Think In Java 4th里有现成的代码。

ps.writeUTF(fi.getName())

ps.flush()

ps.writeLong((long) fi.length())

ps.flush()

int bufferSize = 8192

byte[] buf = new byte[bufferSize]

while (true) {

int read = 0

if (fis != null) {

read = fis.read(buf)

}

if (read == -1) {

break

}

ps.write(buf, 0, read)

}

ps.flush()

// 注意关闭socket链接哦,不然客户端会等待server的数据过来,

// 直到socket超时,导致数据不完整。

fis.close()

s.close()

System.out.println("文件传输完成")

}

} catch (Exception e) {

e.printStackTrace()

}

}

public static void main(String arg[]) {

new ServerTest().start()

}

}

2.socket的Util辅助类

package sterning

import java.net.*

import java.io.*

public class ClientSocket {

private String ip

private int port

private Socket socket = null

DataOutputStream out = null

DataInputStream getMessageStream = null

public ClientSocket(String ip, int port) {

this.ip = ip

this.port = port

}

/** *//**

* 创建socket连接

*

* @throws Exception

* exception

*/

public void CreateConnection() throws Exception {

try {

socket = new Socket(ip, port)

} catch (Exception e) {

e.printStackTrace()

if (socket != null)

socket.close()

throw e

} finally {

}

}

public void sendMessage(String sendMessage) throws Exception {

try {

out = new DataOutputStream(socket.getOutputStream())

if (sendMessage.equals("Windows")) {

out.writeByte(0x1)

out.flush()

return

}

if (sendMessage.equals("Unix")) {

out.writeByte(0x2)

out.flush()

return

}

if (sendMessage.equals("Linux")) {

out.writeByte(0x3)

out.flush()

} else {

out.writeUTF(sendMessage)

out.flush()

}

} catch (Exception e) {

e.printStackTrace()

if (out != null)

out.close()

throw e

} finally {

}

}

public DataInputStream getMessageStream() throws Exception {

try {

getMessageStream = new DataInputStream(new BufferedInputStream(socket.getInputStream()))

return getMessageStream

} catch (Exception e) {

e.printStackTrace()

if (getMessageStream != null)

getMessageStream.close()

throw e

} finally {

}

}

public void shutDownConnection() {

try {

if (out != null)

out.close()

if (getMessageStream != null)

getMessageStream.close()

if (socket != null)

socket.close()

} catch (Exception e) {

}

}

}

3.客户端

package sterning

import java.io.BufferedOutputStream

import java.io.DataInputStream

import java.io.DataOutputStream

import java.io.FileOutputStream

public class ClientTest {

private ClientSocket cs = null

private String ip = "localhost"// 设置成服务器IP

private int port = 8821

private String sendMessage = "Windwos"

public ClientTest() {

try {

if (createConnection()) {

sendMessage()

getMessage()

}

} catch (Exception ex) {

ex.printStackTrace()

}

}

private boolean createConnection() {

cs = new ClientSocket(ip, port)

try {

cs.CreateConnection()

System.out.print("连接服务器成功!" + "\n")

return true

} catch (Exception e) {

System.out.print("连接服务器失败!" + "\n")

return false

}

}

private void sendMessage() {

if (cs == null)

return

try {

cs.sendMessage(sendMessage)

} catch (Exception e) {

System.out.print("发送消息失败!" + "\n")

}

}

private void getMessage() {

if (cs == null)

return

DataInputStream inputStream = null

try {

inputStream = cs.getMessageStream()

} catch (Exception e) {

System.out.print("接收消息缓存错误\n")

return

}

try {

//本地保存路径,文件名会自动从服务器端继承而来。

String savePath = "E:\\"

int bufferSize = 8192

byte[] buf = new byte[bufferSize]

int passedlen = 0

long len=0

savePath += inputStream.readUTF()

DataOutputStream fileOut = new DataOutputStream(new BufferedOutputStream(new BufferedOutputStream(new FileOutputStream(savePath))))

len = inputStream.readLong()

System.out.println("文件的长度为:" + len + "\n")

System.out.println("开始接收文件!" + "\n")

while (true) {

int read = 0

if (inputStream != null) {

read = inputStream.read(buf)

}

passedlen += read

if (read == -1) {

break

}

//下面进度条本为图形界面的prograssBar做的,这里如果是打文件,可能会重复打印出一些相同的百分比

System.out.println("文件接收了" + (passedlen * 100/ len) + "%\n")

fileOut.write(buf, 0, read)

}

System.out.println("接收完成,文件存为" + savePath + "\n")

fileOut.close()

} catch (Exception e) {

System.out.println("接收消息错误" + "\n")

return

}

}

public static void main(String arg[]) {

new ClientTest()

}

}

客户端代码如下:

import java.io.DataOutputStream  

import java.io.File  

import java.io.FileInputStream  

import java.io.IOException  

import java.net.InetSocketAddress  

import java.net.Socket  

  

/** 

 * 文件发送客户端主程序 

 * @author admin_Hzw 

 * 

 */  

public class BxClient {  

      

    /** 

     * 程序main方法 

     * @param args 

     * @throws IOException 

     */  

    public static void main(String[] args) throws IOException {  

        int length = 0  

        double sumL = 0   

        byte[] sendBytes = null  

        Socket socket = null  

        DataOutputStream dos = null  

        FileInputStream fis = null  

        boolean bool = false  

        try {  

            File file = new File("D:/天啊.zip") //要传输的文件路径  

            long l = file.length()   

            socket = new Socket()    

            socket.connect(new InetSocketAddress("127.0.0.1", 48123))  

            dos = new DataOutputStream(socket.getOutputStream())  

            fis = new FileInputStream(file)        

            sendBytes = new byte[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 (Exception e) {  

            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?"成功":"失败")  

    }  

}

服务端代码如下:

import java.io.DataInputStream  

import java.io.File  

import java.io.FileOutputStream  

import java.io.IOException  

import java.net.ServerSocket  

import java.net.Socket  

import java.util.Random  

import com.boxun.util.GetDate  

  

  

/** 

 * 接收文件服务 

 * @author admin_Hzw 

 * 

 */  

public class BxServerSocket {  

      

    /** 

     * 工程main方法 

     * @param args 

     */  

    public static void main(String[] args) {  

        try {  

            final ServerSocket server = new ServerSocket(48123)  

            Thread th = new Thread(new Runnable() {  

                public void run() {  

                    while (true) {  

                        try {    

                            System.out.println("开始监听...")  

                            /* 

                             * 如果没有访问它会自动等待 

                             */  

                            Socket socket = server.accept()  

                            System.out.println("有链接")  

                            receiveFile(socket)  

                        } catch (Exception e) {  

                            System.out.println("服务器异常")  

                            e.printStackTrace()  

                        }  

                    }  

                }  

            })  

            th.run() //启动线程运行  

        } catch (Exception e) {  

            e.printStackTrace()  

        }       

    }  

  

    public void run() {  

    }  

  

    /** 

     * 接收文件方法 

     * @param socket 

     * @throws IOException 

     */  

    public static void receiveFile(Socket socket) throws IOException {  

        byte[] inputByte = null  

        int length = 0  

        DataInputStream dis = null  

        FileOutputStream fos = null  

        String filePath = "D:/temp/"+GetDate.getDate()+"SJ"+new Random().nextInt(10000)+".zip"  

        try {  

            try {  

                dis = new DataInputStream(socket.getInputStream())  

                File f = new File("D:/temp")  

                if(!f.exists()){  

                    f.mkdir()    

                }  

                /*   

                 * 文件存储位置   

                 */  

                fos = new FileOutputStream(new File(filePath))      

                inputByte = new byte[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 (Exception e) {  

            e.printStackTrace()  

        }  

    }  

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11684910.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存