DatagramChannel在connect后如何正确的用read和write方法来收发消息
想试试DatagramChannel的write和read方法是否可以收发信息。
public class DatagramChannelExer3 {
public static void main(String[] args) throws InterruptedException{
Thread server = new Thread(new Server3());
server.start();
Thread.sleep(1000);
Thread client = new Thread(new Client3());
client.start();
}
}
class Server3 implements Runnable{
@Override
public void run() {
try {
DatagramChannel dc = DatagramChannel.open();
SocketAddress sc = new InetSocketAddress("localhost", 9988);
//不采取bind的方式,而是改为connect的方式
dc.connect(sc);
//创建缓冲区
ByteBuffer buffer = ByteBuffer.allocate(1024);
System.out.println(dc.isConnected());
while(true){
int length = dc.read(buffer);
System.out.println(length);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Client3 implements Runnable{
@Override
public void run() {
try {
DatagramChannel dc = DatagramChannel.open();
SocketAddress connectAddress = new InetSocketAddress("localhost", 9988);
ByteBuffer buffer = ByteBuffer.allocate(1024);
dc.connect(connectAddress);
buffer.put("hello world".getBytes());
buffer.flip();
dc.write(buffer);
//关闭通道
dc.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
但是程序一直在read的方法出被阻塞,获取不到任何消息,想问如果利用read和write方法来收发消息的话,正确的写法应该是怎样的。
求各位大神帮助,谢谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我倒是很少用这个类,但是我就想知道server为什么是用connect而不是用bind?除去读写的部分你没发现你server和client的代码都一样的么?
刚刚看书,好奇书上的代码怎么用了connect,没有bind本地端口。connect的参数是远端socke地址,不是这个channel的本地socket地址,我猜调用conncet自动分配的匿名的本地地址。