Android即時通訊--仿QQ即時聊天:(一)初識Socket
阿新 • • 發佈:2019-02-06
客戶端傳送訊息程式碼/** * socket服務端 * * @author ZHY * */ public class ServerSocketTest { public static void main(String[] args) throws IOException { final ServerSocket server = new ServerSocket(8090); System.out.println("伺服器已經啟動" + server); // 開啟一個執行緒,時刻監聽客戶端傳送過來的連線請求 new Thread() { public void run() { super.run(); while (true) { try { Socket client = server.accept();// 伺服器接收到連結進來的客戶端 System.out.println("有客戶端連結進來" + client); // 處理接收到的資料 // 由於伺服器不知道客戶端什麼時候傳送資料過來,所以要建立等待執行緒,時刻等待處理客戶端傳送過來的額資料 WaitThread waitThread = new WaitThread(client); waitThread.start(); } catch (IOException e) { e.printStackTrace(); } } } }.start(); } // 等待執行緒 public static class WaitThread extends Thread { private Socket client; // 服務端使用輸入流讀取資料 private DataInputStream reader; // 在構造等待執行緒的時候,給客戶端賦值 public WaitThread(Socket client) { super(); this.client = client; } public void run() { super.run(); // 迴圈等待處理資料 while (true) { if (reader == null) { // 根據客戶端發來的輸入流,建立伺服器讀取資料的流reader try { reader = new DataInputStream(client.getInputStream()); } catch (IOException e) { e.printStackTrace(); } } try { String msg = reader.readUTF(); System.out.println(msg); } catch (IOException e) { e.printStackTrace(); } } } } }
客戶端與服務端的資料互動會話示意圖/** * Socket客戶端 * @author ZHY * */ public class MainActivity extends Activity { private Button client; private Button send; private Socket socket; private DataOutputStream writer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); client = (Button) findViewById(R.id.client);// 連線伺服器 send = (Button) findViewById(R.id.send);// 傳送資料 client.setOnClickListener(new OnClickListener() { public void onClick(View v) { // 連線伺服器,與網路有關,要在子執行緒中 new Thread() { @Override public void run() { super.run(); try { // 建立socket,連線伺服器 socket = new Socket("192.168.0.148", 8090); } catch (Exception e) { e.printStackTrace(); } } }.start(); } }); send.setOnClickListener(new OnClickListener() { public void onClick(View v) { // 客戶端向服務端傳送訊息,通過輸出流,在子執行緒中 new Thread() { @Override public void run() { super.run(); if (socket == null) { // 建立socket,連線伺服器 try { socket = new Socket("192.168.0.148", 8090); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // 已經建立了連線 if (writer == null) { try { writer = new DataOutputStream(socket .getOutputStream()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // writer也不是空 try { writer.writeUTF("我是客戶端傳送的資料" + socket); } catch (IOException e) { e.printStackTrace(); } } }.start(); } }); } }