无题2
分类:
IT文章
•
2022-08-31 09:11:07
package nio;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
public class SocketChannelDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
SocketChannel socketChannel = SocketChannel.open();
socketChannel.connect(new InetSocketAddress("127.0.0.1", 9999));
ByteBuffer bb = ByteBuffer.allocate(48);
int byteNum;
int bytes = socketChannel.read(bb);
bb.flip();
while (bb.hasRemaining()) {
System.out.print((char) bb.get());
}
bb.clear();
socketChannel.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
View Code
package nio;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
public class ServerSocketChannelDemo {
public static void main(String[] args) {
try {
ServerSocketChannel ssc = ServerSocketChannel.open();
ssc.socket().bind(new InetSocketAddress(9999));
String msg = "send something to you";
ByteBuffer bb = ByteBuffer.allocate(48);
bb.clear();
bb.put(msg.getBytes());
bb.flip();
while (true) {
SocketChannel socketChannel = ssc.accept();
while (bb.hasRemaining()) {
socketChannel.write(bb);
}
socketChannel.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
View Code
我一直在想为什么socket客户端只能读一次或得返回信息,原来是我server端写错了,应该把设置byteBuffer内容的这段代码写在 while循环里
如下:
while (true) {
SocketChannel socketChannel = ssc.accept();
String msg = "send something to you";
ByteBuffer bb = ByteBuffer.allocate(48);
bb.clear();
bb.put(msg.getBytes());
bb.flip();
while (bb.hasRemaining()) {
socketChannel.write(bb);
}
// socketChannel.close();
}
sc.connect(new InetSocketAddress("127.0.01",9999)); //可耻的错误