
我的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()表现得很奇怪.只有’连接’.显示在服务器上.
有人能告诉我我必须做些什么才能正常发送消息吗?
编辑:
这是我发现的事情:
>如果我在连接发送的消息多于所有消息(空)并且在第二个连接错误显示之后 – 请重新连接电话
>如果我在sendMessagetoServer中没有s.close行发送更多消息的连接,则只传递一条消息.之后没有显示错误.
>消息表单runTcpConnection始终显示(除非在此函数中没有SystemClock.sleep(10))
希望它能帮助别人诊断我的错误.
解决方法:
正如我所看到的,每当用户点击按钮发送时你都会创建一个新套接字,对吧?我建议您在用户单击connect时只启动一次,然后在send click事件中使用它(因为这是TCP,如果您创建新的socket实例,您将断开连接到服务器)
所以,你应该在sendMessagetoServer中删除这些行:
s = new Socket(serverIpAddress, SERVERPORT);s.close();和runTcpConnection中的这一行
s.close();每当您不希望与服务器通信时,套接字应该关闭(onstop是一个示例,或者当更改活动时……)
此外,您也应该只创建一个BuffereDWriter实例.
希望这有帮助.
以上是内存溢出为你收集整理的java – Android上两个应用程序之间的套接字通信全部内容,希望文章能够帮你解决java – Android上两个应用程序之间的套接字通信所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)