A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘菲 中级黑马   /  2012-11-14 23:06  /  1498 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘菲 于 2012-11-16 08:59 编辑

今天学习了网络编程中聊天的程序,可是却不知道如何才能在dos中让两台机器互相通信,
是两台机器都必须要联网吗,不明白,不会做,麻烦大家帮帮忙!
下面的这个程序只能实现本机的发送和接收。
import java.net.*;
import java.io.*;

class  Send implements Runnable
{
        
                private DatagramSocket ds;
                public Send(DatagramSocket ds)
            {
                        this.ds=ds;
                }
                public void run()
            {
                        try
                        {
                                        BufferedReader bufr=
                                        new BufferedReader(new InputStreamReader(System.in));
                                        String line=null;

                                while ((line=bufr.readLine())!=null)
                                {
                                        if("886".equals(line))
                                                break;
                                        byte[] buf=line.getBytes();
                                        DatagramPacket dp=
                                                new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.255"),10006);
                                        ds.send(dp);
                                }
                                ds.close();
                        }
                        catch(Exception e)
                        {}


               
                }
}



class Rece implements Runnable
{
        private DatagramSocket ds;
        public Rece(DatagramSocket ds)
        {
                this.ds=ds;
        }
        public void run()
        {
                try
                {
                        while(true)
                        {
                                byte[] buf=new byte[1024];
                                DatagramPacket dp=new DatagramPacket(buf,buf.length);
                                ds.receive(dp);
                                String  ip=dp.getAddress().getHostAddress();
                                String data=new String(dp.getData(),0,dp.getLength());
                                System.out.println(ip+"....."+data);
                        }
                }
                catch (Exception e)
                {
                }
        }
               

}


class ChartDemo
{
        public static void main(String[] args)throws Exception
        {
                DatagramSocket sendso=new DatagramSocket();
                DatagramSocket receso=new DatagramSocket(10006);
                new Thread(new Send(sendso)).start();
                new Thread(new Rece(receso)).start();

        
        
        }
}

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
根据楼主所写,用的是udp协议的传输方式,因为他不需要面向连接,所以他不需要分客户端和服务端。我们的DatagramSocket 既可以作为客户端发送消息,也可以作为服务端接收消息,就看你从那边看。发送消息的时候就是客户端,你接收消息时就是服务端,但如果你有返回反馈信息,你又成客户端了。
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.255"),10006);当我们在new一个DatagramPacket 实例的时候,就同时指定了我们要访问的机器以及它所监听的某一个端口。所以你要跟外部进行通信的话,只需改变这个我们指定的ip地址即可。当然如果是跟外部机器进行通信就必须联网,然后写对方机器的外网ip地址。但如果是局部网内部通信,可以不用联网,但你们必须在同一个网段里,在这个网段的区域有两个比较特殊的ip,一个是0,一个是255。比如192.168.1.0可能被系统的某些程序占用了,而192.168.1.255实现的是群发的功能,只要你在这个网段,就都可以收到。所以局域网要通信只需指定其内网ip即可。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
阳永衡 发表于 2012-11-15 09:29
根据楼主所写,用的是udp协议的传输方式,因为他不需要面向连接,所以他不需要分客户端和服务端。我们的Dat ...

你好,谢谢你的回答。
但是我还有点不明白,我机器的ip地址是192.168.1.104,另一台机器的ip地址是192.168.1.100,这是属于局域网内部通信吗,我是不是只要把这个程序放在这两台机器上,修改一下ip地址和端口,然后同时运行就能互相通信了?但是我做过试验了,并没法通信。我不知道应该怎样才能进行通信,麻烦帮忙分析一下,最好能给出代码,十分感谢!
回复 使用道具 举报
舒远 黑马帝 2012-11-15 12:52:39
板凳
你需要将接收端和发送端分别放在两个机器上,单独跑起来。你的ChartDemo类需要改写。你现在的ChartDemo类是在一台机器上跑了两个类(接收端和发送端)
回复 使用道具 举报
首先这是局域网内部通信,只要在发送消息的时候,实例DatagramPacket 的对象的时候,制定了对方接收机器的ip和他所监听的端口就可以进行通信。重点要注意的就是对方接收的机器所监听的端口,要跟我们指定的端口一样。如果配置没有问题的话,可以考虑你的局域网是否是通的,否则没有别的问题了。其实还是可以在一台机器上做实验,一个写局域网ip或者localhost,另一个写外网ip。虽然实在同一台机器上,打他们走的路线不同,一个往外网发,只是外网的这台机器就是我这个本机。同理往局域网发也是如此。
回复 使用道具 举报
舒远 发表于 2012-11-15 12:52
你需要将接收端和发送端分别放在两个机器上,单独跑起来。你的ChartDemo类需要改写。你现在的ChartDemo类是 ...

首先,谢谢你的回答,
但是我还是不明白,如果将发送端和接收端分别放在两个机器上,
那不就成了单方向的传输了吗,怎么样才能实现互相通信呢?
麻烦你再给我指点一下!谢谢!
回复 使用道具 举报
舒远 黑马帝 2012-11-15 17:22:08
7#
刘菲 发表于 2012-11-15 16:50
首先,谢谢你的回答,
但是我还是不明白,如果将发送端和接收端分别放在两个机器上,
那不就成了单方向的 ...

要实现互相通信,就不是UDP传输了。需要用到Socket和SocketServer类。这是基于TCP传输的。
你现在的程序只能发送端给接收端传送数据,送完就结束了。
所以部署到两台机器上之后,就是一台机器给另一台机器发送数据,另一台机器接受数据。
如果换成TCP方式,那么服务端和客户端就可以实现相互通信。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马