package com.brandon3055.townbuilder.schematics; import com.brandon3055.townbuilder.utills.LogHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.util.text.TextComponentString; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import java.io.*; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketAddress; /** * Created by Brandon on 25/02/2015. */ @SideOnly(Side.CLIENT) public class FileSender { public static final FileSender instance = new FileSender(); private SenderThread thread; private String file = null; private int port; private NetHandlerPlayClient handlerPlayClient; public FileSender() { } public void sendFile(String file, int port, NetHandlerPlayClient handlerPlayClient) { if (this.thread != null && this.thread.getRunning()) { Minecraft.getMinecraft().thePlayer.addChatComponentMessage(new TextComponentString(TextFormatting.RED + "File transfer already in progress")); return; } this.handlerPlayClient = handlerPlayClient; this.thread = new SenderThread(this); this.file = file; this.thread.setRunning(true); this.thread.start(); this.port = port; } public class SenderThread extends Thread { private FileSender sender; private boolean running = false; public SenderThread(FileSender sender) { super("TT File Sender Thread"); this.sender = sender; } @Override public void run() { if (sender.file == null) return; FileInputStream fis = null; BufferedInputStream bis = null; OutputStream os = null; ServerSocket servsock = null; Socket sock = null; LogHelper.info("Waiting for connection... [" + port + "]"); try { //servsock = new ServerSocket(Minecraft.getMinecraft().getProxy()); servsock = new ServerSocket(); LogHelper.info("socket created " + sender.handlerPlayClient.getNetworkManager().channel().remoteAddress().toString()); SocketAddress addr = new InetSocketAddress(sender.handlerPlayClient.getNetworkManager().channel().remoteAddress().toString(), sender.port); servsock.bind(addr); sock = servsock.accept(); LogHelper.info("Accepted connection : " + sock); File myFile = SchematicHandler.getFile(sender.file); byte [] mybytearray = new byte [(int)myFile.length()]; fis = new FileInputStream(myFile); bis = new BufferedInputStream(fis); os = sock.getOutputStream(); LogHelper.info("Sending " + myFile.getName() + "(" + mybytearray.length + " bytes)"); int count; while ((count = bis.read(mybytearray)) > 0) { os.write(mybytearray, 0, count); } os.flush(); LogHelper.info("Done."); running = false; sender.file = null; } catch (IOException e) { running = false; sender.file = null; e.printStackTrace(); } } public boolean getRunning() { return running; } public void setRunning(boolean b) { this.running = b; } } }