首先, 允許internt訪問權限:
<uses-permission android:name="android.permission.INTERNET" />
其次, socket不允許在mainactivity下創建, 所以必須起線程:
new Thread(new Runnable(){ @Override public void run() { //中間的代碼 } }).start();
最後, 起線程後, 需要子線程對主線程進行通訊, 採用handler, 主程序接收消息方面, 網上參考的代碼太老, 可以運行, 但是有警告, 這個代碼沒有警告, 適應2019年的android studio.:
private Handler handler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(@NonNull Message msg) { switch (msg.what) { case -1: Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show(); break; case 1: Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show(); break; } return false; } });
handler發送端的代碼:
Message message; message = handler.obtainMessage();//性能優化後 message.what=1; message.obj = "需要發送的消息"; handler.sendMessage(message); //發送消息
socket部分, 可以用utf編碼傳送中文字符串, 發送並接收反饋消息, 然後斷開.
try { Socket s = new Socket(); SocketAddress socketaddress = new InetSocketAddress( "10.0.2.2", 7779);//申請鏈接 s.connect(socketaddress, 1000); OutputStreamWriter osw=new OutputStreamWriter(os, StandardCharsets.UTF_8); osw.write("你好, hello server! <end>"); osw.flush(); final int bufferSize = 1024; final char[] buffer = new char[bufferSize]; final StringBuilder out = new StringBuilder(); InputStream inputStream = s.getInputStream(); Reader in = new InputStreamReader(inputStream, StandardCharsets.UTF_8); for (; ; ) { int rsz = in.read(buffer, 0, buffer.length); if (rsz < 0) break; out.append(buffer, 0, rsz); } s.close(); Message message; message = handler.obtainMessage();//性能優化後 message.what=1; message.obj = out.toString(); handler.sendMessage(message); //發送消息 } catch (Exception ex) { Message message; message = handler.obtainMessage();//性能優化後 message.what=-1; message.obj = "網絡連接失敗"; handler.sendMessage(message); //發送消息 } }