有 Java 编程相关的问题?

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

java为什么我的服务器和客户端在服务器活动开始时断开连接?

这里的想法是通过本地网络建立socket连接,发送一些数据,然后立即关闭连接。唯一应该保持运行的是serversocket。到目前为止,除了一件事外,一切都按预期进行:

当启动serversocket的活动用“后退”按钮关闭,然后重新打开时,从客户端发送的数据不再发送到serversocket

DMActivity:

public class DMActivity extends AppCompatActivity {

    String ipAddress;
    boolean dmListenRunning = false;
    DMListen dmListen = new DMListen();
    Thread dmListenThread;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dm);

        if (!(dmListenRunning)) {
            dmListenThread = new Thread(dmListen);
            dmListenRunning = true;

            dmListenThread.start();
        }
    }

    @Override
    public void onBackPressed()
    {
        try {
            dmListen.KillThread(true);
            dmListenThread.interrupt();
        }

        catch (Exception e)
        {
            Log.i("LOG", e.toString());
        }

        finish();
    }
}

DMListen:

public class DMListen implements Runnable {

    ServerSocket serverSocket;
    boolean started = false;
    boolean closeSockets = false;
    boolean killed = false;

    public void run() {
        ReceivePlayerData();
    }

    public void ReceivePlayerData() {
        try {
            while (!(Thread.interrupted())) {
                if (!(started)) {
                    int port = 8080;
                    serverSocket = new ServerSocket(port);
                    started = true;
                }

                Socket clientSocket = serverSocket.accept();
                DataInputStream dataIn = new DataInputStream(clientSocket.getInputStream());
                String name;
                int init;

                name = dataIn.readUTF();
                init = dataIn.readInt();
                dataIn.close();
                clientSocket.close();
            }
        }

catch (Exception e) {
              Log.i("LOG", e.toString();
        }

        if(killed)
        {
            try {
                serverSocket.close();

                if (Thread.currentThread().isInterrupted())
                {
                    try {
                        Thread.currentThread().join();
                    }

                    catch (Exception e)
                    {
                        Log.i("LOG", e.toString());
                    }
                }
            }

            catch(IOException e)
            {
                Log.i("LOG", e.toString());
            }
        }
    }

    public void KillThread(boolean k)
    {
        boolean killed = k;
    }
}

玩家活动:

public class PlayerActivity extends AppCompatActivity {

    EditText hostIPBox;
    Button submit;
    String hostIPString;
    InetAddress hostIP;
    boolean denied = false;
    boolean started = false;
    PlayerConnect playerConnect;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_player);

        hostIPBox = (EditText) findViewById(R.id.ipaddress);
        hostIPBox.setRawInputType(Configuration.KEYBOARD_12KEY);
        hostIPBox.setSingleLine();
        submit = (Button) findViewById(R.id.submit);

        submit.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                hostIPString = hostIPBox.getText().toString();

                try {
                        if (!(hostIPString.equals(""))) {
                            hostIP = InetAddress.getByName(hostIPString);
                            if(!(started)) {
                                playerConnect = new PlayerConnect();
                                playerConnect.SetHostIP(hostIP);
                                denied = playerConnect.GetDenied();
                                started = true;
                            }

                            else {
                                playerConnect.SetHostIP(hostIP);
                                denied = playerConnect.GetDenied();
                            }


                            if (denied)
                            {
                                started = false;
                            }

                            else
                            {
                                new Thread(playerConnect).start();
                            }
                        }
                    }

                    catch (Exception e) {
                        Log.e("LOG", e.toString());
                    }
                }
        });
    }
}

玩家连接:

public class PlayerConnect implements Runnable {

    InetAddress hostIP;
    boolean closeSockets = false;
    boolean denied = false;

    public void run() {
            SendPlayerData(hostIP, playerName, playerInitiative);
    }

    private void SendPlayerData(InetAddress IP, String name, int init) {
        try {
            int port = 8080;
            Socket socket = new Socket();
            socket.connect(new InetSocketAddress(IP, port), 3000);
            DataOutputStream output = new DataOutputStream(socket.getOutputStream());

            if (socket.isConnected())
            {
                output.writeUTF(name);
                output.writeInt(init);
                output.close();
                socket.close();
            }

            if (closeSockets) {
                output.close();
                socket.close();
                closeSockets = false;
            }
        }

        catch (Exception e) {
            denied = true;
    Log.i("LOG", e.printStackTrace());
        }
    }

    public void SetHostIP(InetAddress host)
    {
        hostIP = host;
    }

    public boolean GetDenied()
    {
        return denied;
    }
}

共 (1) 个答案

  1. # 1 楼答案

    您应该使用服务来处理套接字连接。活动生命周期不会有问题