有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

所以我有两个问题:

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

  2. 如果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;
        }
    }
}

共 (0) 个答案