android基礎(chǔ)入門教程7.6.2基于tcp協(xié)議的socket通信_第1頁
android基礎(chǔ)入門教程7.6.2基于tcp協(xié)議的socket通信_第2頁
android基礎(chǔ)入門教程7.6.2基于tcp協(xié)議的socket通信_第3頁
android基礎(chǔ)入門教程7.6.2基于tcp協(xié)議的socket通信_第4頁
android基礎(chǔ)入門教程7.6.2基于tcp協(xié)議的socket通信_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、title: Android基礎(chǔ)入門categories: Android7.6.2 基于TCP協(xié)議的Socket通信(1)基礎(chǔ)入門,Android基礎(chǔ)入門 Socket通信(1)7.6.2 基于TCP協(xié)議的本節(jié)引言:1.Socket?2.Socket通信模型:上一節(jié)的概念課枯燥無味是吧,不過總有點收獲是吧,本節(jié)開始來研究基于TCP協(xié)議的Socket通信,先來了解下Socket的概念,以及Socket通信的模型,實現(xiàn)Socket的步驟,以及作為Socket服務端與客戶端的兩位各做要做什么事情!好的,由淺入深來扣這個Socket吧!Socket通信實現(xiàn)步驟:好的,接下來寫一個簡單的例子,開啟服務

2、端后,客戶端點擊按鈕然后服務端,并向服務端發(fā)送一串字符串,表示通過Socket上服務器Step 1:創(chuàng)建ServerSocket和SocketStep 2:打開連接到的Socket的輸入/輸出流 Step 3:按照協(xié)議對Socket進行讀/寫操作 Step 4:關(guān)閉輸入輸出流,以及Socket3.Socket服務端的編寫:服務端要做的事有這些:代碼實現(xiàn):直接在Eclipse下創(chuàng)建一個Java項目,然后把Java代碼貼進去即可!public class SocketServer .public sic void main(String args) throwsOException / .創(chuàng)建一個

3、服務器端Socket,即ServerSocket,指定綁定的端口,并此端口.ServerSocket serverSocket = new ServerSocket( 2345); netAddress address = netAddress.getLocalHost();String ip = address.getHostAddress(); Socket socket = null;/2.調(diào)用accept()等待客戶端連接System.out.prln(服務端已就緒,等待客戶端接入,服務端ip地址:ip);.socket = serverSocket.accept();/3.連接后獲取

4、輸入流, nputStream is=null; nputStreamReader isr=null;BufferedReader br=null;OutputStream os=null;客戶端信息.0.2.3.4.PrWritw=null;is = socket.get nputStream();/獲取輸入流isr = new nputStreamReader(is,UT br = new BufferedReader(isr);String info = null;8);while(info=br.readLine()!=null)/循環(huán)客戶端的信息System.out.prln(客戶端

5、發(fā)送過來的信息info);socket.shutdown nput();/關(guān)閉輸入流Step 1:創(chuàng)建ServerSocket對象,綁定的端口Step 2:調(diào)用accept()方法客戶端的請求Step 3:連接建立后,通過輸入流客戶端發(fā)送的請求信息Step 4:通過輸出流向客戶端發(fā)送響應信息 Step 5:關(guān)閉相關(guān)資源5.6.7.socket.close();然后把代碼run起來,控制臺會打?。汉玫?,接下來到Android客戶端了!4.Socket客戶端的編寫:客戶端要做的事有這些:代碼實現(xiàn):MainActivity.java:public class MainActivity extends

6、ClickListener ptivity implements View.On.Overrideprotected void onCreate(Bundle super.onCreate(saved nstansaved nstane);e) setContentView(R.layout.activity_main);Button btn_accept = (Button) findViewBy d(R.id.btn_accept); btn_accept.setOnClickListener(this);OverrideStep 1:創(chuàng)建Socket對象,指明需要的服務器的地址和端號St

7、ep 2:建立后,通過輸出流向服務器發(fā)送請求信息Step 3:通過輸出流獲取服務器響應的信息 Step 4:關(guān)閉相關(guān)資源.0.2.3.4.5.6.7.8.9.0.2.3.4.5.6.7.8.9.public void onClick(View v) newThread() Overridepublic void run() try acceptServer(); catch ( OException e) e.prStackTrace();.start();private void acceptServer() throws OException / .創(chuàng)建客戶端Socket,指定服務器地址和

8、端口Socket socket = new Socket( 72. 6.2.54, 2345);/2.獲取輸出流,向服務器端發(fā)送信息OutputStreamos = socket.getOutputStream();/字節(jié)輸出流PrWritw = new PrP地址Writer(os);/將輸出流包裝為打印流/獲取客戶端的netAddress address = netAddress.getLocalHost();String ip = address.getHostAddress();pw.write(客戶端: pw.flush();ip 接入服務器!);socket.shutdownOut

9、put();/關(guān)閉輸出流 socket.close();因為Android不允許在主線程(UI線另開一個線程來連接Socket!做網(wǎng)絡(luò)操作,所以這里需要自己運行結(jié)果:點擊按鈕后,服務端控制臺打?。?.增強版案例:小豬簡易聊天室只是點擊個按鈕,然后服務器返回一串信息,肯定是很無趣的是吧,接下來來還需要搭建一個超簡單的聊天室,字節(jié)寫一個線程,具體的需要用到線,Socket的集合,在代碼中來體會!實現(xiàn)的效果圖:先把的服務端跑起來:接著把的程序分別跑到兩臺模擬器上:接下來來寫代碼:首先是服務端,就是將讀寫socket的操作放到自定義線程當中,創(chuàng)建ServerSocket后,循環(huán)調(diào)用accept方法,當

10、有新客戶端接入,將socket加入集合當中,同時新建一個線程!另外,在信息的方法中,對輸入字符串進行判斷,如果為bye字符串,將socket從集合中移除,然后close掉!Server.java:public class Server /定義相關(guān)的參數(shù),端口,Socket連接的集合,ServerSocket對象/以及線.private sic finalPORT = 2345;privaist mList = new ArrayList(); private ServerSocket server = null;private ExecutorService myExecutorService

11、 = null;public sic void main(String args) new Server();.0.2.3.4.5.6.7.8.9.0.2.3.4.5.6.7.8.9.0.2.3.public Server()tryserver = new ServerSocket(PORT);/創(chuàng)建線myExecutorService = Executors.newCachedThreool();System.out.prln(服務端運行中.n);Socket cnt = null;while(true)cnt = server.accept();mList.add(cnt);myExecu

12、torService.execute(new Service(cnt);catch(Exception e)e.prStackTrace();class Service implements Runnableprivate Socket socket;private BufferedReader in = null; private String msg = ;public Serviocket socket) this.socket = socket; tryin = new BufferedReader(new nputStreamReader(socket.ge t nputStream

13、();4.msg = 用戶: this.socket.get netAddress()加入了聊天室5.6.7.8.9.0.2.3.4.5.6.7.8.9.0.2.3.4.5.當前 this.sendmsg();人數(shù): mList.size();catch( OException e)e.prStackTrace();Overridepublic void run() trywhile(true)if(msg = in.readLine() != null)if(msg.equals(bye)System.out.prln();mList.remove(socket);in.close();ms

14、g = 用戶:socket.get netAddress()退出: 當前人數(shù): mList.size();6.7.8.9.0.socket.close(); this.sendmsg(); break;elsemsg = socket.get netAddress()說: msg;.2.3.4.5.6.7.8.9.0.2.3.4.5.6.this.sendmsg();catch(Exception e)e.prStackTrace();/為連接上服務端的每個客戶端發(fā)送信息 public void sendmsg()System.out.prln(msg);num = mList.size();

15、index = 0;index num;index )for(Socket mSocket = mList.get(index);PrWritout = null;7.8.9.try pout = new PrWriter(new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream(),UT8),true);pout.pr0.2.3.4.5.6.ln(msg);catch ( OException e) e.prStackTrace();接著到客戶端,客戶端的難點在于要另外開辟線程,因為Android不允許直接在主線做網(wǎng)絡(luò)

16、操作,而且不允許在主線的線程操作UI,這里的做法是自己新建一個線程,以及通過Hanlder來更新UI,實際開發(fā)不建議直接這樣做!布局文件:activity_main.xml:MainActivity.java:public class MainActivity extends Runnable ptivity implements./定義相關(guān)變量,完成初始化 private TextView txtshow;private EditText edi private Button btnsend;d;private s private sic final String HOST = 72. 6.

17、2.54;ic finalPORT = 2345;private Socket socket = null; private BufferedReader in = null; private PrWriter out = null; private String content = ; private StringBuilder sb = null;.0.2.3.4.5.6.7.8.9.0.2.3.4.5.6.7./定義一個handler對象,用來刷新界面public Handler handler = new Handler() public void handleMessage(Mess

18、age msg) if (msg.what = 0 x 23) sb.append(content); txtshow.setText(sb.toString();Overrideprotected void onCreate(Bundle saved nstane) super.onCreate(saved nstane);setContentView(R.layout.activity_main); sb = new StringBuilder();txtshow = (TextView) findViewBy d(R.id.txtshow);edid = (EditText) findV

19、iewBy d(R.id.edid);btnsend = (Button) findViewBy d(R.id.btnsend);/當程序一開始運行的時候就實例化Socket對象,與服務端進行連接,獲取輸入輸出流8.9.0.2.3.4./因為4.0以后不能再主線進行網(wǎng)絡(luò)操作,所以需要另外開辟一個線程newThread() public void run() trysocket = new Socket(HOST, PORT); in = new BufferedReader(newnputStreamReader(socket.get nputStream(), UT8);5.out =new PrWriter(new BufferedWriter(newOutputStreamWriter(6.7.8.9.0.2.3.4.5.6.7.8.9.0.2.3.4.5.6.7.8.9.0.2.3.4.5.6.7.8.9.0.socket.getOutputStream(), true); OException e) StackTrace(); catch (e.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論