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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android网络编程的Socket通信总结

發布時間:2025/3/20 Android 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android网络编程的Socket通信总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

創建服務器端的步驟
1,指定端口實例化一個ServerSocket

2,調用ServerSocket的accept方法等待連接期間阻塞

3,獲取位于底層的Socket流進行讀寫操作

4,將數據封裝成流

5,對Socket進行讀寫

6,關閉流

創建客戶端的步驟:

1,通過IP地址和端口實例化Socket,請求連接服務器

2,獲取位于底層的Socket流進行讀寫操作

3,將數據封裝成流(BufferedReader/PrintWriter,DataOutputStream/DataInputStream)的實例

4,對Socket進行讀寫

5,關閉流

使用ServerSocket創建服務器端:

public static void main(String[] args) throws IOException {// TODO Auto-generated method stub//創建一個ServerSo查看特,用于監聽客戶端Socket的連接請求ServerSocket ss=new ServerSocket(3000);while(true){//每當接收到客戶端Socket的請求,服務器端也對應產生一個Socket,沒接收到請求就等待。。Socket s=ss.accept();OutputStream os=s.getOutputStream();//服務器端產生的Socket獲取輸出流os.write("您好,您收到了來自服務器的祝福!\n".getBytes());os.close();s.close();}} 客戶端使用Socket通信:
測試環境是PC端服務器,手機當客戶端,PC和手機要連接同一個局域網,PC和手機在同一網段

package com.example.simpleclient;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; import java.net.UnknownHostException;import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView;public class MainActivity extends Activity {TextView text;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);text=(TextView) findViewById(R.id.text);new Thread(){@Overridepublic void run() {// TODO Auto-generated method stubtry {//建立連接到遠程服務器的的Socket,Ip是服務器端PC的IP,測試環境是PC端服務器,手機當客戶端,PC和手機要連接同一個局域網,PC和手機在同一網段Socket socket = new Socket("192.168.88",3000);//將Socket對應的輸入流包裝秤BufferedReaderBufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));String line=br.readLine();text.setText("來自服務的數據:"+line);br.close();socket.close();} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} }}.start();}} <!-- 訪問網絡權限 --><uses-permission android:name="android.permission.INTERNET"/>
客戶端和服務器端的輸入輸出流的問題容易搞混淆:如下圖


在客戶端:

socket.getInputStream();從socket讀來自服務器的數據

socket.getOutputStream();向socket中寫數據,傳給服務器,服務器在它的socket的輸入流讀這個數據

在服務器端:

socket.getInputStream();從socket讀來自客戶端的數據

socket.getOutputStream();向socket中寫數據,傳給客戶端,客戶端在它的socket的輸入流讀這個數據

就是說客戶端和服務器端的輸入輸出流是對應的,輸入流連接到輸出流


輸入輸出流的包裝:

第一種方法:數據二進制流

DataInputStream in=new DataInputStream(socket.getInputStream());//接收客戶端信息 DataOutputStream out=new DataOutputStream(socket.getOutputStream()); //向客戶端發送消息第二種方法:

PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));


socketClient,java

import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket;import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView;public class socketClient extends Activity {private Button button;private TextView text;private EditText edit;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);button = (Button) findViewById(R.id.button);edit = (EditText) findViewById(R.id.edit);text = (TextView) findViewById(R.id.text);button.setOnClickListener(new View.OnClickListener() {private Socket socket = null;@Overridepublic void onClick(View v) {// TODO Auto-generated method stubString sendMsg = edit.getText().toString() + "\r\n";try {socket = new Socket("192.168.0.37", 8888); // 創建Socket,其中ip地址為我的PC機器的地址,手機通過wifi上網和服務器在一個網段// PrintWriter out = new PrintWriter(new BufferedWriter(new// OutputStreamWriter(socket.getOutputStream())),true);// out.println(sendMsg);// // BufferedReader in = new BufferedReader(new// InputStreamReader(socket.getInputStream()));// String readMsg = in.readLine();// if(readMsg !=null){// text.setText(readMsg);// }else{// text.setText("錯誤");// }// // out.close();// in.close();// socket.close();DataOutputStream out = new DataOutputStream(socket.getOutputStream()); // 向服務器發送消息out.writeUTF(sendMsg);out.flush();DataInputStream in = new DataInputStream(socket.getInputStream()); // 接收來自服務器的消息String readMsg = in.readUTF();if (readMsg != null) {text.setText(readMsg);}out.close();in.close();socket.close();} catch (Exception e) {e.printStackTrace();}}});} }
Server.java

import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket;public class Server {public Server(){new ServerThread().start();}class ServerThread extends Thread{public void run() {try {ServerSocket ss=new ServerSocket(8888); 創建一個ServerSocket對象,并讓這個ServerSocket在8888端口監聽while(true){Socket socket=ss.accept(); //調用ServerSocket的accept()方法,接受客戶端所發送的請求,如果客戶端沒有發送數據,那么該線程就停滯不繼續 // try { // BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); //接收客戶端信息 // String readline = in.readLine(); // System.out.println("readline:"+readline); // // PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true); // out.println("link server success"); // // in.close(); //關閉流 // out.close();//關閉流 // socket.close();//關閉打開的socket // // } catch (Exception e) { // // TODO: handle exception // }finally{ // // socket.close();// // }try {DataInputStream in=new DataInputStream(socket.getInputStream());//接收客戶端信息String readline=in.readUTF();System.out.println(readline);DataOutputStream out=new DataOutputStream(socket.getOutputStream()); //向客戶端發送消息out.writeUTF("link server success");out.flush();in.close(); //關閉流out.close();//關閉流socket.close();//關閉打開的socket} catch (Exception e) {System.out.println(e.getMessage());}}} catch (IOException e) {System.out.println(e.getMessage());}}}public static void main(String[] args) throws IOException {new Server(); //開啟服務器}}
加入多線程:聊天室

客戶端和服務器端保持長時間的通信,服務器需要不斷的讀取客戶端數據,并向客戶端寫入數據,客戶端也需要不斷的讀取服務器的數據

服務器應該為每個Socket單獨啟動一條線程,每條線程負責與一個客戶端進行通信

服務器端:

package com.hust.multithred;import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList;public class MyServer {/*** @param args* @throws IOException *///服務器端保存所有Socket的ArrayListpublic static ArrayList<Socket> socketlist=new ArrayList<Socket>();public static void main(String[] args) throws IOException {// TODO Auto-generated method stubServerSocket ss=new ServerSocket(3000);//ServerSocket監聽3000端口while(true){Socket socket_in_server=ss.accept();//循環等待客戶端的Socketsocketlist.add(socket_in_server); //每接收到一個客戶端的Socket,將服務器端產生的與之對應的Socket加入數組//為每一個Socket單獨啟動一條線程,每個線程負責與一個客戶端進行通信SocketThread socketthread=new SocketThread(socket_in_server);new Thread(socketthread).start();}}} package com.hust.multithred;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.Socket;public class SocketThread implements Runnable{//線程任務類,實現Runnable接口Socket s=null;BufferedReader br=null;public SocketThread(Socket s) throws IOException{this.s=s;br=new BufferedReader(new InputStreamReader(s.getInputStream()));//Socket輸入流包裝成字符流,來自客戶端的數據在此輸入流上,服務器端可以讀}public void run() {// TODO Auto-generated method stubtry {String content=null;//循環不斷沖Socket中讀取客戶端發送過來的數據while((content=readFormClient())!=null){//每讀到數據之后,將讀到的內容向每個Socket發送一次for(Socket s:MyServer.socketlist){ OutputStream os=s.getOutputStream();os.write((content+"\n").getBytes("utf-8")); //寫到每個socket 的輸出流上 }}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//從輸入流上讀取來自客戶端的數據方法public String readFormClient(){String content=null;try {content = br.readLine();} catch (IOException e) {// TODO Auto-generated catch blockMyServer.socketlist.remove(s);}return content;}}
客戶端:

MainActivity.java

package com.hust.multithreadclient;import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView;public class MainActivity extends Activity {EditText input;TextView show;Button send;Handler handler;ClientThread clientthread;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);input=(EditText) findViewById(R.id.input);show=(TextView) findViewById(R.id.show);send=(Button) findViewById(R.id.send);//此處handler接收來自子線程的消息,負責處理消息,更新UIhandler=new Handler(){@Override//如果消息來自子線程public void handleMessage(Message msg) {// TODO Auto-generated method stubif(msg.what==0x123){show.append("\n"+msg.obj.toString());}}};//客戶端啟動ClientThread線程創建玩過連接,讀取來自服務器的數據new Thread(new ClientThread(handler)).start();send.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {// 當用戶按下發送按鈕后,將用戶輸入的數據封裝成Message,發給子線程的Handler,此處handler負責發送消息Message msg=new Message();msg.what=0x111;msg.obj=input.getText().toString();clientthread.rvhandler.sendMessage(msg);//發給子線程的Handlerinput.setText("");} });}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);} }
ClientThread.java

package com.hust.multithreadclient;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException;import android.os.Handler; import android.os.Looper; import android.os.Message;public class ClientThread implements Runnable {Socket s;Handler handler; //定義向UI線程發送消息的Handler對象Handler rvhandler; //定義接收UI線程消息的Handler對象BufferedReader br=null;OutputStream os=null;public ClientThread(Handler handler){this.handler=handler;}@Overridepublic void run() {// TODO Auto-generated method stubtry {s=new Socket("192.168.1.88",3000);br=new BufferedReader(new InputStreamReader(s.getInputStream()));os=s.getOutputStream();//啟動一條子線程來讀取服務器端相應的數據new Thread(){@Overridepublic void run() {// TODO Auto-generated method stubString content=null;try{while((content=br.readLine())!=null){Message msg=new Message();msg.what=0x123;msg.obj=content;handler.sendMessage(msg);//此子線程中僅僅是讀來自服務器的數據,并發給UI線程的Handler處理}}catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}.start();/** 當前客戶端線程中Handler,Android線程之間的通信是Handler來實現* 此Hnadler接收UI線程發過來的數據,即用戶的輸入,并寫到輸出流* 因為此Handler是接收處理消息,所以需要使用Looper* */Looper.prepare();rvhandler=new Handler(){@Overridepublic void handleMessage(Message msg) {//如果接收到UI線程中用戶輸入的數據if(msg.what==0x111){try{//將用戶在文本框內的輸入內容寫入網絡os.write((msg.obj.toString()+"\r\n").getBytes("utf-8"));}catch(IOException e){e.printStackTrace(); }}}};Looper.loop();//啟動looper} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

總結

以上是生活随笔為你收集整理的Android网络编程的Socket通信总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 交视频在线播放 | 一区二区天堂 | 国产噜噜噜噜久久久久久久久 | 国产尤物在线观看 | 涩涩涩综合 | 欧美精品v国产精品v日韩精品 | 国产精品久久精品三级 | 久久国产福利 | 亚洲无限看 | 亚洲四区在线 | 免费www xxx| 少妇无码吹潮 | 蜜桃臀一区二区三区 | 久久一级电影 | 麻豆久久久| 精品久久久亚洲 | 亚洲第一精品在线观看 | 97视频精品 | 先锋影音av在线 | 经典三级第一页 | 一区二区伦理 | 青娱乐97| 国产成人小视频在线观看 | 欧美午夜性春猛交 | 亚洲国产精品成人午夜在线观看 | 亚洲综合在线第一页 | 国产激情一区二区三区在线观看 | 少妇诱惑av | 国产成人亚洲综合a∨婷婷 台湾a级片 | 欧美狠狠干| 啪啪网站免费观看 | 国产精品一区二区网站 | 欧美特级黄色片 | 丰满少妇熟乱xxxxx视频 | 日本不卡在线观看 | 国产成人精品777777 | 成人在线高清视频 | 亚洲av成人精品一区二区三区 | 日本中文字幕视频在线 | 女人久久久久 | 日韩高清中文字幕 | 久久亚洲国产精品 | 狠狠狠狠狠干 | 精品自拍第一页 | 久久国产这里只有精品 | 久久精品国产亚洲av麻豆 | 国产精品国产三级国产aⅴ原创 | 91学生片黄| 成人av一区二区三区 | 456亚洲视频 | 欧美丰满bbw | 无码一区二区三区在线 | 日韩女优中文字幕 | 91看片国产| 中文字幕在线观看 | 中文字幕精品三区 | 亚洲天堂2014 | 日韩1页 | 成人亚洲黄色 | 日韩一级免费观看 | 欧美黑人一区二区 | 亚洲成人免费网站 | 尤物在线| 凹凸av在线 | 国产黄大片在线观看画质优化 | 空姐毛片 | 亚洲爽爆 | 亚洲AV午夜福利精品一级无码 | 少妇又紧又深又湿又爽视频 | 国产天堂久久 | 麻豆视频网站在线观看 | 伊人网久久久 | 欧美大黑bbbbbbbbb在线 | 人人澡人人透人人爽 | 无遮挡黄色 | 在线免费av观看 | 日日弄天天弄美女bbbb | 亚洲一区二区三区在线播放 | 国产精品羞羞答答 | www.色人阁.com | 欧美亚韩一区二区三区 | 男女一进一出视频 | 色老头在线一区二区三区 | 一级黄色大片免费观看 | 欧美人妻少妇一区二区三区 | 正在播放一区二区 | 99国产视频在线 | 老师用丝袜脚帮我脚交 | www.chengren| 午夜一区在线观看 | 成人福利在线视频 | 日韩一区二区三 | 久久精品国产亚洲AV高清综合 | 男人天堂b | 无套暴操| 天堂在线一区二区 | 黄色网址在线免费 | 天天爱天天爽 | 欧美大片免费在线观看 |