成人视屏在线观看-国产99精品-国产精品1区2区-欧美一级在线观看-国产一区二区日韩-色九九九

您的位置:首頁技術(shù)文章
文章詳情頁

Android中socket通信的簡單實(shí)現(xiàn)

瀏覽:120日期:2022-09-25 08:23:55

Android中socket通信簡單實(shí)現(xiàn),供大家參考,具體內(nèi)容如下

socket通信需要有一個(gè)服務(wù)器和客戶端,可以把同一個(gè)APP作為服務(wù)器跟客戶端,也可以分開成兩個(gè)APP。先上個(gè)圖:

Android中socket通信的簡單實(shí)現(xiàn)

這里以一個(gè)APP作為服務(wù)器跟客戶端為示例

1、添加網(wǎng)絡(luò)訪問權(quán)限

<uses-permission android:name='android.permission.INTERNET' />

2、寫服務(wù)器,在APP上啟動(dòng)

import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.InetAddress;import java.net.ServerSocket;import java.net.Socket;public class Server { ServerSocket serverSocket = null; public final int port = 9998; private int i = 0; public Server(){ //輸出服務(wù)器的IP地址 try { InetAddress addr = InetAddress.getLocalHost(); System.out.println('local host:'+addr); serverSocket = new ServerSocket(port); System.out.println('0k'); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void startService(){ try { Socket socket = null; System.out.println('waiting...'); //等待連接,每建立一個(gè)連接,就新建一個(gè)線程 while(true){ socket = serverSocket.accept();//等待一個(gè)客戶端的連接,在連接之前,此方法是阻塞的 System.out.println('connect to'+socket.getInetAddress()+':'+socket.getLocalPort()); new ConnectThread(socket).start(); } } catch (IOException e) { // TODO Auto-generated catch block System.out.println('IOException'); e.printStackTrace(); } } //向客戶端發(fā)送信息 class ConnectThread extends Thread{ Socket socket = null; public ConnectThread(Socket socket){ super(); this.socket = socket; } @Override public void run(){ try { DataInputStream dis = new DataInputStream(socket.getInputStream()); DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); while(true){ i++; String msgRecv = dis.readUTF(); System.out.println('msg from client:'+msgRecv); dos.writeUTF(msgRecv + i); dos.flush(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}

需要在線程中調(diào)用,調(diào)用方法:

new Thread(() -> new Server().startService()).start();

3、客戶端代碼

import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.InetAddress;import java.net.Socket;import java.net.UnknownHostException;import androidx.appcompat.app.AppCompatActivity;/** * @author fenghaitao * @time 2020年4月2日14:34:33 * scoket客戶端連接測試 */public class SocketActivity extends AppCompatActivity { //IP地址和端口號(hào) public static String IP_ADDRESS = ''; public static int PORT = 9998; //三個(gè)控件 EditText et_message = null; //需要發(fā)送的內(nèi)容 Button bt_getAdress = null; //獲取本機(jī)IP地址 Button bt_connect = null; //連接并發(fā)送 Button bt_startServer = null; //啟動(dòng)服務(wù)端 TextView tv_adress = null; //ip地址 TextView tv_reply = null; //服務(wù)器回復(fù)的消息 //handler Handler handler = null; Socket soc = null; DataOutputStream dos = null; DataInputStream dis = null; String messageRecv = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_socket); et_message = findViewById(R.id.et_message); bt_getAdress = findViewById(R.id.bt_getAdress); bt_connect = findViewById(R.id.bt_connect); bt_startServer = findViewById(R.id.bt_startServer); tv_adress = findViewById(R.id.tv_adress); tv_reply = findViewById(R.id.tv_reply); bt_getAdress.setOnClickListener(v -> { new Thread(() -> { try { InetAddress addr = InetAddress.getLocalHost(); System.out.println('local host:'+addr); runOnUiThread(() -> tv_adress.setText(addr.toString().split('/')[1])); } catch (UnknownHostException e) { e.printStackTrace(); } }).start(); }); bt_startServer.setOnClickListener(v -> { new Thread(() -> new Server().startService()).start(); Toast.makeText(SocketActivity.this,'服務(wù)已啟動(dòng)',Toast.LENGTH_SHORT).show(); }); bt_connect.setOnClickListener(v -> { IP_ADDRESS = tv_adress.getText().toString(); new ConnectionThread(et_message.getText().toString()).start(); }); handler = new Handler(msg -> { Bundle b = msg.getData(); //獲取消息中的Bundle對(duì)象 String str = b.getString('data'); //獲取鍵為data的字符串的值 tv_reply.append(str); return false; }); } //新建一個(gè)子線程,實(shí)現(xiàn)socket通信 class ConnectionThread extends Thread { String message = null; public ConnectionThread(String msg) { message = msg; } @Override public void run() { if (soc == null) { try { //Log.d('socket','new socket'); if (''.equals(IP_ADDRESS)) { return; } soc = new Socket(IP_ADDRESS, PORT); //獲取socket的輸入輸出流 dis = new DataInputStream(soc.getInputStream()); dos = new DataOutputStream(soc.getOutputStream()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } try { dos.writeUTF(message); dos.flush(); messageRecv = dis.readUTF();//如果沒有收到數(shù)據(jù),會(huì)阻塞 Message msg = new Message(); Bundle b = new Bundle(); b.putString('data', messageRecv); msg.setData(b); handler.sendMessage(msg); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}

下面是xml頁面代碼

<?xml version='1.0' encoding='utf-8'?><LinearLayout xmlns:android='http://schemas.android.com/apk/res/android' xmlns:app='http://schemas.android.com/apk/res-auto' xmlns:tools='http://schemas.android.com/tools' android:layout_width='match_parent' android:layout_height='match_parent' tools:context='.SocketActivity'> <LinearLayout android:layout_width='match_parent' android:layout_height='match_parent' android:orientation='vertical'> <LinearLayout android:layout_width='match_parent' android:layout_height='wrap_content' android:layout_marginTop='10dp'> <Button android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:text='獲取IP地址'/> <TextView android: android:layout_width='200dp' android:layout_height='match_parent' android:layout_marginLeft='15dp' android:textSize='20dp' android:gravity='center'/> </LinearLayout> <Button android: android:text='啟動(dòng)服務(wù)' android:layout_marginTop='10dp' android:layout_width='wrap_content' android:layout_height='wrap_content'/> <EditText android: android:layout_marginTop='10dp' android:hint='請(qǐng)輸入發(fā)送信息' android:layout_width='wrap_content' android:layout_height='wrap_content'/> <Button android: android:text='連接發(fā)送' android:layout_marginTop='10dp' android:layout_width='wrap_content' android:layout_height='wrap_content'/> <TextView android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:layout_marginTop='10dp' android:text='服務(wù)端返回消息:' android:textSize='30sp'/> </LinearLayout></LinearLayout>

客戶端跟服務(wù)器進(jìn)行通信之前記得先啟動(dòng)服務(wù)器,如果端口被占用需要換個(gè)端口。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 中文字幕在线观看亚洲日韩 | 精品国产乱码久久久久久一区二区 | 亚洲男女免费视频 | 日本高清视频在线观看 | 亚洲性生活视频 | 成人黄色免费看 | 欧美亚洲一区二区三区 | 香港全黄一级毛片在线播放 | 久久国产精品歌舞团 | 国产在线播放一区 | 免费观看久久 | 欧美日韩精品一区二区另类 | 日韩精品中文字幕一区三区 | 久久精品视频久久 | 国产麻豆福利a v在线播放 | 热99re久久精品精品免费 | 国产成人午夜性a一级毛片 国产成人午夜性视频影院 国产成人香蕉久久久久 | 亚洲精品天堂自在久久77 | 暖暖日本在线播放 | 特色毛片 | 国产精品夜色视频一区二区 | 怡红院老首页主页入口 | 99视频有精品 | 成人免费观看www在线 | 精品一区二区在线观看 | 亚洲美女网址 | 国产夫妇精品自在线 | 亚洲视频99 | 在线视频一区二区日韩国产 | 欧美最刺激好看的一级毛片 | 欧美一级日本一级韩国一级 | 一区二区三区视频 | 911精品国产亚洲日本美国韩国 | 看a网站| 高清偷自拍第1页 | 欧美美女网站 | 乱码在线中文字幕加勒比 | 狠狠色综合色综合网站久久 | 毛片在线高清免费观看 | 久久成人a毛片免费观看网站 | 久久午夜影视 |