我试图将一个字符串从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]);
}
}
}
答案 0 :(得分:0)
好的,所以我解决了已经使用的地址问题&#39;通过更改端口号。显然,我的笔记本电脑上的其他程序正在使用端口号。因此,回想起任何检查如何执行此操作的人,您可以使用我的上述代码并记住将两个代码中的端口号更改为类似的代码。另外在我打开套接字的android代码中,您可以为您的计算机输入本地IP地址(非常重要,谷歌为您提供外部)。