当前位置:首页 » 安卓系统 » 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){
//接收消息
}

热点内容
Linux调度器 发布:2025-09-18 00:01:50 浏览:274
php斜杠被转义 发布:2025-09-17 23:56:28 浏览:783
apk如何防止反编译 发布:2025-09-17 23:53:43 浏览:356
4u服务器搭建 发布:2025-09-17 23:52:41 浏览:485
笔记本电脑刚到怎么检查配置 发布:2025-09-17 23:45:44 浏览:903
c语言编小游戏 发布:2025-09-17 23:33:46 浏览:407
法哪科编程 发布:2025-09-17 23:20:03 浏览:570
摩斯密码怎么敲汉字 发布:2025-09-17 23:11:05 浏览:362
标记c语言 发布:2025-09-17 22:28:38 浏览:593
编译原理语义检查 发布:2025-09-17 22:26:07 浏览:662