Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我发送的每个UDP消息都会改变端口源?_Java_Android_Networking_Udp - Fatal编程技术网

Java 为什么我发送的每个UDP消息都会改变端口源?

Java 为什么我发送的每个UDP消息都会改变端口源?,java,android,networking,udp,Java,Android,Networking,Udp,我在Wireshark上跟踪从android手机发送的UDP消息,但每次发送消息时,源端口号都会发生变化 所以我有两个问题: 如果我想收到回信,这是不是很糟糕?或者是find,只是每个收到的消息都来自不同的端口 如果1)的答案是肯定的,那么它是不好的,那么我应该做些什么来改变它? 这是我的密码: 编辑:完整代码 public class MainActivity extends AppCompatActivity implements View.OnClickListener {

我在Wireshark上跟踪从android手机发送的UDP消息,但每次发送消息时,源端口号都会发生变化

所以我有两个问题:

  • 如果我想收到回信,这是不是很糟糕?或者是find,只是每个收到的消息都来自不同的端口

  • 如果1)的答案是肯定的,那么它是不好的,那么我应该做些什么来改变它? 这是我的密码:

  • 编辑:完整代码

    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
        public static final int SERVERPORT = 1111;
        public static final String SERVER_IP = "255.255.255.255";
    
        private LinearLayout msgList;
        private EditText edMessage;
        private int clientTextColor;
    
        private ClientThread clientThread;
        private Thread thread;
        private Handler handler;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            msgList = findViewById(R.id.msgList);
            edMessage = findViewById(R.id.edMessage);
            clientTextColor = ContextCompat.getColor(this, R.color.colorAccent);
            handler = new Handler();
        }
    
        
        // Just for displaying messages on device 
        public TextView textView(String message, int color) {...}
    
        public void showMessage(final String message, final int color) {
            handler.post(new Runnable() {
                @Override
                public void run() {
                    msgList.addView(textView(message, color));
                }
            });
        }
    
        // Implementation
    
        @Override
        public void onClick(View view) {
    
            if(view.getId() == R.id.clear) {
                msgList.removeAllViews();
            }
    
            if (view.getId() == R.id.send_data) {
                // Starting thread
                clientThread = new ClientThread();
                thread = new Thread(clientThread);
                thread.start();
    
                String clientMessage = edMessage.getText().toString().trim(); // Client's Message
                showMessage(clientMessage, Color.BLUE); // Just display
                if (null != clientThread) {
                    clientThread.sendMessage(clientMessage + "\r\n");
                }
            }
        }
    
        class ClientThread implements Runnable {
                byte[] buffer = new byte[1024];
    
                @Override
                public void run() {
                    try {
                        while (true) {
                            DatagramSocket ds = new DatagramSocket(SERVERPORT);
                            DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
                            ds.receive(dp);
                            String serverMsg = new String(dp.getData(), 0, dp.getLength());
    
                            showMessage("Server: " + serverMsg, clientTextColor);
                            ds.close();
                        }
                    } catch (UnknownHostException e1) {
                        e1.printStackTrace();
                    }
                }
    
            void sendMessage(final String message) { // Called by "Send Data" button
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            byte[] msg = message.getBytes();
                            InetAddress ip = InetAddress.getByName(SERVER_IP);
                            DatagramSocket socket = new DatagramSocket();
                            DatagramPacket packet = new DatagramPacket(msg, msg.length, ip, SERVERPORT);
                            socket.setBroadcast(true);
                            socket.send(packet);
                        } catch(Exception e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
            }
        }
    
        String getTime() {
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
            return sdf.format(new Date());
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            if (null != clientThread) {
                clientThread.sendMessage("Disconnect");
                clientThread = null;
            }
        }
    }
    

    UDP不适合持续通信。如果您需要跟踪发送者是谁,请使用TCP。但是您仍然可以通过UDP接收消息,对吗?你是说端口来源无关紧要吗?@qol:你能收到一封写给你的信吗?但发件人地址只是暂时的,不再存在了?是的,你可以收到这封信。您甚至可以回复,但原始发件人不会收到您的回复。这就是您在代码中的基本操作。@SteffenUllrich抱歉,我的意思是发件人无法收到邮件回复。在你的类比中,地址不是像最初的接收者拥有的IP地址吗?@qol:在你的代码中,客户端(发送者)没有尝试接收,服务器也没有尝试发送,但这取决于实际的代码。如果发送方套接字仍然存在,则它可以用于从服务器接收数据。与服务器端类似,服务器必须回复最新消息来自的地址。