Tag: socketchannel

管理客户端套接字池

我需要从Java应用程序管理与外部服务器的长时间运行的TCP套接字连接。 我正在寻找一个好的套接字池,所以我将能够重新使用套接字。 还有另一个解决方案而不是org.apache.commons.pool2 ?

Java NIO read()End Of Stream

我正在使用Java NIO来接受,读取和写入我的服务器。 在文档中,它说SocketChannel.read()函数将返回从套接字读取的字节数,如果它到达流的末尾则返回-1。 现在 – 我真的不明白”End Of Stream”是什么意思? 它和borken pipe错误一样吗? 这是否意味着双方都失去了连接,我应该关闭SocketChannel? 如果有人可以解释更多关于它的话,我会非常满意 – 并根据它给出一些正确使用和行为的例子。

Java NIO。 SocketChannel.read方法一直返回0.为什么?

我试着了解java NIO是如何工作的。 特别是SocketChannel如何工作。 我写下面的代码: import java.io.*; import java.net.*; import java.nio.*; import java.nio.channels.*; public class Test { public static void main(String[] args) throws IOException { SocketChannel socketChannel = SocketChannel.open(); socketChannel.configureBlocking(false); socketChannel.connect(new InetSocketAddress(“google.com”, 80)); while (!socketChannel.finishConnect()) { // wait, or do something else… } String newData = “Some String…”; ByteBuffer buf = ByteBuffer.allocate(48); buf.clear(); buf.put(newData.getBytes()); buf.flip(); while […]

当消息大小很大时,socketchannel.write()变得非常慢

在我使用java nio的程序中,socketchannel.write()在尝试连续写入10 KB消息时变得非常慢。 写入完整10 KB消息的测量时间介于160 ms和200 ms之间。 但是编写完整的5 KB消息的时间仅需0.8 ms。 在选择器中,我只有Selection.OP_READ并且不处理Selection.OP_WRITE。 当收到大的完整消息时,它会被写入另一个接收器4次。 有人遇到同样的问题吗? 有关于socketchannel.write()的post很慢。 我的问题是如何在OP_READ和OP_WRITE之间进行替换? 如果我添加一个例如150毫秒的inerval,则响应时间会减少。 有什么办法可以找到缓冲区已满的时候,我可以让程序等待。 我的操作系统是windows xp。 谢谢。 我通过检查写入的字节数来遵循EPJ的建议。 但响应时间仍然很长。 我在这里发布了部分代码,并想检查我的代码是否有问题。 //这是使用nio的writeData()部分: while (buffer.hasRemaining()) { try { buffer.flip(); n = socket.write(buffer); if(n == 0) { key.interestOps(SelectionKey.OP_WRITE); key.attach(buffer); break; } } catch (IOException e) { e.printStackTrace(); } finally { buffer.compact(); } } if(buffer.position()==0) { […]

如何将数据从TCP套接字转换为ByteBuffer

我需要将来自套接字的传入数据传入ByteBuffer,我不知道该怎么做。 我是这个领域的新手,因此不确定最好的开始方式。 我找到了以下内容,但这不是我想要的,因为它获取了数据,但我需要将所有数据都存在于bytebuffer中以用于其他目的。 ServerSocket welcomeSocket = new ServerSocket(Integer.parseInt(ibmPort)); while (true) { Socket connectionSocket = welcomeSocket.accept(); BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); clientSentence = inFromClient.readLine(); System.out.println(“Received: ” + clientSentence); setRequestDataFromCT(clientSentence); capitalizedSentence = clientSentence.toUpperCase() + ‘\n’; outToClient.writeBytes(capitalizedSentence); }

读取NIO SocketChannel的超时时间?

如果在建立连接后的一段时间内没有收到数据,那么设置超时以关闭NIO SocketChannel的最佳方法是什么?

写入通道后,Java Selector返回带有OP_READ的SelectionKey,而无需在无限循环中的数据

我的代码出了问题:我用Selector编写了简单的SocketChannel客户端,启动后成功从服务器读取消息(服务器发送事件)。 但是在写入socket(参见main方法)之后,选择器开始在infinyty循环中返回可读套接字,handleKey返回-1个字节readed,因此选择器所有时间都返回OP_READ SelectionKey而没有数据用于读取。 对不起我的英语不好。 谢谢。 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.SocketChannel; import java.util.Iterator; public class SelectorTest { public SelectorTest() throws IOException { selector = Selector.open(); } private void runSelector() { new Thread(new Runnable() { public void run() { alive = true; try { while(alive) { […]

SSL和SocketChannel

理想情况下,我只需要一个简单的SSLSocketChannel 。 我已经有一个组件可以在普通的SocketChannel上读取和写入消息,但是对于其中一些连接,我必须通过线路使用SSL; 但是,这些连接上的操作是相同的。 有谁知道免费的SSLSocketChannel实现(使用适当的选择器)或类似的东西? 我发现了这个 ,但选择器不接受它,因为它的供应商不是SUN。 我正在通过一个简单的对象将read_from / writing_to网络逻辑从网络数据的插入和检索中解耦,以便使用SSLEngine而不会生气,但考虑到我不这样做,实现它是非常棘手的。知道SSL协议的内部……

用SocketChannel.open()。socket()替换新的Socket()有什么问题吗?

如果我只是替换,会出现什么问题 socket = new Socket() 同 socket = SocketChannel.open().socket()? 背景:我有一些使用new Socket()遗留代码,我希望能够中断socket.connect()调用。 我不想重写代码来使用NIO。 我了解到Thread.interrupt()不会中断socket.connect() ,但另一个线程上的socket.close()应该中断连接。 奇怪的是,这适用于Java 7但不适用于Java 6。 我莫名其妙地使用socket = SocketChannel().open().socket()会让我使用Thread.interrupt()来中断socket.connect() 。 它没有,但奇怪的是,它确实使Java 6中的socket.close()中断socket.connect() ! 请注意,我不是以任何方式直接使用附加的SocketChannel它出现在我创建Socket再也没有。 这会出什么问题?

仅通过一个SocketChannel发送多条消息

阅读本教程后: http ://rox-xmlrpc.sourceforge.net/niotut/(它是关于编写非阻塞服务器和客户端,我读NIO部分,滑雪SSL部分),现在我正在尝试重写我自己的客户端,但在尝试编辑客户端代码时我遇到了问题。 首先,我想让你看到教程的客户端代码,它包含2个文件: RspHandler.java:http://rox-xmlrpc.sourceforge.net/niotut/src/RspHandler.java NIOClient.java:http://rox-xmlrpc.sourceforge.net/niotut/src/NioClient.java 但我在main函数中编辑了一下NIOClient.java,以解释我的问题如下: import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.SocketChannel; import java.nio.channels.spi.SelectorProvider; import java.util.*; public class NIOClient implements Runnable { // The host:port combination to connect to private InetAddress hostAddress; private int port; // The selector we’ll be monitoring private Selector selector; […]