Tag: sockets

如何在java中设置Socket写入时间?

我在java中处理套接字时遇到问题。 我正在运行具有多个客户端连接的TCP服务器。 出于性能原因,我使用了一个简单的线程池来处理数据包。 请参阅下面的代码 public enum LazyWorkCenter { instance; LazyWorkCenter() { lazyWorker = new NamedThreadPoolExecutor(3,3, 0L,TimeUnit.MILLISECONDS, “LazyWorker”); } private ExecutorService lazyWorker ; public void executeLazy(Runnable lazyTask) { lazyWorker.execute(lazyTask); } } public class TcpServerForClient { DataOutputStream out = null; DataInputStream in = null; public void onConnect(ServerSocket socket) throws IOException { Socket client = server.accept(); client.setSoTimeout(1000 * […]

如何指定要在SSL会话中使用的密码套件

我在端口443上创建了一个套接字,如下所示: socket = (SSLSocket) factory.createSocket(hostName, port); 然后,我想在这个插槽中看到启用的密码套件,我用过: String[] enCiphersuite=socket.getEnabledCipherSuites(); System.out.println(“Enabled ciphersuites are: “+Arrays.toString(enCiphersuite)); 然后,我想只选择一个我希望我的应用程序在与远程服务器创建握手时使用的密码套件。 我做了以下事情: String pickedCipher[] ={“TLS_RSA_WITH_AES_128_CBC_SHA”}; socket.setEnabledCipherSuites(pickedCipher); System.out.println(“ciphersuite set to: “+Arrays.toString(pickedCipher)); 然后我做了握手,并检查了会话密码套件: socket.startHandshake(); System.out.println(“Session ciphersuite is”+socket.getSession().getCipherSuite() ); 但我发现握手后打印输出语句中打印的密码名称(据我所知,这是会话中实际使用的密码)不是我之前使用setEnabledCipherSuites() 为什么我仍然没有看到我选择的密码套件是用过的密码套件? 而且,我还尝试了getEnabledCipherSuites()并在setEnabledCipherSuites之后将其打印出来,发现列表没有更改为我设置的内容。 我不确定何时打印启用的密码套件,这个密码套件列表是否依赖于Java并始终是相同的列表,还是取决于客户端或服务器? 有人可以解释一下吗? 编辑:在握手之前我只有以下几行: SSLSocketFactory factory = HttpsURLConnection.getDefaultSSLSocketFactory(); SSLSocket socket=null; try { socket = (SSLSocket) factory.createSocket(hostName, port); socket.setSoTimeout(15000); socket.startHandshake(); //handshake . .

如何在Java 1.4中设置BufferedReader和PrintWriter的超时?

如何在使用套接字连接创建的BufferedReader和PrintWriter上设置超时? 这是我现在为服务器提供的代码,直到服务器或客户端崩溃为止: while(isReceiving){ str = null; BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter pw = new PrintWriter(socket.getOutputStream(), true); while ((str = br.readLine()) != null){ System.out.println(“Processing command ” + str); pw.println(client.message(str)); } } 在这段代码的范围之外,我已经施加了1000毫秒的套接字超时,它在等待初始连接时按预期工作。 但程序阻塞(str = br.readLine())。 如果客户端挂起或崩溃,它永远不会停止阻止,除非我终止进程(即使这样也不总是有效)。 有问题的客户端代码与此非常相似,并且以类似的方式阻塞。

套接字:BufferedOutputStream还是只是OutputStream?

为了在Java中获得最快的TCP传输速度,这是更好的: 选项A: InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); 选项B: BufferedInputStream in = new BufferedInputStream(socket.getInputStream()); BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream()); 我已经读过,当将8 KiB写入OutputStream时,性能会受到影响,建议它一次性写入小块,而不是写入8 KiB。 8 KiB是BufferedOutputStream的默认缓冲区大小。 但是我还读到,当通过网络传输数据时,尽可能快地清除字节是很好的。 这意味着使用缓冲区并以小块写入会增加不必要的开销。 那么,选项A还是选项B? 哪个效果最好? 现在我猜测选项A提供了最高的传输速度,同时消耗了比选项B更多的CPU。选项B可能更好,因为它没有那么慢,但节省了大量的CPU。 – 奖金问题:触摸TCP窗口大小是个好主意吗? 例如,将其设置为64 KiB: socket.setReceiveBufferSize(65536); socket.setSendBufferSize(65536); 我尝试在测试机器上将其设置为128 KiB,因为我读到它可以提高速度但是当服务器有几个连接时,CPU是100%而不是2%,就像我单独离开时一样。 我猜128 KiB太高了,除非你有一台能够处理流量急流的好服务器,但将它设置为32 KiB是否明智? 我认为我的默认值是8 KiB。 (“socket”是“java.net.Socket”)

套接字程序发送和接收用户定义的对象不起作用

我有一个用户定义的类Message,我想在客户端和服务器之间传递它的对象。 Message类如下: import java.io.Serializable; public class Message implements Serializable { String CorS; int data_id; int status_id; Integer value; boolean withdraw; public Message() { CorS = null; data_id = 0; status_id = 0; value = 0; withdraw = false; } public Message(String CorS, int data_id, int status_id, Integer value) { this.CorS = CorS; this.data_id = data_id; […]

在同一端口上侦听TCP和UDP请求

我正在编写一组Client / Server程序 根据客户端请求的操作,我使用make TCP或UDP请求。 实现客户端是直截了当的,因为我可以轻松地打开与任何协议的连接并将请求发送到服务器端。 另一方面,在服务器端,我想在同一端口上同时监听UDP和TCP连接。 而且,我喜欢服务器为每个连接请求打开新线程。 我采用了以下解释的方法: 链接文本 我通过为每个TCP / UDP请求创建新线程来扩展此代码示例。 如果我只使用TCP,这可以正常工作,但是当我尝试进行UDP绑定时它会失败。 请给我任何建议如何纠正这个问题。 TNX 这是服务器代码: public class Server { public static void main(String args[]) { try { int port = 4444; if (args.length > 0) port = Integer.parseInt(args[0]); SocketAddress localport = new InetSocketAddress(port); // Create and bind a tcp channel to listen for […]

连接到VPN而不安装客户端软件

我有时必须编写软件来与驻留在Cisco VPN中的特定服务器建立套接字。 我只是编写我的软件,好像没有VPN(使用标准套接字库)。 在运行此程序时,我使用计算机上安装的客户端软件手动连接到VPN,然后运行程序本身。 但是,希望编写软件以利用能够直接通过VPN进行通信的专用套接字库,而无需使用任何已安装的客户端软件。 这是一些Java代码,说明了我想要的function: String vpnHost = …; String vpnUser = …; String vpnPassword = …; VPNConnection vpnConnection = new CiscoVPNConnection(vpnHost, vpnUser, vpnPassword); String serverHost = …; int serverPort = …; Socket socket = vpnConnection.openSocket(serverHost, serverPort); 是否可以在不安装任何客户端软件的情况下建立与VPN的连接?

如何通过TCP连接发送字节数组(java编程)

有人可以演示如何通过TCP连接从发送器程序向Java中的接收器程序发送字节数组。 byte[] myByteArray (我是Java编程的新手,似乎无法找到如何执行此操作的示例,显示连接的两端(发送方和接收方)。如果您知道现有示例,也许您可​​以发布链接(不需要重新发明轮子。)PS这不是功课!:-)

Java,Netty,TCP和UDP连接集成:没有可用于UDP连接的缓冲区空间

我有使用TCP和UDP协议的应用程序。 主要假设是客户端通过TCP协议连接到服务器,并且在建立连接时,正在发送UDP数据报。 我必须支持两种连接服务器的方案: – 客户端在服务器运行时连接 – 客户端在服务器关闭时连接并重试连接直到服务器再次启动 对于第一个场景,一切都很好:我连接两个工作。 问题出在第二种情况。 当客户端尝试几次通过TCP连接并最终连接时,UDP连接函数会抛出exception: java.net.SocketException: No buffer space available (maximum connections reached?): bind at sun.nio.ch.Net.bind0(Native Method) at sun.nio.ch.Net.bind(Net.java:344) at sun.nio.ch.DatagramChannelImpl.bind(DatagramChannelImpl.java:684) at sun.nio.ch.DatagramSocketAdaptor.bind(DatagramSocketAdaptor.java:91) at io.netty.channel.socket.nio.NioDatagramChannel.doBind(NioDatagramChannel.java:192) at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:484) at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1080) at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:430) at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:415) at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:903) at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:197) at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:350) at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:380) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:357) 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:722) 当我重新启动客户端应用程序而不对服务器做任何事情时,客户端将连接任何问题 […]

使用SSLSocket的SOCKS5代理

我有一个客户端/服务器应用程序,通过Java的SSLSocket远程连接到服务器。 我正在尝试实现一个可选模式,通过经过身份validation的SOCKS v5代理启用连接。 我尝试使用相关的教程,但没有具体提及有关SSL的任何内容。 我已经尝试设置系统范围的属性(“socksProxyHost”和“socksProxyPort”)但它似乎没有做任何事情。 我的下一个方法是在SSLSocketFactory中使用工厂方法: String proxyHost = Config.prefs.get(“PROXY_NAME”, “localhost”); int proxyPort = Config.prefs.getInt(“PROXY_PORT”, 1080); InetSocketAddress proxyAddr = new InetSocketAddress(proxyHost, proxyPort); Socket underlying = new SSLSocket(new Proxy(Proxy.Type.SOCKS, proxyAddr)); underlying.connect(new InetSocketAddress(getHost(), getPort())); socket = (SSLSocket) factory.createSocket( underlying, getHost(), getPort(), true); 但是这种方法的问题是createSocket方法要求底层套接字已经连接,我的服务器不接受非SSL连接。 使用SOCKS连接到远程服务器的最佳方法是什么? 此外,我接下来不知道如何在此系统中为经过身份validation的SOCKS提供用户名/密码。 谢谢!