Socket传文件

导读:
  非常简单的一个传文件的功能;为多个客户端每天定时分配资料,Timer没有加进去,参考参考!
  服务端:
  
  package cn.jatula.socket;
  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;
  /**
  * 服务器端
  * @author lake
  *
  */
  public class ServerTest {
  int port = 8821;
  void start() {
  Socket s = null;
  try {
  ServerSocket ss = new ServerSocket(port);
  while (true) {
  // 选择进行传输的文件
  String filePath = "C://jatula.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());
  //将文件名及长度传给客户端。这里要真正适用所有平台,例如中文名的处理,还需要加工。
  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();
  }
  }
  
  
  客户端:
  
  package cn.jatula.socket;
  import java.io.BufferedOutputStream;
  import java.io.DataInputStream;
  import java.io.DataOutputStream;
  import java.io.FileOutputStream;
  /**
  * 客户端
  * @author lake
  *
  */
  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();
  }
  }
  
  辅助类
  
  package cn.jatula.socket;
  import java.net.*;
  import java.io.*;
  /**
  * socket的Util辅助类
  * @author lake
  *
  */
  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) {
  }
  }
  }

本文转自
http://jatula.javaeye.com/blog/172815
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值