2010-02-24 167 views
0

你好朋友我已经创建了一个UDP聊天程序,通过它客户端可以通过LAN进行通信。UDP聊天问题

我已经创建了一个通用程序,即我用不同的端口号运行相同的代码。和IP地址当局域网上

我的问题是,下面的代码在本地主机上工作正常,但是当我尝试连接两台机器此代码doesnt工作..有没有错误,但仍然是这两个客户端无法沟通

我也关掉firewalls.But我无法找出为什么我不能两台机器之间

沟通

的代码如下::

import java.net.*; 
import java.io.*; 
import java.awt.*; 
import java.awt.event.*; 

class ChatApplDG extends Frame implements ActionListener 
{ 

    TextField tf = new TextField(50); 
    Button btn = new Button("Send"); 
    Button exit = new Button("Exit"); 
    TextArea ta = new TextArea(50,10); 
    int fromPort, toPort; 
    String hostName; 

    DatagramSocket dgSock; 

    public static void main(String args[]) throws Exception 
    { 
     ChatApplDG ca = new ChatApplDG(); 
     ca.startClient(args[0],Integer.parseInt(args[1]),Integer.parseInt(args[2])); 
    } 

    ChatApplDG() 
    { 
     Panel p = new Panel(); 
     add(p,BorderLayout.NORTH); 
     p.add(tf); 
     p.add(btn); 
     p.add(exit); 
     add(ta,BorderLayout.CENTER); 
     btn.addActionListener(this); 
     exit.addActionListener(this); 
     setSize(500,300); 
     show(); 
     ta.setEditable(false); 
    } 

    void startClient(String hName,int fPort,int tPort) 
    { 
     try 
     { 
      hostName = hName; 
      fromPort=fPort; 
      toPort=tPort; 
      dgSock = new DatagramSocket(fromPort); 
      ta.append("Ready To Send ...\n"); 
      RunningThreadDG rt = new RunningThreadDG(dgSock,ta); 
      Thread thread = new Thread(rt); 
      thread.start(); 
     } 
     catch(Exception e) 
     { 
     } 
    } 


    public void actionPerformed(ActionEvent ae) 
    { 
     if(ae.getSource()==btn) 
     { 
      try 
      { 
       byte buff[] = new byte[500]; 
       InetAddress remoteHost = InetAddress.getByName(hostName); 
       buff=tf.getText().getBytes(); 
       dgSock.send(new DatagramPacket(buff,buff.length,remoteHost.getLocalHost(),toPort)); 
       ta.append("Send : " + tf.getText() + "\n"); 
       tf.setText(""); 
      } 
      catch(Exception e) 
      { 
      } 
     } 
     else 
     { 
      System.exit(0); 
     } 
    } 
} 


class RunningThreadDG extends Frame implements Runnable 
{ 
    DatagramSocket dgSock; 
    TextArea ta; 
    String str; 

    RunningThreadDG(DatagramSocket dgs,TextArea t) 
    { 
     dgSock=dgs; 
     ta=t; 
    } 

    public void run() 
    { 
     byte[] buff = new byte[500]; 
     while(true) 
     { 
      try 
      { 
       DatagramPacket dgPack = new DatagramPacket(buff,buff.length); 
       dgSock.receive(dgPack); 
       ta.append("Received : " + new String(dgPack.getData(),0,dgPack.getLength()) + "\n"); 
      } 
      catch(Exception e) 
      { 
      } 
     } 
    } 
} 

回答

1

这里有一个问题:

dgSock.send(new DatagramPacket(buff,buff.length,remoteHost.getLocalHost(),toPort)); 

remoteHost.getLocalHost()返回一个InetAddress为您的本地主机。尝试只是路过remoteHost而不是remoteHost.getLocalHost()

dgSock.send(new DatagramPacket(buff,buff.length,remoteHost,toPort)); 
+0

通过修改你所说的,它解决了我的一半问题。 现在发生的事情是,我只能将数据从一台PC发送到另一台PC,而不是反之亦然(即,我只能做单向通信) 我应该做些什么修改..? – veenit33 2010-02-25 17:34:00

1

在addtion呼应的回答,我想补充一点,你至少应该添加e.printStackTrace();到您的catch块。

同时检查两台机器是否可以通过调用nslookup hostname来解析对方的主机名。或从每台机器只需ping hostname

+0

当我连接两台机器..我可以ping对方ñ我得到答复too..from双方。指示有(我猜)没有问题的物理连接..所以在这个程序中有任何逻辑错误..? – veenit33 2010-02-24 14:08:32