1. 程式人生 > >Android 使用socket實現兩個真機之間的通訊

Android 使用socket實現兩個真機之間的通訊

1、使用Socket進行兩個手機之間的通訊需要安裝兩個不同的程式碼檔案:服務端和客戶端   分別進行安裝

2、建立區域網:兩個手機同時連一個WiFi或者兩個手機進行熱點和WLAN連線

3、客戶端連線另一個手機IP時把另一個手機的IP改成靜態IP(3的第二種方法做這個步驟)

下面上程式碼分客戶端的和服務端的,佈局檔案textview、Editview、Button不上程式碼了,不懂socket通訊原理的可以在百度百科上檢視

客戶端:

1)、MianSocketClient.java

public class MianSocketClient extends AppCompatActivity
{ private SocketClient client; private TextView txt; private EditText edit; private Button btn; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate ( savedInstanceState ); setContentView ( R.layout.activity_main ); txt=(TextView)findViewById ( R.id.textView );
edit=(EditText)findViewById ( R.id.edit ); btn=(Button)findViewById ( R.id.btn ); client=new SocketClient (); //服務端的IP地址和埠號 client.clintValue (this,"10.0.3.15" ,6666); //開啟客戶端接收訊息執行緒 client.openClientThread (); /** * 傳送訊息 * */ btn.setOnClickListener ( new View.OnClickListener ( ) { @Override
public void onClick(View v) { client.sendMsg ( edit.getText ().toString () ); } } ); /** * 接受訊息 * **/ SocketClient.mHandler=new Handler ( ){ @Override public void handleMessage(Message msg) { txt.setText ( msg.obj.toString ()); Log.i ( "msghh",msg.obj.toString ()); } }; } }
2)、SocketClient.java
public class SocketClient
{
private Socket client;
private Context context;
private int port;           //IP
private String site;            //private Thread thread;
public static Handler mHandler;
private boolean isClient=false;
private PrintWriter out;
private InputStream in;
private String str;
/**
     * @effect 開啟執行緒建立連線開啟客戶端
* */
public void openClientThread(){
thread=new Thread ( new Runnable ( )
        {
@Override
public void run()
            {
try {
/**
                     *  connect()步驟
* */
client=new Socket ( site,port );
//                    client.setSoTimeout ( 5000 );//設定超時時間
if (client!=null)
                    {
isClient=true;
forOut();
forIn ();
}else {
isClient=false;
Toast.makeText ( context,"網路連線失敗",Toast.LENGTH_LONG ).show ();
}
Log.i ( "hahah","site="+site+" ,port="+port );
}catch (UnknownHostException e) {
e.printStackTrace ();
Log.i ( "socket","6" );
}catch (IOException e) {
e.printStackTrace ();
Log.i ( "socket","7" );
}
            }
        } );
thread.start ();
}
/**
     * 呼叫時向類裡傳值
* */
public void clintValue(Context context,String site,int port)
    {
this.context=context;
this.site=site;
this.port=port;
}
/**
     * @effect 得到輸出字串
* */
public void forOut()
    {
try {
out=new PrintWriter ( client.getOutputStream () );
}catch (IOException e){
e.printStackTrace ();
Log.i ( "socket","8" );
}
    }
/**
     * @steps read();
     * @effect 得到輸入字串
* */
public void forIn(){
while (isClient) {
try {
in=client.getInputStream ();
/**得到的是16進位制數,需要進行解析*/
byte[] bt = new byte[50];
in.read ( bt );
str=new String ( bt,"UTF-8" );
} catch (IOException e) {}
if (str!=null) {
Message msg = new Message ( );
msg.obj =str ;
mHandler.sendMessage ( msg );
}
        }
    }
/**
     * @steps write();
     * @effect 傳送訊息
* */
public void sendMsg(final String str)
    {
new Thread ( new Runnable ( )
        {
@Override
public void run()
            {
if (client!=null)
                {
out.print ( str );
out.flush ();
Log.i ( "outtt",out+"" );
}else
{
isClient=false;
Toast.makeText ( context,"網路連線失敗",Toast.LENGTH_LONG ).show ();
}
            }
        } ).start ();
}
}
服務端:

1)、MianActivity.java   之前取的名字沒有改 應該改成MainSocketServer.java

public class MainActivity extends AppCompatActivity
{
private TextView txt;
private EditText edit;
private Button btn;
/**啟動服務端埠
* 服務端IP為手機IP
     * */
private SocketServer server=new SocketServer ( 6666 );
@Override
protected void onCreate(Bundle savedInstanceState)
    {
super.onCreate ( savedInstanceState );
setContentView ( R.layout.activity_main );
txt = (TextView) findViewById ( R.id.textView );
edit = (EditText) findViewById ( R.id.edit );
btn = (Button) findViewById ( R.id.btn );
/**socket服務端開始監聽*/
server.beginListen ( );
btn.setOnClickListener ( new View.OnClickListener ( )
        {
@Override
public void onClick(View v)
            {
/**socket傳送資料*/
server.sendMessage ( edit.getText ().toString () );
}
        } );
/**socket收到訊息執行緒*/
SocketServer.ServerHandler=new Handler (  ){
@Override
public void handleMessage(Message msg)
            {
txt.setText ( msg.obj.toString ());
}
        };
}
}
2)、SocketServer.java
public class SocketServer
{
private ServerSocket server;
private Socket socket;
private InputStream in;
private String str=null;
private boolean isClint=false;
public static Handler ServerHandler;
/**
     * @steps bind();繫結埠號
* @effect 初始化服務端
* @param port 埠號
* */
public SocketServer(int port){
try {
server= new ServerSocket ( port );
isClint=true;
}catch (IOException e){
e.printStackTrace ();
}
    }
/**
     * @steps listen();
     * @effect socket監聽資料
* */
public void beginListen()
    {
new Thread ( new Runnable ( )
        {
@Override
public void run()
            {
try {
/**
                     * accept();
                     * 接受請求
* */
socket=server.accept ();
try {
/**得到輸入流*/
in =socket.getInputStream();
/**
                         * 實現資料迴圈接收
* */
while (!socket.isClosed())
                        {
byte[] bt=new byte[50];
in.read ( bt );
str=new String ( bt,"UTF-8" );                  //編碼方式  解決收到資料亂碼
if (str!=null&&str!="exit")
                            {
returnMessage ( str );
}else if (str==null||str=="exit"){
break;                                     //跳出迴圈結束socket資料接收
}
System.out.println(str);
}
                    } catch (IOException e) {
e.printStackTrace ( );
socket.isClosed ();
}
                } catch (IOException e) {
e.printStackTrace ( );
socket.isClosed ();
}
            }
        } ).start ();
}
/**
     * @steps write();
     * @effect socket服務端傳送資訊
* */
public void sendMessage(final String chat)
    {
Thread thread=new Thread ( new Runnable ( )
        {
@Override
public void run()
            {
try {
PrintWriter out=new PrintWriter ( socket.getOutputStream () );
out.print ( chat );
out.flush ();
} catch (IOException e) {
e.printStackTrace ( );
}
            }
        } );
thread.start ();
}
/**
     * @steps read();
     * @effect socket服務端得到返回資料併發送到主介面
* */
public void returnMessage(String chat){
Message msg=new Message ();
msg.obj=chat;
ServerHandler.sendMessage ( msg );
}
}
這樣就完成了,如果再有疑問就問我吧  

實現了兩個真機的簡單通訊

之後動專案時候改完的新程式碼,可以兩個真機都可以裝這個一個軟體

下載地址:https://github.com/845774766/socket

相關推薦

Android 使用socket實現之間通訊

1、使用Socket進行兩個手機之間的通訊需要安裝兩個不同的程式碼檔案:服務端和客戶端   分別進行安裝 2、建立區域網:兩個手機同時連一個WiFi或者兩個手機進行熱點和WLAN連線 3、客戶端連線另一個手機IP時把另一個手機的IP改成靜態IP(3的第二種方法做這個步驟)

python實現經緯度點之間的距離和方位角

asi .net polar 經緯 div poi pytho ola 函數 from:http://blog.csdn.net/zhuqiuhui/article/details/53180395 1. 求兩個經緯點的方位角,P0(latA, lonA), P1(lat

搭建NFS服務實現臺虛擬之間共享

tab fst 共享目錄 ports def 類型 oca img 啟用 NFS網絡文件系統,實現Linux與Linux之間的簡化文件共享服務 1.創建目錄,將光盤鏡像掛載到新建目錄上 mkdir -p /media/cdrom mount -o loop /dev/cdr

Android ContentProvider實現程式間資料共享demo

1、客戶端程式碼: 先實現服務端 SQL建立: public class DBHelper extends SQLiteOpenHelper { // 資料庫名 private static final String DATABASE_NAME = "finch.db"

tcp 多路複用實現 客戶端之間通訊

/******************************* 伺服器端  ****************************/ #include <stdio.h> #include <stdlib.h> #include <neti

實現MySQL資料庫之間的主從同步_資料庫技術

www.syncnavigator.cn SyncNavigator 資料酷同步工具 做資料同步時所支援的資料庫型別: 支援sqlserver 2000-2014所有版本,全相容,和MYsql 4.x 、MYsql 5.x 、MYsql 6.x版本。 來源資料庫和目標資料庫可以版本不

jQuery實現CSS樣式之間的點選切換

指定CSS樣式之間的點選切換 jQuery實現兩個指定樣式的點選切換的效果: 程式碼如下: html程式碼: <div class="green"></div> CSS程式碼

VB中使用DDE實現應用程式之間通訊

工程:Main載入一個pictureBox,命名為picDDE載入一個commandButton,命名為cmdSendMessageOption ExplicitPrivate Sub LinkAndSendMessage(ByVal Msg As String)    Di

linux下實現執行緒之間通訊

流程圖: 用gcc編譯通過(gcc -pthread filename.c)。。。 #include<stdio.h> #include<memory.h> #include<pthread.h> int buf[

C# 進程之間通訊(管道通信 )

click 失敗 != else iss nbsp obj c# cal #region 客戶端 NamedPipeClientStream pipeClient = new NamedPipeClientStream("localhost

AIDL用法 實現APP間的通訊

AIDL是跨程序通訊的一種方法,下面我來講講它的用法: 服務專案中的配置使用: 第一步:在服務專案中建一個自定義MyService類並繼承Android的Service類,實現onBind()方法。 第二步:在AndroidManifest檔案處宣告Service,並指定一個Action用於客

Android 實現activity跳轉之間加入進度條

場景是:在activity1點選了按鈕之後跳轉到activity2,但是在點選之後,有大概六七秒的時間還停留在activity1,這樣給使用者的體驗不是很友好。 在activity1裡面: 先定義 private static ProgressDialog dia

【從頭學android】在Activity之間實現介面切換

1.java /** * */ package com.itest; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import andro

字串替換特定字元之間內容的程式碼實現

今天一個同事寫字串的替換問題,提交程式碼的實現邏輯太過麻煩,於是追問是從網上拷貝下來的,我在網上一搜,果然一大堆這種實現方法,真的是太浪費正則表示式了,拖慢速度,浪費了強大的string類。 下面寫一下我的程式碼實現,只為了讓程式碼更加簡潔: String str="local/{yyy

實現資料庫之間的資料同步

不同伺服器資料庫之間的資料操作   --建立連結伺服器  exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '遠

使用dubbo實現專案之間的簡單通訊

關於在win10上安裝的dubbo的上一篇文章已經說過了,點選跳轉 前沿:本片文章只是使用得普通專案,並沒有加入spring boot,沒有war即沒有web專案,後期測試得時候使用官方得方法載入相關得配置檔案即可! (0):測試專案結構   (1):

select實現客戶與伺服器之間通訊

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <assert.h> #include <sys/select.h> #incl

Java實現任意整數範圍之間的隨機數

要求:設計一個方法,實現求任意兩個整數範圍之間的隨機數  *核心思路: *隨機區間=(最大值 - 最小值) *區間隨機數=最小值+隨機*(隨機區間+1) *   *例如:求30~50之間的隨機數 *隨機區間= 5

C#用反射實現類的物件之間相同屬性的值的複製

在進行實體轉換操作的時候如果需要在對兩個實體之間兩個屬性欄位差不多相同的類要進行一個互相的轉換,我們要把a物件的所有欄位的值都複製給b物件,我們只能用b.屬性=a.屬性來寫,如果屬性欄位太多的話,就要寫很多行復制語句,麻煩還容易漏掉一些,這個時候可以利用c#的反射來實現複製。我們可以寫這樣一個利用泛

一、Android 實現TextView跑馬燈效果

超長的文字在有限的佈局中,實現一行迴圈顯示?如果是隻有一個TextView實現跑馬燈效果可以簡單使用以下方式來實現: <TextView android:layout_width="wrap_content" android:layout