1. 程式人生 > >Android即時通訊--仿QQ即時聊天:(一)初識Socket

Android即時通訊--仿QQ即時聊天:(一)初識Socket

/**
 * 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();
			}
		});

	}
}
客戶端與服務端的資料互動會話示意圖