[英]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.