Socket通道可以通过调用其静态 open()方法来创建,然后调用 connect()方法进行链接,如果连接失败,则引发NotYetConnectedException异常。可以通过调用其 isConnected 方法来判断是否已连接。
Socket通道可以通过 finishConnect()方法来完成。可以通过调用isConnectionPending方法来确定是否正在进行连接操作。
重要函数
bind(SocketAddress local) - 此方法用于将Socket通道绑定本地地址。
connect(SocketAddress remote) - 此方法用于将Socket连接到远程地址。
finishConnect() - 此方法用于完成Socket通道的连接过程。
getRemoteAddress() - 此方法返回通道Socket连接到的远程位置的地址。
isConnected() - 此方法返回Socket通道的连接状态,即是否已连接。
open()和open(SocketAddress remote) - 使用open方法打开Socket通道。
read(ByteBuffer dst) - 此方法用于通过Socket通道从给指定的缓冲区中读取数据。
isConnectionPending() - 此方法用于判断此通道上是否正在进行连接操作。
SocketChannel示例
以下示例显示了如何从Java NIO SocketChannel发送数据。
C:/Test/temp.txt
Hello World!
客户端代码
SocketChannelClient.java
import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; import java.util.EnumSet;public class SocketChannelClient { public static void main(String[] args) throws IOException { ServerSocketChannel serverSocket = null; SocketChannel client = null; serverSocket = ServerSocketChannel.open(); serverSocket.socket().bind(new InetSocketAddress(9000)); client = serverSocket.accept(); System.out.println("Connection Set: " + client.getRemoteAddress()); Path path = Paths.get("C:/Test/temp1.txt"); FileChannel fileChannel = FileChannel.open(path, EnumSet.of(StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE) );
ByteBuffer buffer = ByteBuffer.allocate(1024); while(client.read(buffer) > 0) { buffer.flip(); fileChannel.write(buffer); buffer.clear(); } fileChannel.close(); System.out.println("File Received"); client.close(); } }
在服务器启动之前,运行客户端将不会打印任何内容。
服务器代码
SocketChannelServer.java
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.SocketChannel;
import java.nio.file.Path;
import java.nio.file.Paths;
public class SocketChannelServer {
public static void main(String[] args) throws IOException {
SocketChannel server = SocketChannel.open();
SocketAddress socketAddr = new InetSocketAddress("localhost", 9000);
server.connect(socketAddr);
</span><span class="typ">Path</span><span class="pln"> path </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Paths</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">"C:/Test/temp.txt"</span><span class="pun">);</span><span class="pln">
</span><span class="typ">FileChannel</span><span class="pln"> fileChannel </span><span class="pun">=</span><span class="pln"> </span><span class="typ">FileChannel</span><span class="pun">.</span><span class="pln">open</span><span class="pun">(</span><span class="pln">path</span><span class="pun">);</span><span class="pln">
</span><span class="typ">ByteBuffer</span><span class="pln"> buffer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">ByteBuffer</span><span class="pun">.</span><span class="pln">allocate</span><span class="pun">(</span><span class="lit">1024</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">while</span><span class="pun">(</span><span class="pln">fileChannel</span><span class="pun">.</span><span class="pln">read</span><span class="pun">(</span><span class="pln">buffer</span><span class="pun">)</span><span class="pln"> </span><span class="pun">></span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
buffer</span><span class="pun">.</span><span class="pln">flip</span><span class="pun">();</span><span class="pln">
server</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="pln">buffer</span><span class="pun">);</span><span class="pln">
buffer</span><span class="pun">.</span><span class="pln">clear</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
fileChannel</span><span class="pun">.</span><span class="pln">close</span><span class="pun">();</span><span class="pln">
</span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"File Sent"</span><span class="pun">);</span><span class="pln">
server</span><span class="pun">.</span><span class="pln">close</span><span class="pun">();</span><span class="pln">
}
}
运行服务器将打印以下内容。
Connection Set: /127.0.0.1:49558 File Received