2010-02-24 101 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