2014-09-22 142 views
0

嗯,我工作確定與Netty 3,但我想與Netty 4一起工作,我轉換了代碼並得到了下面的所有內容,我不知道它的服務器問題和客戶端問題在代碼中,因爲它不告訴我,甚至沒有發現錯誤的來源,我也嘗試向服務器發送任何數據,但它仍然做到了,我無法與客戶端進行交互,但是從測試中它使應用程序佔用更多夯得很慢,我只發送符合長連40個字符的字符串Netty 4.0客戶端/服務器凍結連接

MecaCoreConnector(客戶端):

import io.netty.bootstrap.Bootstrap; 
import io.netty.channel.ChannelFuture; 
import io.netty.channel.ChannelHandlerContext; 
import io.netty.channel.ChannelInboundHandlerAdapter; 
import io.netty.channel.ChannelInitializer; 
import io.netty.channel.ChannelOption; 
import io.netty.channel.EventLoopGroup; 
import io.netty.channel.nio.NioEventLoopGroup; 
import io.netty.channel.socket.SocketChannel; 
import io.netty.channel.socket.nio.NioSocketChannel; 
import io.netty.handler.codec.DelimiterBasedFrameDecoder; 
import io.netty.handler.codec.Delimiters; 
import io.netty.handler.codec.LengthFieldBasedFrameDecoder; 
import io.netty.handler.codec.string.StringDecoder; 
import io.netty.handler.codec.string.StringEncoder; 
import main.java.net.meca.thecheatgamer1.CryptionUtils; 
import main.java.net.mecalib.logger.Logger; 

public class MecaCoreConnector { 

    private static CryptionUtils cryption = new CryptionUtils(); 

    protected static UserAuthenticationData userdata; 

    private ChannelFuture ch; 

    private final static String host = "secret"; 
    private final static int port = secret; 

    private static MecaCoreConnector MecaConnection; 

    public MecaCoreConnector() { 
     MecaConnection = this; 
    } 

    public void init() throws InterruptedException { 
     EventLoopGroup workerGroup = new NioEventLoopGroup(); 
     try { 
      Bootstrap bootstrap = new Bootstrap(); 

      bootstrap.group(workerGroup); 
      bootstrap.channel(NioSocketChannel.class); 
      bootstrap.option(ChannelOption.SO_KEEPALIVE, true); 

      bootstrap.handler(new ChannelInitializer<SocketChannel>() { 
       @Override 
       public void initChannel(SocketChannel channel) throws Exception { 
        channel.pipeline().addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter())); 
        channel.pipeline().addLast("decoder", new StringDecoder()); 
        channel.pipeline().addLast("encoder", new StringEncoder()); 
        channel.pipeline().addLast("handler", new MecaCoreConnectorAdapter()); 
       } 
      }); 
      ch = bootstrap.connect(host, port).sync(); 
      ch.channel().closeFuture().sync(); 
     } finally { 
      workerGroup.shutdownGracefully(); 
     } 
    } 

    public void login(String username, String password) throws Exception { 
     ch.channel().write("Username:" + username + " Password:" + cryption.getEncrpytedString(password) + "\r\n"); 
     ch.channel().flush(); 
    } 

    public void fetchAdvertisments() { 
     //channel.write("request: advertisments"); 
    } 

    public static MecaCoreConnector getMecaConnection() { 
     return MecaConnection; 
    } 

    public static UserAuthenticationData getUserData() { 
     return userdata; 
    } 
} 

MecaCoreConnectionAdapter(客戶端):

import io.netty.channel.ChannelHandlerContext; 
import io.netty.channel.ChannelInboundHandlerAdapter; 

import java.awt.Image; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.UUID; 

import javax.imageio.ImageIO; 

import main.java.net.meca.launcher.gui.LoginClient; 
import main.java.net.meca.launcher.gui.panel.home.Advertisment; 
import main.java.net.mecalib.logger.Logger; 

public class MecaCoreConnectorAdapter extends ChannelInboundHandlerAdapter { 

    public static MecaCoreConnectorAdapter instance; 

    public enum Command { 
     // Creation 
     createFile, createFolder, 

     // Deletion 
     removeFile, removeFolder, 

     // Window Instructors 
     closeWindow, openWindow, sendAlert, sendMessage, 

     // User Instructors 
     createUser 
    } 

    public enum LoginDataType { 
     NumericID, UUID, GameUUID, AvatarLink, Rank 
    } 

    public enum DataType { 
     // Common Types 
     file, folder, zipExtraction, 

     // Advertisments 
     downloadAdvertisment, deleteAdvertisment 
    } 

    /* 
    * Stored Data 
    */ 

    public static Advertisment[] ads; 
    public String imageURLs; 
    public String imageLinks; 
    public String viewChances; 

    /* 
    * 
    */ 

    public MecaCoreConnectorAdapter() { 
     instance = this; 
    } 

    @Override 
    public void channelRead(ChannelHandlerContext ctx, Object e) { 
     if (String.valueOf(e).contains("createUser")) { 
      MecaCoreConnector.getMecaConnection().userdata = new UserAuthenticationData(); 
     } else if (String.valueOf(e).contains("NumericID")) { 
      MecaCoreConnector.getMecaConnection().getUserData().setNumericID(Integer.parseInt(String.valueOf(e).replace("NumericID ", ""))); 
     } else if (String.valueOf(e).contains("UUID")) { 
      MecaCoreConnector.getMecaConnection().getUserData().setUUID(UUID.randomUUID()/*UUID.fromString(String.valueOf(e.getMessage()).replace("UUID: ", ""))*/); 
     } else if (String.valueOf(e).contains("GameUUIDs")) { 
      // TODO: Make UUID parser for this 
      MecaCoreConnector.getMecaConnection().getUserData().setGameUUIDs(new ArrayList<UUID>()); 
     } else if (String.valueOf(e).contains("AvatarLink")) { 
      try { 
       MecaCoreConnector.getMecaConnection().getUserData().setUserAvatar(getImage(String.valueOf(e).replace("AvatarLink ", ""))); 
      } catch (IOException e1) { 
       Logger.logError(e1); 
      } 
     } else if (String.valueOf(e).contains("Rank")) { 
      MecaCoreConnector.getMecaConnection().getUserData().setUserRank(String.valueOf(e).replace("Rank ", "")); 
      MecaCoreConnector.getMecaConnection().getUserData().setUsername(LoginClient.getLoginClient().username.getText()); 
      LoginClient.getLoginClient().initDisplay(); 
     } else { 
      Logger.logInfo(e); 
     } 
     if (String.valueOf(e).contains("fileCreate")) { 
      createFile(); 
     } 

     /* 
     * Advertisments 
     */ 
     if (String.valueOf(e).contains("advertSize")) { 
      try { 
       sortAdvertisments(Integer.parseInt(String.valueOf(e).replace("advertSize ", ""))); 
      } catch (NumberFormatException | MalformedURLException e1) { 
       Logger.logError(e1); 
      } 
     } 
     if (String.valueOf(e).contains("adImageURLs")) { 
      imageURLs = String.valueOf(e).replace("adImageURLs ", ""); 
     } 
     if (String.valueOf(e).contains("adImageLinks")) { 
      imageLinks = String.valueOf(e).replace("adImageLinks ", ""); 
     } 
     if (String.valueOf(e).contains("adImageViewChances")) { 
      viewChances = String.valueOf(e).replace("adImageViewChances ", ""); 
     } 

     /* 
     * Games 
     */ 

     if (String.valueOf(e).contains("gameUUIDs")) { 

     } 
     if (String.valueOf(e).contains("gameNames")) { 

     } 
     if (String.valueOf(e).contains("gameImageURLs")) { 

     } 
     if (String.valueOf(e).contains("gameBackgroundImageURLs")) { 

     } 
    } 

    @Override 
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { 
     Logger.logError(cause); 
     ctx.close(); 
    } 

    public void createFile() { 

    } 

    private Image getImage(String url) throws MalformedURLException, IOException { 
     HttpURLConnection con = (HttpURLConnection)new URL(url).openConnection(); 
     con.addRequestProperty("User-Agent", "Mozilla/4.76"); 
     InputStream in = con.getInputStream(); 
     Image img = ImageIO.read(in); 
     return img; 
    } 

    private UUID[] parseUUIDs(String uuids) { 
     String consUUID = ""; 
     UUID[] uuid = new UUID[uuids.length()/36]; 
     for (int y = 0; y < uuid.length; y += 36) { 
      consUUID = uuids.substring(y, y + 36); 
      uuid[y] = UUID.fromString(consUUID); 
     } 
     return uuid; 
    } 

    private void sortAdvertisments(int size) throws MalformedURLException { 
     ads = new Advertisment[size]; 
     for (int m = 0; m < size; m++) { 
      Advertisment a = new Advertisment(); 
      a.getAd().setImageURL(new URL(getParsedArray(imageURLs)[m])); 
      a.getAd().setImageLink(new URL(getParsedArray(imageLinks)[m])); 
      a.getAd().setViewChance(Double.parseDouble(getParsedArray(viewChances)[m])); 
      ads[m] = a; 
     } 
    } 

    private Command getCommand(String message) { 
     message = message.substring(0, message.indexOf(" ")); 
     return Command.valueOf(message); 
    } 

    private LoginDataType getLoginDataType(String message) { 
     return LoginDataType.valueOf(message); 
    } 

    private DataType getDataType(String message) { 
     return DataType.valueOf(message); 
    } 

    private String[] getParsedArray(String input) { 
     return input.split(" "); 
    } 

    public static Advertisment[] getAdvertisments() { 
     return ads; 
    } 

    public static MecaCoreConnectorAdapter getConnectionAdapter() { 
     return instance; 
    } 
} 

ServerChannelHandler(服務器):

import io.netty.bootstrap.ServerBootstrap; 
import io.netty.channel.ChannelFuture; 
import io.netty.channel.ChannelInitializer; 
import io.netty.channel.ChannelOption; 
import io.netty.channel.EventLoopGroup; 
import io.netty.channel.nio.NioEventLoopGroup; 
import io.netty.channel.socket.SocketChannel; 
import io.netty.channel.socket.nio.NioServerSocketChannel; 
import io.netty.handler.codec.DelimiterBasedFrameDecoder; 
import io.netty.handler.codec.Delimiters; 
import io.netty.handler.codec.string.StringDecoder; 
import io.netty.handler.codec.string.StringEncoder; 
import net.meca.server.lib.Reference; 

public class ServerChannelHandler { 

    /** 
    * Initialize the Server Channel Handler 
    * @throws InterruptedException 
    */ 

    public static void init() throws InterruptedException { 
     EventLoopGroup bossGroup = new NioEventLoopGroup(); 
     EventLoopGroup workerGroup = new NioEventLoopGroup(); 
     try { 
      ServerBootstrap b = new ServerBootstrap(); 

      b.group(bossGroup, workerGroup); 

      b.channel(NioServerSocketChannel.class); 

      b.childHandler(new ChannelInitializer<SocketChannel>() { 
       @Override 
       public void initChannel(SocketChannel ch) throws Exception { 
        ch.pipeline().addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter())); 
        ch.pipeline().addLast("decoder", new StringDecoder()); 
        ch.pipeline().addLast("encoder", new StringEncoder()); 
        ch.pipeline().addLast("handler", new ServerChannelHandlerAdapter()); 
       } 
      }); 

      b.option(ChannelOption.SO_BACKLOG, 128); 
      b.childOption(ChannelOption.SO_KEEPALIVE, true); 

      ChannelFuture f = b.bind(Reference.port).sync(); 
      f.channel().closeFuture().sync(); 
     } finally { 
      workerGroup.shutdownGracefully(); 
      bossGroup.shutdownGracefully(); 
     } 
    } 
} 

ServerChannelHandlerAdapter(服務器):

import io.netty.buffer.ByteBuf; 
import io.netty.channel.ChannelHandlerContext; 
import io.netty.channel.ChannelInboundHandlerAdapter; 

import java.io.File; 
import java.io.IOException; 
import java.io.UnsupportedEncodingException; 
import java.util.UUID; 

import net.meca.server.lib.BufferedUtils; 
import net.meca.server.lib.Reference; 
import net.meca.server.logger.Logger; 

public class ServerChannelHandlerAdapter extends ChannelInboundHandlerAdapter { 

    @Override 
    public void channelRegistered(ChannelHandlerContext ctx) throws Exception { 
     Logger.logInfo("Connected: " + ctx.channel()); 
     ctx.channel().write("Connected to MecaCore V" + Reference.version + "\n\r"); 
     ctx.channel().flush(); 
    } 

    @Override 
    public void channelRead(ChannelHandlerContext ctx, Object e) throws Exception { 
     Logger.logInfo(e); 
     /* 
     * Responses 
     */ 
     if (String.valueOf(e).contains("Username:") && String.valueOf(e).contains("Password:")) { 
      Logger.logInfo("Searching for UserData for " + e); 
      int splitPoint = processString(String.valueOf(e).replace("Username:", "").replace("Password:", "")); 
      String parsedUser = String.valueOf(e).replace("Username:", "").replace("Password:", "").substring(0, splitPoint); 

      String parsedPass = String.valueOf(e).replace("Username:", "").replace("Password:", "").substring(splitPoint, String.valueOf(e).replace("Username:", "").replace("Password:", "").replace(" ", "").length() + 1).replace(" ", ""); 
      if (new File(MecaCore.getInstance().getProgramPath() + "UserData" + File.separator + parsedUser + File.separator + parsedPass).exists()) { 
       ctx.channel().writeAndFlush("Login Details Valid, Logging in..."); 
       username = parsedUser; 
       password = parsedPass; 
      } 
     } else { 
      ctx.channel().write("[MecaCore] Login is Invalid!\n\r"); 
      return; 
     } 

     if (username != null && password != null) { 
      try { 
       fetchUserData(username, password); 
       ctx.channel().write("\r\n" + "createUser" + "\r\n"); 
       ctx.channel().write("NumericID " + String.valueOf(numericID) + "\r\n"); 
       ctx.channel().write("UUID " + String.valueOf(uuid) + "\r\n"); 
       ctx.channel().write("GameUUIDs " + String.valueOf(gameUUIDs) + "\r\n"); 
       ctx.channel().write("AvatarLink " + String.valueOf(avatarLink) + "\r\n"); 
       ctx.channel().write("Rank " + String.valueOf(rank) + "\r\n"); 
      } catch (IOException e1) { 
       Logger.logError(e1); 
      } 
     } else { 
      Logger.logInfo("No Permission to access Server! Disconnecting..."); 
      ctx.write("No Permission to access Server! Disconnecting..."); 
      ctx.channel().disconnect(); 
      return; 
     } 
     ctx.channel().flush(); 
    } 

    private String username; 
    private String password; 

    private String numericID; 
    private UUID uuid; 
    private String gameUUIDs; 
    private String avatarLink; 
    private String rank; 

    private int processString(String replace) { 
     return replace.indexOf(" "); 
    } 

    private void fetchUserData(String username, String password) throws UnsupportedEncodingException, IOException { 
     String[] info = BufferedUtils.readFile(MecaCore.getInstance().getProgramPath() + "UserData" + File.separator + username + File.separator + password, 5); 
     numericID = info[0]; 
     uuid = UUID.fromString(info[1]); 
     gameUUIDs = info[2]; 
     avatarLink = info[3]; 
     rank = info[4]; 
    } 
} 

我也得到這個錯誤,當客戶端從服務器被關閉強行斷開強行降低應用程序

Sep 22, 2014 9:07:37 PM io.netty.channel.DefaultChannelPipeline$TailContext exceptionCaught 
WARNING: An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception. 
java.io.IOException: Connection reset by peer 
     at sun.nio.ch.FileDispatcherImpl.read0(Native Method) 
     at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39) 
     at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223) 
     at sun.nio.ch.IOUtil.read(IOUtil.java:192) 
     at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:375) 
     at io.netty.buffer.UnpooledUnsafeDirectByteBuf.setBytes(UnpooledUnsafeDirectByteBuf.java:446) 
     at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:881) 
     at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:225) 
     at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:119) 
     at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511) 
     at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468) 
     at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382) 
     at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354) 
     at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116) 
     at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137) 
     at java.lang.Thread.run(Thread.java:745) 

我根本不知道如何使它停止凍結客戶機/服務器,我需要這個問題

+0

尋求調試幫助(「**爲什麼不是這個代碼工作?**」)的問題必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現**的最短代碼** 。沒有**明確問題陳述**的問題對其他讀者沒有用處。請參見[如何創建最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 – DavidPostill 2014-09-22 19:19:38

+0

編輯刪除了問題的底部部分:/ – TheCheatgamer1 2014-09-22 19:32:21

+0

啊,我做了一個編輯,應該單獨顯示堆棧跟蹤從最後一個代碼塊;) – DavidPostill 2014-09-22 19:35:12

回答

0

你需要在某個時候調用flush()刷新通道上的數據幫助,否則會只是坐在出站隊列中。因此,對於「快速」修復,用writeAndFlush(...)替換write(...)。你可能想考慮一個更聰明的方法來避免太頻繁的想法。

+0

Iv嘗試刷新數據的多種方法,它似乎仍然做同樣如此即時通訊不知道是否是,但謝謝你建議我擺脫數據 – TheCheatgamer1 2014-09-23 18:03:00

+0

是否有任何有關Java 8 Update 11和Netty 4.0的問題? – TheCheatgamer1 2014-09-23 18:24:00

+0

我已經更新了代碼,所以有很多新東西可以幫助您解決我的問題:) – TheCheatgamer1 2014-09-23 18:31:02

0

我建議你使用Hercules分別測試你的應用程序,Hercules分別提供客戶端和服務器的功能。然後你可以放棄問題是誰,客戶端還是服務器。

希望得到這個幫助。

+0

我已經做了一個API來記錄傳入和傳出我的應用程序的每個字節,但謝謝:) – TheCheatgamer1 2014-09-23 18:04:26