Android中如何实现Socket通信
发表于:2024-10-23 作者:千家信息网编辑
千家信息网最后更新 2024年10月23日,小编给大家分享一下Android中如何实现Socket通信,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!公司要实现一个简单
千家信息网最后更新 2024年10月23日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安全错误
数据库的锁怎样保障安全
武科大有软件开发培训机构吗
魔兽世界自己角色找不到服务器了
自考数据库技术课后答案
网络安全素材库
sip位置服务器
青岛电脑软件开发哪家好
高效的数据库管理方法
日本影视数据库
阿里云 dns服务器地址
服务器安全威胁主要有哪些
松江区银联数据库价格查询
软件开发师工作有配电脑吗
站长之家怎么查服务器信息
spoon数据库连接错误
数据库sa2000默认密码
vfp中数据库最大记录数
服务器本地安全在哪里
mysql连接服务器失败
卫健委健康码软件开发商
品牌云服务器代理项目
数据库db文件怎么损坏
网络技术与应用学科排名
服务器托管哪里最好
中国安徽统计年鉴数据库
全国少儿网络安全教育平台
福建戴尔服务器维修调试多少钱
网络如何连接到服务器上
沈阳高性能服务器
存储服务器融资
杨卿网络安全攻防