Android中基于Socket的网络通信
1. Socket介紹
2. ServerSocket的建立與使用
3. 使用ServerSocket建立聊天服務器-1
4. 使用ServerSocket建立聊天服務器-2
5. 在Android中創建Socket客戶端
------------------------------------------------------------------
工程源碼:SocketDemo.zip
服務器端 - Java工程:ServerSocketDemo
客戶端 - Android工程:AndroidSocketClient
------------------------------------------------------------------
1. Socket介紹
??? Socket 又稱"套接字",應用程序通常通過"套接字"向網絡發出請求或者應答網絡請求。ServerSocket 用于服務器端,Socket 是建立網絡連接時使用的。在連接成功時,應用程序兩端都會產生一個 Socket 實例,操作這個實例,完成所需的會話。
??? 對于一個網絡連接來說,套接字是平等的,沒有差別, 不會應用在服務器端或者客戶端而產生不同級別。
??? 不管是Socket還是ServerSocket 他們的工作都是通過Socket類及其子類完成。
?? * 基于TCP連接,數據傳輸有保障
?? * 適于建立長時間的連接
?? * 通常用于即時通信
?
2. ServerSocket的建立與使用
3. 使用ServerSocket建立聊天服務器-1
??? 3.1 建立Java工程: ServerSocketDemo
??????? * ChatSocket.java
public class ChatSocket extends Thread {Socket socket;public ChatSocket(Socket s) {socket = s;}public void out(String out) {try {socket.getOutputStream().write(out.getBytes("UTF-8"));} catch (Exception e) {e.printStackTrace();}}@Overridepublic void run() {int count = 0;while (true) {count++;out("loop : " + count + ", \t");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}??? * ServerListener.java
public class ServerListener extends Thread {@Overridepublic void run() {ServerSocket serverSocket;try {serverSocket = new ServerSocket(12345);while (true) {// 監聽 12345端口Socket socket = serverSocket.accept();// 建立連接JOptionPane.showMessageDialog(null,"There is an client access 12345 port");new ChatSocket(socket).start();}} catch (IOException e) {e.printStackTrace();}} }??? * MyServerSocket.java
public class MyServerSocket {public static void main(String[] args) {new ServerListener().start();}}??? 3.2 管理員權限打開 CMD窗口: telnet localhost 12345
???
???
??? 兩個線程互補影響
???
?
4. 使用ServerSocket建立聊天服務器-2
??? 3中的兩個Client不能相互通信
??? 所以在3的基礎上修改項目:
??? * 新建 ChatManager.java(單例模式) 來管理Socket連接
??? * 修改: ServerListener.java, 來存儲 所有連接 到 Server的 Socket
??? *? 在ChatSocket線程中,增加接收消息的 代碼
??? 具體項目可以看源代碼
?
5. 在Android中創建Socket客戶端
??? 在Android中創建Socket客戶端。使用Socket建立客戶端鏈接,并且在AsyncTask中執行網絡讀寫的任務,將用戶輸入的內容發送到服務器,并接收服務器發來的數據,顯示到界面上。開啟多個虛擬機模擬多人聊天效果。
??? 拿4中的Java項目作為服務器端
??? 創建 Android客戶端 項目: AndroidSocketClient
??????? 建立一個如圖所示的布局:
???????
public class MainActivity extends Activity {EditText etIP, etComposing;TextView tvContent;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);etIP = (EditText) findViewById(R.id.etIP);etComposing = (EditText) findViewById(R.id.etComposing);tvContent = (TextView) findViewById(R.id.tvContent);findViewById(R.id.btnConn).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stub connect();}});findViewById(R.id.btnSend).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stub send();}});}Socket socket = null;BufferedWriter bw;BufferedReader br;public void connect() {AsyncTask<Void, String, Void> read = new AsyncTask<Void, String, Void>() {@Overrideprotected Void doInBackground(Void... params) {try {socket = new Socket(etIP.getText().toString(), 12345);bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));br = new BufferedReader(new InputStreamReader(socket.getInputStream()));publishProgress("@success");try {String line;while ((line = br.readLine()) != null) {publishProgress(line);}} catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace();}} catch (UnknownHostException e) {// TODO Auto-generated catch blockpublishProgress("@fail");e.printStackTrace();} catch (IOException e) {publishProgress("@fail");e.printStackTrace();}return null;}@Overrideprotected void onProgressUpdate(String... values) {if (values[0].equals("@success")) {tvContent.append("Success connect to Server\n");} else if(values[0].equals("@fail")) {tvContent.append("Connect to Server Fail\n");} else{Log.d("CARLOZ", "Other: " + values[0]);tvContent.append("Other: " + values[0] + "\n");}super.onProgressUpdate(values);}};read.execute();}public void send() {try {tvContent.append("Me: " + etComposing.getText().toString() + "\n");bw.write(etComposing.getText().toString() + "\n");bw.flush();etComposing.setText("");// clear} catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace();}} }?
運行效果如下,下面的彈框是Java程序的Dialog
?
同時開兩臺虛擬機的運行效果如下:
?
總結
以上是生活随笔為你收集整理的Android中基于Socket的网络通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MessageBox、::Message
- 下一篇: Excel制作资产负债表时如何输入序号