日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android中基于Socket的网络通信

發(fā)布時間:2023/12/15 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android中基于Socket的网络通信 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. Socket介紹

2. ServerSocket的建立與使用

3. 使用ServerSocket建立聊天服務(wù)器-1

4. 使用ServerSocket建立聊天服務(wù)器-2

5. 在Android中創(chuàng)建Socket客戶端

------------------------------------------------------------------

工程源碼:SocketDemo.zip

服務(wù)器端 - Java工程:ServerSocketDemo

客戶端 - Android工程:AndroidSocketClient

------------------------------------------------------------------

1. Socket介紹

??? Socket 又稱"套接字",應(yīng)用程序通常通過"套接字"向網(wǎng)絡(luò)發(fā)出請求或者應(yīng)答網(wǎng)絡(luò)請求。ServerSocket 用于服務(wù)器端,Socket 是建立網(wǎng)絡(luò)連接時使用的。在連接成功時,應(yīng)用程序兩端都會產(chǎn)生一個 Socket 實例,操作這個實例,完成所需的會話。

??? 對于一個網(wǎng)絡(luò)連接來說,套接字是平等的,沒有差別, 不會應(yīng)用在服務(wù)器端或者客戶端而產(chǎn)生不同級別。

??? 不管是Socket還是ServerSocket 他們的工作都是通過Socket類及其子類完成。

?? * 基于TCP連接,數(shù)據(jù)傳輸有保障

?? * 適于建立長時間的連接

?? * 通常用于即時通信

?

2. ServerSocket的建立與使用

3. 使用ServerSocket建立聊天服務(wù)器-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) {// 監(jiān)聽 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 管理員權(quán)限打開 CMD窗口: telnet localhost 12345

???

???

??? 兩個線程互補影響

???

?

4. 使用ServerSocket建立聊天服務(wù)器-2

??? 3中的兩個Client不能相互通信

??? 所以在3的基礎(chǔ)上修改項目:

??? * 新建 ChatManager.java(單例模式) 來管理Socket連接

??? * 修改: ServerListener.java, 來存儲 所有連接 到 Server的 Socket

??? *? 在ChatSocket線程中,增加接收消息的 代碼

??? 具體項目可以看源代碼

?

5. 在Android中創(chuàng)建Socket客戶端

??? 在Android中創(chuàng)建Socket客戶端。使用Socket建立客戶端鏈接,并且在AsyncTask中執(zhí)行網(wǎng)絡(luò)讀寫的任務(wù),將用戶輸入的內(nèi)容發(fā)送到服務(wù)器,并接收服務(wù)器發(fā)來的數(shù)據(jù),顯示到界面上。開啟多個虛擬機模擬多人聊天效果。

??? 拿4中的Java項目作為服務(wù)器端

??? 創(chuàng)建 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

?

同時開兩臺虛擬機的運行效果如下:

?

總結(jié)

以上是生活随笔為你收集整理的Android中基于Socket的网络通信的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。