Socket实现文件互传(二)
来源:互联网 发布:韩国电视台直播软件 编辑:程序博客网 时间:2024/06/07 09:47
Socket实现文件传输(二)
上次说了用Socket实现文件传输的前提工作,获取手机的各种资源文件,这篇就主要讲一下具体的实现过程,传输原理是基于Socket实现的。
实现文件传输
在拿到各种文件资源后(关于获取手机资源文件请参照我的上一篇博客获取手机文件资源),我们可以传输文件到电脑了,在传输文件之前先要连接设备,也就是在客户端连接到一台pc,Socket连接客户端和服务端必须在线程里面执行,
在点击连接设备后,启动新线程,执行Socket连接工作,在连接的时候有几点需要注意的,
1. 客户端和pc端必须在同一个局域网下;
2. 在连接时pc端需要关闭防火墙,不过我试过有时候不关也可以,但是最好还是关闭;
3. 在连接完成后Socket和流都要close掉,否则数据传不过去;代码如下:
package com.example.manager.Thread;import android.util.Log;import com.example.manager.Fragment.ConnectFragment;import java.io.BufferedWriter;import java.io.OutputStreamWriter;import java.net.Socket;/** * Created by Dangelo on 2016/5/20. */public class SocketThread implements Runnable { private Socket socket; private String IP; private int port; public SocketThread(Socket socket, String IP, int port){ this.socket = socket; this.IP = IP; this.port = port; } @Override public void run() { try { socket = new Socket(IP, port); ConnectFragment.connectHandler.sendEmptyMessage(0x000); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); writer.close(); socket.close(); } catch (Exception e) { Log.e("Socket Error", e.toString()); ConnectFragment.connectHandler.sendEmptyMessage(0x111); } }}
到这客户端连接pc的工作基本上就完成了。接下来就是服务端的任务了。启动服务端,在接收到客户端的请求之后连接到客户端,这下就能够传文件到pc了,在做这个项目的时候我在传文件的基础上还附加了一些传输命令功能,可以在客户端直接控制pc执行一些操作,像常用的电源,音量,亮度,鼠标控制等等,这些操作方便了对pc的控制。
在传输文件和命令时需要区分它们的类别,我用的是Json数据来处理的,如果接收到的是command就执行命令操作,再根据后续的具体命令去执行具体的操作,如果是file就执行传文件操作。这样在处理数据的时候就很容易了,启动后连接成功拿到当前传过来的字符串,先判断是传输文件还是传输命令,如果有“command”键就执行命令操作,并且拿到当前的命令类型,执行对应操作,代码如下:
static ServerSocket ss = null; public void run() { try { ss = new ServerSocket(30000); System.out.println("服务端创建成功!"); while(true) { Socket socket = ss.accept(); System.out.println("客户端连接成功!"); System.out.println(socket.getLocalSocketAddress()); BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); StringBuilder str = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { str.append(line); } if(str.toString().equals("")){ continue; } JSONObject jsonObject = new JSONObject(str.toString()); if(jsonObject.has("command")) { //传输命令 switch (jsonObject.get("command").toString()){ case "power" : Runtime.getRuntime().exec(jsonObject.get("type").toString()); break; case "volume" : volumeOperation(jsonObject.get("type").toString()); break; case "brightness" : brightnessOperation(jsonObject.get("type").toString()); break; case "mouse" : mouseOperation(str.toString()); break; case "driver" : Socket driverSocket = ss.accept(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(driverSocket.getOutputStream())); Storage storage = new Storage(); List<Map<String, String>> list = storage.getDriver(); StringBuilder buffer = new StringBuilder(); buffer.append("{'driver':["); for (int i = 0; i < list.size(); i++) { buffer.append("{") .append("'name':'") .append(list.get(i).get("name")) .append("','totalSize':'") .append(list.get(i).get("totalSize")) .append("','availableSize':'") .append(list.get(i).get("availableSize")); if(i == list.size()-1){ buffer.append("'}]}"); } else { buffer.append("'},"); } } writer.write(buffer.toString()); writer.close(); driverSocket.close(); break; case "tools" : Runtime.getRuntime().exec(jsonObject.get("type").toString()); break; case "screenShot" : Mouse mouse = new Mouse(); BufferedImage image = mouse.screenShot(); File file = new File("E:/QuickSend"); if(!file.exists()){ file.mkdirs(); } mouse.saveScreenShot(image, "E:/QuickSend/ScreenShot-" + getTime() + ".png"); break; } } else { //传输文件 String fileName = jsonObject.get("fileName").toString();// String filePath = jsonObject.get("savePath").toString(); File file = new File("E:/QuickSend"); if(!file.exists()){ file.mkdir(); //新建文件夹 } /** * 字节流读取文件 */ Socket fileSocket = ss.accept(); InputStream is = fileSocket.getInputStream(); FileOutputStream os = new FileOutputStream(file.getPath() + '/' + fileName); byte[] c = new byte[1024 * 10]; int b; while ((b = is.read(c)) > 0) { os.write(c, 0, b); } is.close(); os.close(); fileSocket.close(); } reader.close(); socket.close(); } } catch (Exception e) { System.out.println(e.toString()); } }
所有的操作类型都是通过Json数据发送过来的,这样很容易处理,通过键,拿到值,执行操作,服务端界面如图
服务端开启后会显示出当前连接网络的ip地址,在客户端输入这个ip地址就能连接成功了,附上功能函数的代码:
传输文件:
String fileName = jsonObject.get("fileName").toString(); File file = new File("E:/QuickSend"); if(!file.exists()){ file.mkdir(); //新建文件夹 } /** * 字节流读取文件 */ Socket fileSocket = ss.accept(); InputStream is = fileSocket.getInputStream(); FileOutputStream os = new FileOutputStream(file.getPath() + '/' + fileName); byte[] c = new byte[1024 * 10]; int b; while ((b = is.read(c)) > 0) { os.write(c, 0, b); } is.close(); os.close(); fileSocket.close();
获取电脑盘符:
public class Storage { private List< Map<String, String> > list; /** * 获取硬盘的每个盘符 */ public List< Map<String, String> > getDriver(){ // 当前文件系统类 FileSystemView fsv = FileSystemView.getFileSystemView(); // 列出所有windows 磁盘 File [] files = File.listRoots(); System.out.println(files.length); list = new ArrayList<>(); // 显示磁盘卷标 for (File file : files) { if(!fsv.getSystemDisplayName(file).equals("")){ Map<String, String> map = new HashMap<>(); map.put("name", fsv.getSystemDisplayName(file)); map.put("totalSize", FormatFileSize(file.getTotalSpace())); map.put("availableSize", FormatFileSize(file.getFreeSpace())); list.add(map); System.out.print(fsv.getSystemDisplayName(file)); System.out.print("总大小" + FormatFileSize(file.getTotalSpace()) + " "); System.out.println("剩余" + FormatFileSize(file.getFreeSpace())); } } return list; } private String FormatFileSize(long fileS) { DecimalFormat df = new DecimalFormat("#.00"); String fileSizeString ; if (fileS < 1024) { fileSizeString = df.format((double) fileS) + "B"; } else if (fileS < 1048576) { fileSizeString = df.format((double) fileS / 1024) + "KB"; } else if (fileS < 1073741824) { fileSizeString = df.format((double) fileS / 1048576) + "MB"; } else { fileSizeString = df.format((double) fileS / 1073741824) + "GB"; } return fileSizeString; }}case "driver" : Socket driverSocket = ss.accept(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(driverSocket.getOutputStream())); Storage storage = new Storage(); List<Map<String, String>> list = storage.getDriver(); StringBuilder buffer = new StringBuilder(); buffer.append("{'driver':["); for (int i = 0; i < list.size(); i++) { buffer.append("{") .append("'name':'") .append(list.get(i).get("name")) .append("','totalSize':'") .append(list.get(i).get("totalSize")) .append("','availableSize':'") .append(list.get(i).get("availableSize")); if(i == list.size()-1){ buffer.append("'}]}"); } else { buffer.append("'},"); } } writer.write(buffer.toString()); writer.close(); driverSocket.close(); break;
鼠标操作:
public class Mouse { private Dimension dimension; private Robot robot; private Point point; private final static String DIRECTION_UP = "up"; private final static String DIRECTION_DOWN = "down"; public Mouse() { dimension = Toolkit.getDefaultToolkit().getScreenSize(); //获取屏幕尺寸 try { robot = new Robot(); } catch (AWTException e) { e.printStackTrace(); } } /** * 移动鼠标位置 */ public void move(int x,int y){ point = MouseInfo.getPointerInfo().getLocation(); point.x += -x; point.y += -y; robot.mouseMove(point.x,point.y); //移动鼠标到x,y位置 } /** * 单击 */ public void singleClick(){ point = MouseInfo.getPointerInfo().getLocation(); robot.mouseMove(point.x, point.y); robot.mousePress(InputEvent.BUTTON1_MASK); //按下鼠标上按键 robot.mouseRelease(InputEvent.BUTTON1_MASK); //释放鼠标上按键 } /** * 双击 */ public void doubleClick(){ point = MouseInfo.getPointerInfo().getLocation(); robot.mouseMove(point.x, point.y); robot.mousePress(InputEvent.BUTTON1_MASK); //按下鼠标左按键 robot.mouseRelease(InputEvent.BUTTON1_MASK); //释放鼠标左按键 robot.delay(100); robot.mousePress(InputEvent.BUTTON1_MASK); //再次按下鼠标左按键 robot.mouseRelease(InputEvent.BUTTON1_MASK); //释放鼠标左按键 } /** * 右击 */ public void rightClick(){ point = MouseInfo.getPointerInfo().getLocation(); robot.mouseMove(point.x, point.y); robot.mousePress(InputEvent.BUTTON3_MASK); robot.mouseRelease(InputEvent.BUTTON3_MASK); } /** * 鼠标滚轮的滑动 */ public void wheel(String direction){ if(direction.equals(DIRECTION_UP)) { robot.mouseWheel(-1); //滚轮上滑 } else if(direction.equals(DIRECTION_DOWN)){ robot.mouseWheel(1); //滚轮下滑 } } public void direction(String key){ switch (key){ case "up" : robot.keyPress(KeyEvent.VK_UP); break; case "down" : robot.keyPress(KeyEvent.VK_DOWN); break; case "left" : robot.keyPress(KeyEvent.VK_LEFT); break; case "right" : robot.keyPress(KeyEvent.VK_RIGHT); break; case "home" : robot.keyPress(KeyEvent.VK_HOME); break; case "end" : robot.keyPress(KeyEvent.VK_END); break; } } /** * 获取屏幕截图 */ public BufferedImage screenShot(){ return robot.createScreenCapture(new Rectangle(0,0,dimension.width, dimension.height)); } /** * 保存屏幕截图 */ public void saveScreenShot(BufferedImage image, String path){ try { ImageIO.write(image, "png", new File(path)); } catch (IOException e) { System.out.println(e.toString()); } }}
语音识别:这块主要是用的讯飞语音的接口,http://www.xfyun.cn/
获取当前路连接网络的IP地址:
package Utils; /** * Created byDangelo on 2016/7/22. */import java.net.Inet4Address;import java.net.InetAddress;import java.net.NetworkInterface;import java.util.Enumeration; public class NetWorkIP { publicString getIP(){ Enumeration allNetInterfaces = null; try { allNetInterfaces = NetworkInterface.getNetworkInterfaces(); }catch (java.net.SocketException e) { e.printStackTrace(); } InetAddress ip = null; while(allNetInterfaces.hasMoreElements()) { NetworkInterface netInterface = (NetworkInterface) allNetInterfaces .nextElement(); System.out.println(netInterface.getName()); Enumeration addresses = netInterface.getInetAddresses(); while (addresses.hasMoreElements()) { ip = (InetAddress) addresses.nextElement(); if (ip != null && ip instanceofInet4Address) { System.out.println("/u672c/u673a/u7684IP = " +ip.getHostAddress()); if(ip.getHostAddress().equals("127.0.0.1")){ continue; } return ip.getHostAddress(); } } } return"暂无网络连接"; }}
其它的操作都是一些简单的命令执行,直接Runtime.getRuntime().exec(“xxxx”);方法中传cmd命令就行了,
下面附上一些常用命令:
“Shutdown -s” 关机
“Shutdown -h” 睡眠
“Shutdown -r” 重启
“explorer” 资源管理器
“cmd –c start teskmgr” 任务管理器
"cmd /c start" 命令提示符
“cmd /c start control” 控制面板
“”notepad 记事本
“calc” 计算器
“dvdplay Windows” Windows MediaPlay
“write” 写字板
“mspaint” 画图板
“cmd /c start start www.baidu.com”访问百度
“cmd /c start start www.baidu.com/s?wd=xxxxx" 搜索xxxxx
到这里,Socket实现文件传输就全部介绍完了,Manager应用的功能也就介绍完了。通过这个项目,我对Socket的理解更加深入,了,这对以后的学习也会有很大帮助,希望这些内容能对大家有所帮助。
项目客户端地址:https://github.com/xiyouZmt/Manager
项目服务端地址:https://github,com/xiyouZmt/Manager_Server
- Socket实现文件互传(二)
- Socket实现文件互传(一)
- Android Java Socket实现文件上传(二)——服务端
- Flex利用socket实现断点续传(二)
- Socket通信(二)-- 多线程服务器实现
- Unity如何实现网络通讯(二):SOCKET
- socket 实现文件上传下载
- Socket层实现系列 — bind()的实现(二)
- Socket层实现系列 — accept()的实现(二)
- android实现Socket通信二
- RSA加密Socket传输文件、签名(二)
- (转)socket传文件
- 通过Socket实现进程间异步通讯(二)
- 通过Socket实现进程间异步通讯(二)
- VisualC#中托管Socket的实现方法(二) (2)
- 一个基于socket的资源共享平台的实现(二)
- 使用 Socket 通信实现 FTP 客户端程序(二)
- Java之Socket简单聊天实现(QQ续二)
- wifi详解(四)
- C++拷贝构造函数
- 推荐10 个短小却超实用的 JavaScript 代码段
- C++ stringstream的用法
- java中获取当前系统时间,日期并格式化输出
- Socket实现文件互传(二)
- 有道笔记无法同步(笔录)
- MSP430 移植printf和scanf
- [Android]自定义EmptyView列表数据为空显示
- StateMachine 源码流程分析
- 线上性能问题初步排查方法
- Redis和Memcached的区别---查询资料整理;
- poj3683Priest John's Busiest Day【2-sat二选一输出】
- hdu 5724 - chess (sg函数)