[英]Client socket on android
我正在尝试将一个字符串从android发送到pc,并在对该网站和其他网站进行了一些研究之后,我发现了有关套接字以及如何使用它们的信息。 我已经编写了可以接收发送给它的字符串的服务器程序。 下面是代码。
//static ServerSocket variable
private static ServerSocket server;
//socket server port on which it will listen
private static int port = 9021;
public static void main(String [] args) throws IOException, ClassNotFoundException{
server = new ServerSocket(port);
while(true){
System.out.println("Waiting for client request." + InetAddress.getLocalHost());
Socket socket = server.accept();
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
String message = (String)ois.readObject();
System.out.println("Message received: " + message);
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject("Hi Client: " + message);
ois.close();
oos.close();
socket.close();
if(message.equalsIgnoreCase("exit")){
break;
}
}
System.out.println("Shutting down serve");
server.close();
}
我已经使用发送字符串的pc客户端程序对此进行了测试,并确认此服务器脚本有效。 我现在尝试在android中实现相同的概念,但面临很多麻烦,这主要是因为在线完成此任务的教程已经非常过时(2-3年),因此没有任何预期的效果。 谁能告诉我如何编写一个非常简单的android应用,其中通过套接字发送单个字符串?
根据我在logcat中看到的信息,互联网上过时的教程无法正常工作,因为android在最近的版本中显然引入了一个非常激进的进程管理器,该进程管理器监视线程的行为,如果有重复的线程动作,它将关闭它不知不觉中。
编辑:根据解决方案,我已经实现了asynctask。 但是现在服务器未接收到并显示地址已在使用中。 我认为这是因为我的android代码中的套接字地址。 请帮忙!
public class MainActivity extends Activity {
private Button button;
private EditText message;
private TextView finalResult;
//InetAddress host;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
message = (EditText) findViewById(R.id.et_time);
button = (Button) findViewById(R.id.btn_do_it);
finalResult = (TextView) findViewById(R.id.tv_result);
/*
try {
host = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
AsyncTaskRunner runner = new AsyncTaskRunner();
String msg = message.getText().toString();
runner.execute(msg);
}
});
}
private class AsyncTaskRunner extends AsyncTask<String, String, String> {
Socket socket = null;
ObjectOutputStream oos = null;
ObjectInputStream ois = null;
int clientport = 8080;
String resp;
@Override
protected String doInBackground(String... params) {
publishProgress("Sending...");
String msg = params[0];
for(int i=0;i<=5;i++){
//establish socket connection to server
try {
socket = new Socket( "100.69.73.16",clientport);
//write to socket using Objectouputstream
oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(msg+i);
oos.close();
socket.close();
Thread.sleep(100);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
resp = "Message has been sent";
return resp;
}
@Override
protected void onPostExecute(String result) {
finalResult.setText(result);
}
@Override
protected void onPreExecute() {
}
@Override
protected void onProgressUpdate(String... values) {
finalResult.setText(values[0]);
}
}
}
好的,所以我通过更改端口号解决了“地址已使用”的问题。 显然,笔记本电脑上的其他程序正在使用该端口号。 因此,回想一下任何人检查如何执行此操作,您可以使用我上面的代码,并记住将两个代码中的端口号更改为类似的名称。 同样在打开套接字的我的android代码中,您可以为计算机输入本地ip地址(非常重要,谷歌为您提供外部地址)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.