Android上两个应用程序之间的套接字通信

我的Android应用程序存在很大问题,我想请求您的帮助。

我目前正在使用套接字编写Android Clietn-Server应用程序。 我在互联网上找到了很多辅导员,从中我已经为我的项目创建了基础知识。 但是,所有教程仅适用于一个消息发送,这就是全部。 我需要发送更多它们,所以我一直在尝试修改它。

这是负责服务器和客户端的代码片段。 其余的在这个时候并不重要。

服务器:

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); serverStatus = (TextView) findViewById(R.id.server_status); recivedMsg = (TextView)findViewById(R.id.rec_msg); SERVERIP = getLocalIpAddress(); Thread fst = new Thread(new ServerThread()); fst.start(); } public class ServerThread implements Runnable { public void run() { try { if (SERVERIP != null) { handler.post(new Runnable() { @Override public void run() { serverStatus.setText("Listening on IP: " + SERVERIP); } }); serverSocket = new ServerSocket(SERVERPORT); while (true) { // listen for incoming clients Socket client = serverSocket.accept(); handler.post(new Runnable() { @Override public void run() { serverStatus.setText("Connected." + System.getProperty("line.separator")); } }); try { line = null; while (connected) { BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); if((line = in.readLine())!=null) { Log.d("ServerActivity", line); handler.post(new Runnable() { @Override public void run() { if(recivedMsg.equals("CLOSE")) { recivedMsg.append("CLOSE socket"); connected = false; } else { recivedMsg.append("MSG: " + line + System.getProperty("line.separator")); } // do whatever you want to the front end // this is where you can be creative } }); } else { recivedMsg.append("empty" + System.getProperty("line.separator")); } } break; } catch (Exception e) { handler.post(new Runnable() { @Override public void run() { serverStatus.setText("Oops. Connection interrupted. Please reconnect your phones."); } }); e.printStackTrace(); } } } else { handler.post(new Runnable() { @Override public void run() { serverStatus.setText("Couldn't detect internet connection."); } }); } } catch (Exception e) { handler.post(new Runnable() { @Override public void run() { serverStatus.setText("Error"); } }); e.printStackTrace(); } } } 

客户

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); serverIp = (EditText) findViewById(R.id.server_ip); connectPhones = (Button) findViewById(R.id.connect_phones); sendField = (EditText) findViewById(R.id.send_field); sendMsg = (Button) findViewById(R.id.msg_send); connectPhones.setOnClickListener(connectListener); sendMsg.setOnClickListener(sendMessage); } @Override protected void onStop() { super.onStop(); try { BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); //send output msg String outMsg = "CLOSE"; out.write(outMsg); out.flush(); // make sure you close the socket upon exiting s.close(); } catch (IOException e) { e.printStackTrace(); } } private OnClickListener connectListener = new OnClickListener() { @Override public void onClick(View v) { serverIpAddress = serverIp.getText().toString(); runTcpConnection(); sendMessageToServer("Msg"); } }; private OnClickListener sendMessage = new OnClickListener() { @Override public void onClick(View v) { sendMessageToServer(sendField.getText().toString()); } }; private void runTcpConnection() { try { s = new Socket(serverIpAddress, SERVERPORT); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); //send output msg String outMsg = "TCP connecting to " + SERVERPORT + System.getProperty("line.separator"); out.write(outMsg); out.flush(); Log.i("TcpClient", "sent: " + outMsg); SystemClock.sleep(10); s.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }; public void sendMessageToServer(String str) { try { s = new Socket(serverIpAddress, SERVERPORT); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); //send output msg String outMsg = str + System.getProperty("line.separator"); out.write(outMsg); out.flush(); Log.i("TcpClient", "sent: " + outMsg); s.close(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); Log.d("", "hello222"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); Log.d("", "hello4333"); } } 

目前设备连接正确。 此外,他们正在发送第一个连接消息( OnClickListener connectListener消息)。 问题是,当我尝试使用sendMessageToServer发送另一条消息时,这是不可能的。 这些消息仅在客户端活动被销毁后显示。

非常有趣的是没有SystemClock.sleep(10); 监听器runTcpConnection()表现runTcpConnection()奇怪。 只有’连接’。 显示在服务器上。

有人能告诉我我必须做些什么才能正常发送消息吗?

编辑:这是我发现的事情:

  • 如果我在连接发送的消息多于所有消息(空)并且在第二个连接错误显示之后 – 请重新连接电话
  • 如果我在sendMessageToServer没有s.close行发送更多消息的连接,则只有一条消息正在通过。 之后没有显示错误。
  • 消息表单runTcpConnection始终显示(除非在此函数中没有SystemClock.sleep(10))

希望它能帮助别人诊断我的错误。

正如我所看到的,每当用户点击按钮发送时你都会创建一个新套接字,对吧?
我建议你在用户点击连接时只启动它一次,然后在发送点击事件中使用它(因为这是TCP,如果你创建新的套接字实例,你将断开连接到服务器)
因此,您应该在sendMessageToServer中删除这些行

 s = new Socket(serverIpAddress, SERVERPORT); s.close(); 

runTcpConnection中的这一行

 s.close(); 

每当您不希望与服务器通信时,套接字应该关闭(onstop是一个示例,或者当更改活动时……)
此外,您也应该只创建一个BufferedWriter实例。
希望这有帮助。