當前位置:首頁 » 安卓系統 » Socket在android實現

Socket在android實現

發布時間: 2025-08-06 22:43:27

Ⅰ 我在Android開發上,想要連接socket。報錯NetworkOnMainThread這么改

耗時的子程序不許放在主線程中,你得用線程運行它。
錯誤就是你的 網路操作在主線程中;

package com.Android.tcpchat;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
//import java.text.SimpleDateFormat;
//import java.util.Date;
import java.util.Vector;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.view.Menu;
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 {

//--------Socket服務端----------------------
TextView textView1;
ServerSocket serverSocket;
Handler sHandler;
Vector<Socket> vector; // 管理客戶
//--------Socket客戶端----------------------
TextView textView2;
EditText editText1;
Button button1;
Button button2;
Socket clientSocket;
Handler cHandler;
//--------Socket服務端----------------------
Handler timer_handler;
Runnable timer_runnable;
void initTimer() // 初始定時器
{
timer_handler=new Handler();
timer_runnable=new Runnable()
{
public void run()
{ //

timer_handler.postDelayed(this,1000); // this指runnable自已,再次啟動
}
};
}
void startTimer() // 啟動定時器
{
timer_handler.post(timer_runnable); // 立即執行runnable對象
}
void closeTimer() // 關閉定時器
{
timer_handler.removeCallbacks(timer_runnable);
}
//--------------------------------------------

void dispClients()
{ //顯示所有客戶
int n=vector.size();
String ss="\n"+n+" clients:\n";
for (int i=0;i<vector.size();i++)
{
Socket sk=vector.get(i);
String ip=sk.getInetAddress().toString();
String port=""+sk.getPort();
ss+=""+ip+","+port+"\n";
}
textView1.setText(ss);
}
void writeSocket(Socket sk,String s)
{ // 向客戶端Socket發字元串
DataOutputStream outf;
try
{
outf=new DataOutputStream(sk.getOutputStream());
if (!sk.isClosed())
outf.writeUTF(s);
}
catch(Exception e)
{

}
}
void writeSock(final Socket sk,final String s)
{ // 子線程中向客戶端Socket發字元串
new Thread(new Runnable()
{
@Override
public void run()
{
writeSocket(sk,s);
}
}).start();
}
void sendAll(final String s)
{ // 向所有管理中的客戶Socket發串

for (int i=0;i<vector.size();i++)
{
Socket sk=vector.get(i);
writeSock(sk,s);
}
}

void readSocket(Socket sk)
{ // 服務端讀Socket
DataInputStream inf;
try
{
inf=new DataInputStream(sk.getInputStream());
while(sk.isConnected() && !sk.isClosed())
{
String s=inf.readUTF();
if (s.length()>0)
{ // 讀到字元串後,通知主程序處理
String ip=sk.getInetAddress().toString();
String port=""+sk.getPort();
s=ip+","+port+":"+s+"\n";
Message msg=sHandler.obtainMessage(1,s);
sHandler.sendMessage(msg);
}
}
}
catch(Exception e)
{
}
}
void readSock(final Socket sk)
{ // 子線程中讀
new Thread(new Runnable()
{
@Override
public void run()
{
readSocket(sk);
}
}).start();
}

void listen(ServerSocket ssk) // 接受多個客戶端連接請求
{
while (!ssk.isClosed())
try
{
Socket sk=ssk.accept();
vector.add(sk); // 有客戶連接
readSock(sk);
// 通知刷新客戶列表
Message msg=sHandler.obtainMessage(0,"");
sHandler.sendMessage(msg);
}
catch(Exception e)
{
}
}
void listen() // 線程接受多個客戶端連接請求
{
new Thread(new Runnable()
{
@Override
public void run()
{
listen(serverSocket);
}
}).start();
}

//------------Socket客戶端----------------------
Socket newSocket(String ip,int port)
{
Socket sk=null;
try
{
sk=new Socket(ip,port);
}
catch(Exception e)
{

}
return(sk);
}
void clientRead(Socket sk)
{ // 客戶端讀Socket
DataInputStream inf;
try
{
inf=new DataInputStream(sk.getInputStream());
while(sk.isConnected() && !sk.isClosed())
{
String s=inf.readUTF();
if (s.length()>0)
{
Message msg=cHandler.obtainMessage(2,s);
cHandler.sendMessage(msg);
}
}
}
catch(Exception e)
{

}
}
void clientRead(final String ip,final int port)
{ // 子線程中客戶端讀Socket
new Thread(new Runnable()
{
@Override
public void run()
{
Socket sk=newSocket(ip,port);
clientSocket=sk;
if (sk!=null)
clientRead(sk);
}
}).start();
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//---------------Socket服務端---------------------------------
textView1=(TextView)findViewById(R.id.textView1);
textView1.setText("");
//-----服務端的消息處理器sHandler
sHandler=new Handler()
{
@Override
public void handleMessage(Message msg)
{
switch (msg.what)
{
case 0:
dispClients(); // list clients
break;
case 1:
String s=msg.obj.toString();
sendAll(s);
break;
}
}
};
vector=new Vector<Socket>();
try
{
serverSocket=new ServerSocket(9003);
listen();
}
catch(Exception e)
{
}
//---------Socket客戶端----------------------------------
cHandler=new Handler()
{ // 客戶端消息處理器
@Override
public void handleMessage(Message msg)
{
String s=msg.obj.toString();
textView2.append(s);
}
};
clientRead("127.0.0.1",9003);
clientRead("10.0.2.15",9003);

textView2=(TextView)findViewById(R.id.textView2);
textView2.setText("");
editText1=(EditText)findViewById(R.id.editText1);
button1=(Button)findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
try
{
String s=editText1.getText().toString();
writeSock(clientSocket,s);
}
catch(Exception e)
{
}
} //public
});

button2=(Button)findViewById(R.id.button2);
button2.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
try
{
String s="中華人民共和國";
writeSock(clientSocket,s);
}
catch(Exception e)
{
}
} //public
});

}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{ // 按返回鍵的退出處理
if (keyCode == KeyEvent.KEYCODE_BACK )
{
try
{ // 防止出現埠已綁定的錯誤
serverSocket.close();
finish();
System.exit(0);
}
catch(Exception e)
{
}
}
return(false);
}

}

Ⅱ 【Android】使用BluetoothSocket實現跨設備通訊

在Android中使用BluetoothSocket實現跨設備通訊,主要步驟和要點如下

  1. 許可權申請

    • 在AndroidManifest.xml文件中申請藍牙相關的許可權,如BLUETOOTH、BLUETOOTH_ADMIN和BLUETOOTH_CONNECT。
  2. 服務端實現

    • 創建BluetoothServerSocket:使用BluetoothAdapter的方法創建一個BluetoothServerSocket實例,用於監聽客戶端的連接請求。
    • 監聽連接:調用BluetoothServerSocket的accept方法阻塞等待客戶端的連接。一旦客戶端連接,將返回一個BluetoothSocket實例。
    • 數據通信:通過返回的BluetoothSocket實例的輸入輸出流進行數據傳輸。
  3. 客戶端實現

    • 搜索設備:使用BluetoothAdapter的startDiscovery方法搜索附近的藍牙設備。搜索到的設備會通過BroadcastReceiver接收BluetoothDevice.ACTION_FOUND廣播。
    • 建立連接:通過搜索到的BluetoothDevice實例調用方法創建一個BluetoothSocket,然後調用connect方法嘗試連接服務端。
    • 數據通信:與服務端類似,通過BluetoothSocket的輸入輸出流進行數據傳輸。
  4. 項目結構與界面

    • 服務端:通常包含一個BluetoothService類來處理藍牙通信的邏輯,以及一個ChatActivity類來展示通信內容和用戶交互界面。
    • 客戶端:包含一個用於搜索設備的SearchDevices類,一個用於顯示設備列表的DeviceAdapter和對應的布局文件,以及一個MainActivity用於用戶交互和啟動連接。
  5. 通信流程

    • 客戶端搜索到服務端設備後,點擊設備進行連接。
    • 連接成功後,雙方通過BluetoothSocket的輸入輸出流進行實時通信。
    • 通信內容在各自的ChatActivity中展示。

通過上述步驟,你可以在Android設備上利用BluetoothSocket實現跨設備的藍牙通信。

Ⅲ 請問下,android能不能直接通過手機IP進行socket通信,不是局域.

可以的,只要通信的IP是通的就行了。
有兩種方案:
1、在PC機上建立伺服器,手機與手機之間的通信通過伺服器進行中轉
2、一部手機作為伺服器,另一部手機作為客戶端接入該手機
一般是第一種方案
1、pc端:
serverSocket=new ServerSocket(5648); //在5648埠進行偵聽
Socket sk = serverSocket.accept();//如果有接入,則創建對應的socket;
2、手機端:
socket=new Socket("tobacco5648.xicp.net",5648);//連接socket
3、消息輸入輸出:
pw=new PrintWriter(socket.getOutputStream()); //消息輸出
pw.println("發送消息");
pw.flush();
br=new BufferedReader(new InputStreamReader(socket.getInputStream())); //消息接收
while((str=br.readLine())!=null){
//接收消息
}

熱點內容
設計php框架 發布:2025-09-17 21:50:05 瀏覽:174
sql統計條數 發布:2025-09-17 21:49:51 瀏覽:705
javastatic和 發布:2025-09-17 21:35:35 瀏覽:362
星星演算法 發布:2025-09-17 21:34:19 瀏覽:136
杭州版式文件伺服器地址怎麼填寫 發布:2025-09-17 21:17:42 瀏覽:986
linux的dns怎麼配置 發布:2025-09-17 21:17:24 瀏覽:903
如何把安卓的軟體放到蘋果平板上 發布:2025-09-17 21:09:38 瀏覽:490
win7svn伺服器搭建 發布:2025-09-17 21:01:03 瀏覽:905
python寫shell腳本 發布:2025-09-17 20:50:22 瀏覽:807
數字存儲卡有用嗎 發布:2025-09-17 20:31:00 瀏覽:496