Android中如何实现Socket通信
发表于:2025-11-15 作者:千家信息网编辑
千家信息网最后更新 2025年11月15日,小编给大家分享一下Android中如何实现Socket通信,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!公司要实现一个简单
千家信息网最后更新 2025年11月15日Android中如何实现Socket通信
小编给大家分享一下Android中如何实现Socket通信,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
公司要实现一个简单的聊天功能,提前研究一下Socket通信,而公司的服务端功能又没有实现,所以这里就把服务端的功能放到一个界面实现了。
直接上代码:
主要代码:
package com.app.socketdemo; import android.annotation.SuppressLint;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.text.Html;import android.text.TextUtils;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.ScrollView;import android.widget.TextView;import android.widget.Toast; import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.InetAddress;import java.net.ServerSocket;import java.net.Socket; import androidx.appcompat.app.AppCompatActivity;import butterknife.BindView;import butterknife.ButterKnife;import butterknife.OnClick; public class MainActivity extends AppCompatActivity { @BindView(R.id.et_ip) EditText etIp; @BindView(R.id.btn_connect) Button btnConnect; @BindView(R.id.tv_receive) TextView tvReceive; @BindView(R.id.tv_content) TextView tvContent; @BindView(R.id.et_input) EditText etInput; @BindView(R.id.btn_send) Button btnSend; @BindView(R.id.sv_content) ScrollView svContent; @BindView(R.id.btn_service) Button btnService; private StringBuffer strMsg = new StringBuffer(); private final int MESSAGE_ERROR = 0; private final int MESSAGE_SUCCEED = 1; private final int MESSAGE_RECEIVE = 2; private Socket sock; private OutputStream outx; private InputStream inx; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); //启动服务端 new Thread(() -> new Server().startService()).start(); } @OnClick({R.id.btn_connect, R.id.btn_service, R.id.btn_send}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.btn_connect://连接服务端 String strip = etIp.getText().toString().trim(); if (strip.indexOf(":") >= 0) { //启动连接 new Socket_thread(strip).start(); } break; case R.id.btn_service: if (!TextUtils.isEmpty(etInput.getText().toString())) { sendString("服务端:" + etInput.getText().toString().trim()); etInput.setText(""); } else { Toast.makeText(this, "输入不可为空", Toast.LENGTH_SHORT).show(); } break; case R.id.btn_send: if (!TextUtils.isEmpty(etInput.getText().toString())) { sendStrSocket("客户端:" + etInput.getText().toString().trim()); etInput.setText(""); } else { Toast.makeText(this, "输入不可为空", Toast.LENGTH_SHORT).show(); } break; } } /** * 连接服务器 */ class Socket_thread extends Thread { private String IP = "";//ip地址 private int PORT = 0;//端口号 public Socket_thread(String strip) { //如: 127.0.0.1:8081 String[] stripx = strip.split(":"); this.IP = stripx[0]; this.PORT = Integer.parseInt(stripx[1]); } @Override public void run() { try { disSocket(); //连接服务器,此处会一直处于阻塞,直到连接成功 sock = new Socket(this.IP, this.PORT); //阻塞停止,表示连接成功 setMessage("连接成功", MESSAGE_SUCCEED); } catch (Exception e) { setMessage("连接服务器时异常", MESSAGE_ERROR); e.printStackTrace(); return; } try { //获取到输入输出流 outx = sock.getOutputStream(); inx = sock.getInputStream(); } catch (Exception e) { setMessage("获取输入输出流异常", MESSAGE_ERROR); e.printStackTrace(); return; } new Inx().start(); } } /** * 循环接收数据 */ class Inx extends Thread { @Override public void run() { while (true) { byte[] bu = new byte[1024]; try { int conut = inx.read(bu);//设备重启,异常 将会一直停留在这 if (conut == -1) { setMessage("服务器断开", MESSAGE_ERROR); disSocket(); return; } String strread = new String(bu, "GBK").trim(); setMessage(strread, MESSAGE_RECEIVE); } catch (IOException e) { System.out.println(e); } } } } /** * 断开连接 */ private void disSocket() { if (sock != null) { try { outx.close(); inx.close(); sock.close(); sock = null; } catch (Exception e) { setMessage("断开连接时发生错误", MESSAGE_ERROR); } } } @SuppressLint("HandlerLeak") private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.arg1) { case MESSAGE_ERROR: disSocket(); strMsg.append(msg.obj + "
"); tvContent.setText(Html.fromHtml(strMsg.toString())); break; case MESSAGE_SUCCEED: strMsg.append(msg.obj + "
"); tvContent.setText(Html.fromHtml(strMsg.toString())); break; case MESSAGE_RECEIVE: //收到数据 strMsg.append(msg.obj); if (!strMsg.toString().substring(strMsg.length() - 4, strMsg.length()).equals("
")) { strMsg.append("
"); } tvContent.setText(Html.fromHtml(strMsg.toString())); svContent.fullScroll(ScrollView.FOCUS_DOWN); break; default: break; } } }; /** * 发送消息 */ private void sendStrSocket(final String senddata) { new Thread(new Runnable() { @Override public void run() { try { String str = "" + senddata + ""; outx.write(str.getBytes("gbk"));//"utf-8" } catch (Exception e) { setMessage("数据发送异常", MESSAGE_ERROR); } } }).start(); } /** * 消息处理 */ private void setMessage(String obj, int arg1){ Message message = new Message(); message.arg1 = arg1; message.obj = obj; handler.sendMessage(message); } /*************************************************************服务端(用于测试)**********************************************************************/ private String msg = ""; public class Server { ServerSocket serverSocket = null; public final int port = 8081; public Server() { //输出服务器的IP地址 try { InetAddress addr = InetAddress.getLocalHost(); serverSocket = new ServerSocket(port); } catch (IOException e) { e.printStackTrace(); } } public void startService() { try { while (true) { Socket socket = null; socket = serverSocket.accept();//等待一个客户端的连接,在连接之前,此方法是阻塞的 new ConnectThread(socket).start(); new ConnectThread1(socket).start(); } } catch (IOException e) { e.printStackTrace(); } } /** * 向客户端发送信息 */ class ConnectThread extends Thread { Socket socket = null; public ConnectThread(Socket socket) { super(); this.socket = socket; } @Override public void run() { try { DataOutputStream out = new DataOutputStream(socket.getOutputStream()); while (true) { Thread.sleep(1000); if (!TextUtils.isEmpty(msg)) { String str = "" + msg + ""; out.write(str.getBytes("gbk")); out.flush(); msg = ""; } } } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } } /** * 接收客户端信息 */ class ConnectThread1 extends Thread { Socket socket = null; public ConnectThread1(Socket socket) { super(); this.socket = socket; } @Override public void run() { try { DataInputStream inp = new DataInputStream(socket.getInputStream()); while (true) { byte[] bu = new byte[1024]; int conut = inp.read(bu);//设备重启,异常 将会一直停留在这 if (conut == -1) { setMessage("服务器断开", MESSAGE_ERROR); return; } String strread = new String(bu, "GBK").trim(); setMessage(strread, MESSAGE_RECEIVE); } } catch (IOException e) { e.printStackTrace(); } } } } private void sendString(String str) { msg = str; }}运行效果:
以上是"Android中如何实现Socket通信"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
服务
服务器
客户
输入
通信
成功
功能
客户端
数据
篇文章
输出
阻塞
代码
信息
公司
内容
地址
消息
端的
设备
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
智能网络技术有限公司
eval造成网络安全问题
google自用标签服务器
网络安全与信息技术协会
慧诚子墨软件开发公司
42个数据库教程
软件开发中的cpk
鼎捷软件开发岗
面向数据库入侵检测系统
巨杉数据库多租户能力
软件开发发展前景的专业要求
实况21ps4无法连接服务器
数据库外界访问
数据对比用什么数据库
深圳电脑软件开发微信qq
对网络安全管理的形容
软件开发的具体标准
互联网数据库第一章题目
服务器网络地址转换
服务器cpu可以在主板上用吗
上海环境监测软件开发报价
软件开发增值税率是多少钱
元宇宙软件开发
16赛季卡数据库
软件开发招标方案范本
敏捷软件开发工程师麦克
工业无线传感器网络技术
实体建模软件开发
琼中陌瞻网络技术有限公司
网络安全存在风险是怎么回事