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