DatagramChannel在connect后如何正确的用read和write方法来收发消息

发布于 2022-09-06 04:09:35 字数 1805 浏览 11 评论 0

想试试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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

很酷又爱笑 2022-09-13 04:09:35

我倒是很少用这个类,但是我就想知道server为什么是用connect而不是用bind?除去读写的部分你没发现你server和client的代码都一样的么?

清风疏影 2022-09-13 04:09:35

刚刚看书,好奇书上的代码怎么用了connect,没有bind本地端口。connect的参数是远端socke地址,不是这个channel的本地socket地址,我猜调用conncet自动分配的匿名的本地地址。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文