Android-Socket连接(客户端发消息给服务端)

Demo在此

准备工作

一台手机作服务端,一台手机作客户端,两部手机连接同一个WIFI

服务端

服务端需要开启ServerSocket并监听客户端发来的信息,开启很简单,启动一个子线程

new Thread() {
    @Override
    public void run() {
        super.run();
        try {
        	// mPort指明服务端要使用的端口
            if (mServerSocket == null) mServerSocket = new ServerSocket(mPort);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}.start();

接下来就是监听客户端发来的信息,当有客户端连接成功时,服务端可以通过mServerSocket.accept()来获取客户端Socket,拿到客户端Socket时,便可以获取InputStream,读取客户端发来的消息

// 等待客户端连接
while (true) {
    try {
        if (mServerSocket != null && !mServerSocket.isClosed()) {
            mSocket = mServerSocket.accept();
        } else {
            break;
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    // 需要注意的是一个服务端可能有多个客户端连接,所以这里也需要再开启子线程
    if (mSocket != null) new ServerThread(mSocket, mHandler, mStringBuffer).start();
}

ServerThread读取消息并返回

@Override
public void run() {
    byte[] bytes = new byte[1024];
    InputStream inputStream = null;
    try {
        if (mSocket != null) {
            inputStream = mSocket.getInputStream();
            while (inputStream.read(bytes) != -1) {
                // 使用.trim()去掉空字符,不然byte[]里面会包含很多空字符
                mStringBuffer.append(new String(bytes, StandardCharsets.UTF_8).trim());
                Message msg = mHandler.obtainMessage();
                msg.what = 2;
                msg.obj = mStringBuffer;
                mHandler.sendMessage(msg);
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (inputStream != null) inputStream.close();
            if (mSocket != null) mSocket.close();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }
}

最后展示

public Handler mHandler = new Handler(new Handler.Callback() {
     @Override
     public boolean handleMessage(Message message) {
         switch (message.what) {
             case 1:
                 // Server的ip和port信息
                 mTvInfo.setText(message.obj.toString());
                 break;
             case 2:
                 // 从客户端获取到的消息
                 mTvGetData.setText(message.obj.toString());
                 mStringBuffer.setLength(0);
                 break;
         }
         return false;
     }
 });
客户端

首先连接服务端,ip和port为服务端手机当前的ip地址和开启服务的端口,连接成功后获取OutputStream就可以发送信息给服务端

Thread thread = new Thread(){
     @Override
     public void run() {
         super.run();
         if (!mIsConnected) {
             try {
                 // 连接服务端
                 mSocket = new Socket(ip, mPort);
                 if(mSocket.isConnected()){
                     mIsConnected = true;
                     mOutputStream = mSocket.getOutputStream();

                     runOnUiThread(new Runnable() {
                         @Override
                         public void run() {
                             Toast.makeText(MainActivity.this, "连接成功", Toast.LENGTH_SHORT).show();
                         }
                     });
                 }
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
     }
 };
 thread.start();

发送信息给服务端

Thread thread = new Thread(){
     @Override
     public void run() {
         super.run();
         if(mIsConnected && mOutputStream != null){
             try {
                 // 将String转换成byte[]传输数据,使用UTF-8编码,服务端也使用UTF-8转换,支持中文
                 mOutputStream.write(data.getBytes(StandardCharsets.UTF_8));

                 runOnUiThread(new Runnable() {
                     @Override
                     public void run() {
                         Toast.makeText(MainActivity.this, "发送成功", Toast.LENGTH_SHORT).show();
                     }
                 });
             } catch (IOException e) {
                 mIsConnected = false;
                 e.printStackTrace();
             }
         }
     }
 };
 thread.start();

大功告成!

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值