سؤال

مرحبًا الأصدقاء ، قمت بإنشاء برنامج دردشة UDP يمكن للعملاء من خلاله التواصل عبر LAN.

لقد أنشأت برنامجًا جينيًا ، أي أنني أقوم بتشغيل نفس الرمز مع مختلف المنفذ. وعنوان IP عندما على LAN

مشكلتي هي أن هذا الرمز أدناه يعمل بشكل جيد على مضيف محلي ، لكن عندما أحاول توصيل جهازين لا يعمل هذا الرمز .. ليس هناك خطأ في هذا ولكن لا يزال العميلان لا يستطيعان التواصل

لقد أغلقت أيضًا جدار الحماية

رمز على النحو التالي ::

    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)
            {
            }
        }
    }
}
هل كانت مفيدة؟

المحلول

هذه مشكلة:

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));

نصائح أخرى

في الإضافة إلى إجابة Echo ، أود أن أضيف أنه يجب عليك إضافة على الأقل e.printStackTrace(); إلى كتل الصيد الخاصة بك.

تحقق أيضًا مما إذا كان كلا الجهازين قادرين على حل أسماء المضيف الأخرى عن طريق الاتصال nslookup hostname. أو فقط ping hostname من كل آلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top