簡體   English   中英

Android和Java服務器之間的套接字編程問題

[英]Issues in socket programming between Android and Java server

我遇到的問題是我能夠正確連接,但是該死的連接不會關閉! 我必須做什么?

服務器端 :

聽.java

package com.example.ServerSide;


import java.net.ServerSocket;

public class Listen extends servVars {

    public static void main(String[] args) {
        try {
            System.out.println("HOSTED");
            hostAt = new ServerSocket(2051);
            conDev = hostAt.accept();
            System.out.println(conDev.getInetAddress()+":"+conDev.getPort());
            for(;;) {
                System.out.print(".");
                Thread.sleep(1000);
                if(conDev.isClosed())
                    break;
            }
        } catch(Exception E) {

        }
    }

}

servVars.java

package com.example.ServerSide;

import java.net.ServerSocket;
import java.net.Socket;

public class servVars {
    static ServerSocket hostAt;
    static Socket conDev;
}

客戶端 :

* Connect_to_server.java *

package com.example.clientside;

import java.net.Socket;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class Connect_to_server extends Activity implements View.OnClickListener {

    private EditText IP_field;
    private EditText port_field;
    private String IP;
    private String portStr;
    private int port;
    public static Socket conn;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.connect_to_server);
        IP_field = (EditText) this.findViewById(R.id.IP_field);
        port_field = (EditText) this.findViewById(R.id.port_field);
        Button connect = (Button) this.findViewById(R.id.connect_button);
        connect.setOnClickListener(this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.connect_to_server, menu);
        return true;
    }

    @Override
    public void onClick(View v) {
        IP = IP_field.getText().toString();
        portStr = port_field.getText().toString();
        Toast.makeText(getApplicationContext(),"Trying to connect to "+IP+":"+portStr,Toast.LENGTH_SHORT).show();
        try {
            port = Integer.parseInt(portStr);
            conn = new Socket(IP, port);
            Intent landing = new Intent(this, Landing.class);
            startActivity(landing);
        } catch(Exception E) {
            Intent failure = new Intent(this, ConnectFail.class);
            failure.putExtra("ctsException", E.toString());
            startActivity(failure);
        }
    }

}

Landing.java

package com.example.clientside;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class Landing extends Activity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.landing);
        Button disconnect = (Button) this.findViewById(R.id.disconnect_button);
        disconnect.setOnClickListener(this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.landing, menu);
        return true;
    }

    @Override
    public void onClick(View v) {
        try {
            Connect_to_server.conn.close();
            Toast.makeText(getApplicationContext(),"Disconnected!",Toast.LENGTH_SHORT).show();
        } catch(Exception E) {}
    }

}

我認為我沒有發布布局和ConnectFail.java,因為這不是必需的。

編輯:我猜這與Socket和ServerSocket是靜態的有關。 但是,我不知道如何使它們變為非靜態並仍然使程序運行!

isClosed()告訴是否已經關閉了套接字。 它不會告訴您有關連接狀態的任何信息 如果對等方關閉套接字,則在讀取以下內容時會收到EOF指示:

  • read()返回-1
  • readLine()返回null
  • readXXX()會為任何其他XXX拋出EOFException

由於您的服務器未從客戶端讀取任何內容,因此它可能無法發現客戶端何時關閉連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM