实例介绍
【实例简介】socket上传下载文件,含服务器端 以及客户端 完整代码
【实例截图】
【核心代码】
android客户端代码:
package net.testSocket;
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 filePath) throws Exception {
try {
//获取本地文件
File file = new File(filePath);
getMessageStream = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));
out = new DataOutputStream(socket.getOutputStream());
// out.writeUTF(filePath);
//发送文件属性
out.writeUTF(file.getName());
out.flush();
out.writeLong((long) file.length());
out.flush();
int bufferSize = 1024*8;
byte[] buf = new byte[bufferSize];
while (true) {
int read = 0;
if (getMessageStream != null) {
read = getMessageStream.read(buf);
}
if (read == -1) {
break;
}
out.write(buf, 0, read);
}
out.flush();
getMessageStream.close();
System.out.println("-----发送完成------");
} catch (Exception e) {
System.out.println(e.toString());
} finally {
if (out != null)
out.close();
}
}
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) {
}
}
}
服务器端代码:
package com.server.test;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ServerTest {
int port = 8888;//端口号,必须与客户端一致
// 选择进行传输的文件(测试)
String filePath = "E:\\img1.png";
Socket client;
void start() {
try {
ServerSocket serverSocket = new ServerSocket(port);
while (true) {
client = serverSocket.accept();
try {
// IOException侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。
System.out.println("-----建立socket链接----");
//接受客户端信息
DataInputStream dis = new DataInputStream(new BufferedInputStream(client.getInputStream()));
// System.out.println(dis.readLine());//接收文字信息
//接收客户端发送的文件
getMessage(dis);
//向客户端发送文件(测试)
// setMessage(filePath);
dis.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
client.close();
System.out.println("close");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
//向客户端发送信息
private void setMessage(String filePath) throws IOException{
File fi = new File(filePath);
System.out.println("要发送的文件长度:" (int) fi.length());
//向客户端发送信息
DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));
DataOutputStream ps = new DataOutputStream(client.getOutputStream());
//将文件名及长度传给客户端。中文名需要处理
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();
fis.close();
System.out.println("-----文件传输完成------");
}
//接收客户端发送的信息
private void getMessage(DataInputStream inputStream) {
try {
//本地保存路径,文件名会自动从服务器端继承而来。
String savePath = "D://android_img/";
File file = new File(savePath);
// 创建文件夹
if (!file.exists()) {
file.mkdirs();
}
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" getTime());
while (true) {
int read = 0;
if (inputStream != null) {
read = inputStream.read(buf);
}
passedlen = read;
if (read == -1) {
break;
}
//进度条,如果是大文件,可能会重复打印出一些相同的百分比
System.out.println("文件接收了" (passedlen * 100/ len) "%\n");
fileOut.write(buf, 0, read);
}
//花费的时间
System.out.println("接收完成,文件存为" savePath "\n" getTime());
fileOut.close();
} catch (Exception e) {
System.out.println("接收消息错误" "\n" e.toString());
return;
}
}
public static String getTime(){
long tmp = System.currentTimeMillis();//花费的时间
SimpleDateFormat formatter = new SimpleDateFormat("yyyy年-MM月dd日-HH时mm分ss秒");
Date date = new Date(tmp);
return formatter.format(date);
}
public static void main(String arg[]) {
System.out.println("-----准备建立socket链接----");
new ServerTest().start();
}
}
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论