在Java中快速实现端口转发

我构建了一个打开ServerSocket的简单应用程序,在连接时,它将自己连接到远程计算机上的另一个服务器套接字。 为了实现端口转发,我使用两个线程,一个从本地输入流读取并流到远程套接字输出流,反之亦然。 实现感觉有点不合理,所以我问你是否知道更好的实现策略,或者甚至有一些代码可以以高效的方式实现。 PS:我知道我可以在Linux上使用IPTables,但这必须在Windows上运行。 PPS:如果你发布这个简单任务的实现,我将创建一个基准来测试所有给定的实现。 对于许多小型(~100字节)包和稳定数据流,解决方案应该很快。 我当前的实现是这样的(在每个方向的两个线程中执行): public static void route(InputStream inputStream, OutputStream outputStream) throws IOException { byte[] buffer = new byte[65536]; while( true ) { // Read one byte to block int b = inputStream.read(); if( b == – 1 ) { log.info(“No data available anymore. Closing stream.”); inputStream.close(); outputStream.close(); return; } buffer[0] = […]

TomEE启动但Netbeans给出“启动失败”错误

我正在使用NetBeans 8.0.2(也是在最新的每晚构建中尝试过)并尝试在端口8084上启动TomEE Plume服务器(也尝试在不同的端口上)。 服务器启动并正常工作,但NetBeans认为它没有启动,等待大约2分钟后(“等待Tomcat”)抛出一个错误窗口“Tomcat无法启动”或类似的东西。 有类似于我的问题,区别在于我完全没有错误,只有“Tomcat无法启动”窗口,因此我甚至无法将日志放在此处,因为它没有任何用处。 此外,可用的解决方案对我不起作用。 我相信NetBeans和TomEE之间存在一些通信问题,我几乎可以肯定问题出现在NetBeans中,因为TomEE运行良好并且应该启动它,localhost:8084虽然NetBeans认为它无法启动,但却给了我Tomcat页面。 由于某些原因,TomEE在启动后没有向NetBeans发送确认信息的可能性很小,但我真的不知道如何检查它。 我已经研究了同样的问题,两个最常见的问题是“’127.0.0.1 *’不被认为是内部或外部命令”和我一样。 建议的解决方案是在工具选项中选择“无代理”,但它对我没有帮助。 另外,为了确定,我编辑了catalina.bat文件并检查了我的用户权限,即roles=”admin-gui,manager-gui,admin,manager-script” 。 我希望有人遇到同样的问题。 另外,我想知道这个问题是否可以解决。 谢谢。

将JLabel置于JPanel中心

我有一个来自JPanel的面板。 我有一个从JLabel派生的自定义控件。 我试图将这个自定义JLabel放在我的面板上。 我知道这样做的唯一方法是使用空布局( setLayout(null) ),然后计算自定义JLabel的setLocation()点,使其位于正确的位置。 在这个应用程序中,自定义JLabel从一个面板物理移动到此面板,我相信先前在setLocation设置的位置正在影响事物。 但是,当我将其设置为(0,0)时,组件会进入左上角。 BorderLayout不起作用,因为当只提供1个组件并将其放入BorderLayout.CENTER ,中心部分会扩展以填充所有空间。 我使用BoxLayout和component.setAlignmentX(Component.CENTER_ALIGNMENT)从另一个站点剪切和粘贴的示例。 这也不起作用。 另一个答案提到覆盖面板的getInset()函数(我认为这就是所谓的),但事实certificate这是一个死胡同。 到目前为止,我正在使用一个带有GridBagLayout布局的面板,当我将自定义JLabel插入我的面板时,我包含一个GridBagConstraints对象。 但这是低效的。 有没有更好的方法将JLabel置于我的JPanel中心?

在java中使用“this”关键字

当ai遇到this关键字时,我正在研究Java中的方法覆盖。 在互联网和其他来源上搜索了很多这个之后,我得出结论,当实例变量的名称与构造函数参数相同时,使用this关键字。 我是对还是错?

JDZ6中的TimeZone.setDefault更改

我只是注意到JDK 6设置默认TimeZone的方法与JDK5不同。 以前,新的默认值将存储在线程局部变量中。 使用JDK6(我刚刚查看了1.6.0.18),实现已经改变,因此如果用户可以写入“user.timezone”属性,或者如果没有安装SecurityManager,则时区会在整个VM范围内发生变化! 否则会发生线程局部更改。 我错了吗? 这似乎是一个相当大的变化,我在网上找不到任何关于它的东西。 这是JDK6代码: private static boolean hasPermission() { boolean hasPermission = true; SecurityManager sm = System.getSecurityManager(); if (sm != null) { try { sm.checkPermission(new PropertyPermission(“user.timezone”, “write”)); } catch (SecurityException e) { hasPermission = false; } } return hasPermission; } /** * Sets the TimeZone that is * returned by the […]

没有定义名为’transactionManager’的bean

我已经配置了两个持久性单元,实体管理器设置如下: 然后我将事务管理器配置为 我最初只配置了一个,它被称为“transactionManager”。 Addint一个额外的持久单元似乎会产生错误。 有一点我不明白,如果我配置了两个持久单元(每个单独的数据库),我是否还需要为每个数据源配置一个单独的实体管理器和一个事务管理器? 我得到的错误如下所示:(我搜索了所有文件,我找不到任何有“transactionManager”参考的地方) org.springframework.ws.soap.client.SoapFaultClientException: No bean named ‘transactionManager’ is defined at org.springframework.ws.soap.client.core.SoapFaultMessageResolver.resolveFault(SoapFaultMessageResolver.java:37) at org.springframework.ws.client.core.WebServiceTemplate.handleFault(WebServiceTemplate.java:774) at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:600) at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:537) at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:384) at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:378) at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:370) at com.ws.client.SoapTest.testFail(SoapTest.java:140) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83) at […]

关于不可变集和映射的JDK9随机化

阅读这个问题和Eugene给出的答案 ,我发现JDK9不可变集和映射将引入一个会影响其遍历的随机源。 这意味着迭代顺序确实是随机的,至少在JVM的不同运行中。 由于规范不保证集合和映射的任何遍历/迭代顺序,这绝对没问题。 实际上,代码绝不能依赖于特定于实现的细节,而是依赖于规范。 我知道今天,使用JDK 8,如果我有一个HashSet并执行此操作(取自链接的答案): Set wordSet = new HashSet(Arrays.asList(“just”, “a”, “test”)); System.out.println(wordSet); for (int i = 0; i < 100; i++) { wordSet.add("" + i); } for (int i = 0; i < 100; i++) { wordSet.remove("" + i); } System.out.println(wordSet); 然后元素的迭代顺序将改变,两个输出将不同。 这是因为向集合中添加和删除100个元素会更改HashSet的内部容量并重新生成元素。 这是完全有效的行为。 我这里不是在问这个问题。 但是,使用JDK9,如果我这样做: Set set = Set.of(“just”, “a”, “test”); […]

单个文件中的多个类

我在将多个类放入单个文件时遇到问题。 例如,当我的文件看起来像: public class FirstClass() {} public class SecondClass() {} public class ThirdClass() {} 我在编译期间遇到错误。 我不太确定是什么导致了这一点。 有任何想法吗?

从代数表达式创建二叉树

我必须用Java创建一个算术求值器。 为此,我必须解析二叉树中的代数表达式,然后计算并返回结果。 因此,对于第一步,我如何解析二叉树中的表达式? 我知道这个理论,但我的问题是如何用Java做到这一点。 我阅读了以下post创建递归二叉树 但我错过了基本的技巧或方法。 我知道如何创建一个节点(我有一个类,其中包含returnNodeValue,isLeaf,isDoubleNode,isSingleNode等方法),但我想我需要一个方法在二叉树中插入一个节点来实现我想要的东西。 有任何想法吗?

java中基元类型的转换规则

在java中, 有整数类型( char / short / int / long / byte ) 有浮动类型( float / double ) 与C语言不同,有布尔类型( boolean ),而不是整数类型。 问题1) 是否有一个通用规则用于转换(根据JLS)会话,哪种类型可以转换为另一种类型? 出于常识,我知道,不允许使用整数和浮动类型转换为boolean 问题2) 请帮我理解下面输出的原因: /* * Casting rules for primitive types */ double aDoubleValue = 30000000000000000000.123438934; int doubleToInt = (int)aDoubleValue; //stores max value 2147483647, makes sense!! byte doubleToByte = (byte)aDoubleValue; //stores -1, why not […]