import java.io.*;
import java.net.*;class sender implements Runnable
{
private DatagramSocket ds;

public sender(DatagramSocket ds)
{
this.ds = ds;
}

public void run(){
BufferedReader bfr = null;
BufferedWriter bfw = null;
String str;

try 
{
bfr = new BufferedReader(new InputStreamReader(System.in));
bfw = new BufferedWriter(new OutputStreamWriter(System.out));
byte[] buf = new byte[1024];
while ((str = bfr.readLine()).compareTo("886") != 0)
{

buf = str.getBytes();

DatagramPacket dp = new DatagramPacket(buf, 0, buf.length, 
InetAddress.getByName("192.168.1.255"), 10001);
ds.send(dp); }
} catch (Exception e) 
{ throw new RuntimeException("出错");
}
finally
{
try
{
if (bfr != null)
bfr.close();
if (bfw != null)
bfw.close();
}
catch(IOException e)
{
throw new RuntimeException("出错");
}
}
}

}class receiver implements Runnable
{
DatagramSocket rece;

public receiver(DatagramSocket rece)
{
this.rece = rece;
}


public void run()
{
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
while(true)
{
try 
{
rece.receive(dp);
String ip = dp.getAddress().getHostAddress();

System.out.println("ip:" + ip + "::" + new String(dp.getData(), 0, dp.getLength()));

catch (IOException e) 
{
throw new RuntimeException("出错");
}
}
}
}public class chat 
{
public static void main(String[] args) 
{

try 
{
DatagramSocket tosend = new DatagramSocket();
DatagramSocket torece = new DatagramSocket(10001);

new Thread(new sender(tosend)).start();
new Thread(new receiver(torece)).start();

catch (SocketException e) 
{
throw new RuntimeException("出错");
} }}
我在虚拟机(Windows 2003)还有自己的主机(Windows 7)上面同时运行这个java程序(达到聊天的目的),然后出了很奇怪的问题。
在虚拟机端能够显示 虚拟机还有主机发送的数据, 但是在主机端上面的只能显示 虚拟机发的数据。
搞了好久搞不明白。
虚拟机的IP我设成192.168.1.133, 我自己的主机的IP是192.168.1.150。
可以互ping.

解决方案 »

  1.   

    上面这个程序其实实现的不是主机跟虚拟机进行通信的程序,因为你的程序一运行,就运行了两个线程,一个接受线程,一个发送线程,看到你程序里面设置了一个接受的IP地址"InetAddress.getByName("192.168.1.255")" 说明不管你使用主机,还是使用虚拟机都是给这个IP地址192.168.1.255:10001发送数据。如果你把程序里面IP地址改为192.168.1.133:10001 有两个情况
    1 你在虚拟机上运行,是虚拟机(Sender)跟虚拟机通信
    2 你在主机上运行,是主机(Sender 端)跟虚拟机通信.你启动了4个线程,所以你总是有一个自己跟自己通信的应用程序。不知道你明白不,如果不明白,你把IP地址改为192.168.1.150:10001 试试就知道了 
      

  2.   

    你要实现qq那样的效果其实很好实现,
    你创建两个客户端, 然后客户端和客户端进行通信,注意接受和发送是在两个线程里面,而不是在两个socket里面。这里我觉得应该使用一个DatagramSocket ,因为你这个整个是一个客户端。
     try 
            {
                DatagramSocket tosend = new DatagramSocket();
                DatagramSocket torece = new DatagramSocket(10001);
                
                new Thread(new sender(tosend)).start();
                new Thread(new receiver(torece)).start();
            } 
      

  3.   

    你还是没搞清楚UDP中所说的广播的意思,不是说你广播到196.168.1.255 然后他的所有地址段都能收到,广播是说你发送出去,不管你发送成功是否,不需要对方进行确认和重新发送。但是你发送给谁,这个ip地址必须明确。要不然计算机不知道发给谁。
      

  4.   


    但是192.168.1.255是广播地址吧,你说“发送出去,不管发送成功是否,不需要对方进行确认和重新发送”这是UDP的发送方式,UDP发送到哪个地址都是这样的,但是我说的是广播地址,广播地址应该有起到广播的作用吧?
      

  5.   

    我觉得你要是实现广播,就把ip地址去掉,直接给出端口就能实现广播。
    DatagramSocket s = new DatagramSocket(8888);