Android Socket编程(tcp)初探
前言
之前一直对socket编程这块比较陌生,并且在刚开始工作的时候比较抗拒。其实,都是因为当时自己比较菜,这块比较难处理,在舒适区呆的习惯了。所以,还是应该让自己走出舒适区,多接触一些陌生的区域。
首先
在将socket编程前,先了解一下socket的知识。
TCP/IP协议
我们举个不恰当的例子:比如通过QQ和服务器进行通信,都需要哪些东西呢?
两台电脑建立连接进行通信,需要知道双方的地址(也就是IP地址);知道两台电脑的IP地址之后,我们还需要知道我发送到目标电脑的目标软件(使用端口标记)。如果两台电脑连接成功之后就可以进行通信了。
那么这些东西如何进行规定的呢,这就需要有一定的通讯协议,比如我和张三约定在西安钟楼见面,然后两个人都必须手拿一把白色茉莉花。只有当我们双方见面并且看到对方拿的是我们之前商量好的白色茉莉花才可以进行通讯。那么,这个白色茉莉花就是我们之间的约定,也就是socket中的协议。大家都使用这个协议,统一成一个规范,这样符合这个规范的各种设备之间能够进行兼容性的通信。
最为广泛的的协议就是OSI协议和TCP/IP协议了,但是OSI协议较为繁琐,未推广(想了解的自己Google)。反而TCP/IP(transfer control protocol/internet protocol,传输控制协议/网际协议)协议简单明了,得到现今的广泛使用。
其次
说了那么多的文字性描述,那么接下来看看我们的基于TCP协议的客户端和服务端实现
-
客户端图片
这里封装到了线程中,如果需要修改,那么自行修改,小可这里只是抛砖引玉,废话不说先上图
-
客户端代码(线程中)
代码中的注释比较详细,我这里就不逐一解释了public class TcpClientThread extends Thread { //IP地址 private String address; //端口 private int port; //发送内容 private String msg; private Handler mHandler; public TcpClientThread(Handler handler, String address, int port, String msg) { this.mHandler = handler; this.address = address; this.port = port; this.msg = msg; } @Override public void run() { super.run(); sendSocket(); } /** * 设置 */ private void sendSocket() { InputStreamReader reader = null; BufferedReader bufReader = null; Socket socket = null; try { //1.创建监听指定服务器地址以及指定服务器监听的端口号 //IP地址,端口号 socket = new Socket(address, port); // 2.拿到客户端的socket对象的输出流发送给服务器数据 OutputStream os = socket.getOutputStream(); //写入要发送给服务器的数据 os.write(msg.getBytes()); os.flush(); socket.shutdownOutput(); //拿到socket的输入流,这里存储的是服务器返回的数据 InputStream is = socket.getInputStream(); //解析服务器返回的数据 reader = new InputStreamReader(is); bufReader = new BufferedReader(reader); String s = null; final StringBuffer sb = new StringBuffer(); while ((s = bufReader.readLine()) != null) { sb.append(s); } sendMsg(0, sb.toString()); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { //3、关闭IO资源 try { if (bufReader != null) bufReader.close(); } catch (IOException ex) { ex.printStackTrace(); } try { if (socket != null) socket.close(); } catch (IOException ex) { ex.printStackTrace(); } } } /** * 发送消息 */ private void sendMsg(int what, Object object) { Message msg = new Message(); msg.what = what; msg.obj = object; mHandler.sendMessage(msg); } }
-
客户端(Activity中使用)
public class TcpClientActivity extends AppCompatActivity implements View.OnClickListener { EditText mEdtContent; TextView mTxtContent; Button mBtnSend; String address = "192.168.0.197"; int port = 12345; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_tcpclient); initView(); } private void initView() { mEdtContent = findViewById(R.id.edt_content); mBtnSend = findViewById(R.id.btn_send); mTxtContent = findViewById(R.id.txt_content); mBtnSend.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.btn_send: {//发送 TcpClientThread mThread = new TcpClientThread(mHandler, address, port, mEdtContent.getText().toString()); mThread.start(); break; } } } /** * Handler */ private Handler mHandler = new Handler(Looper.myLooper()) { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0: { String content= (String) msg.obj; mTxtContent.setText(content); break; } } } }; }
-
服务端(图片)
-
服务端(代码-->线程中)
public class TcpServerThread extends Thread { private Socket socket; /** * 初始化 * * @param socket */ public TcpServerThread(Socket socket) { this.socket = socket; } @Override public void run() { super.run(); InputStreamReader reader = null; BufferedReader bufReader = null; OutputStream os = null; try { reader = new InputStreamReader(socket.getInputStream()); bufReader = new BufferedReader(reader); String s = null; StringBuffer sb = new StringBuffer(); while ((s = bufReader.readLine()) != null) { sb.append(s); } System.out.println("服务器:" + sb.toString()); // 关闭输入流 socket.shutdownInput(); // 返回给客户端数据 os = socket.getOutputStream(); os.write(("我是服务端,客户端发给我的数据就是:" + sb.toString()).getBytes()); os.flush(); socket.shutdownOutput(); } catch (IOException e2) { e2.printStackTrace(); } finally {// 关闭IO资源 if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } if (bufReader != null) { try { bufReader.close(); } catch (IOException e) { e.printStackTrace(); } } if (os != null) { try { os.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
-
服务端(调用)
public class TcpServer { /** * @param args */ public static void main(String[] args) { try { @SuppressWarnings("resource") ServerSocket serverSocket = new ServerSocket(12345); while (true) { System.out.println("Server开始~~~监听~~~"); // accept方法会阻塞,直到有客户端与之建立连接 Socket socket = serverSocket.accept(); TcpServerThread serverThread = new TcpServerThread(socket); serverThread.start(); } } catch (IOException e) { e.printStackTrace(); } } }
说明
这里用了一个while循环,然后就可以无限接收客户端发送的数据,如果把while中的条件改成你需要的,就会实现你所需要的东西。
最后
刚开始写的时候自己也是一脸懵逼,克服了重重困难才做了出来,当然这种也不是最终的,没有加入自己的协议。需要根据自己的实际需求做出来,然后改成自己的需要的东西。
致谢
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
weex 一个传说级巨坑-- 2018最新版weex踩坑指南(weex navigator 多界面跳转)
先说结论,本人极度非常 不推荐weex作为任何商用开发 有很多人会说了... 你瞎扯.. 你看别人阿里.. 啊飞猪... 啊那个支付宝... 人家不是用得好好的么... 当然这也是我们公司作为技术选型的考量.. 三端通用.. 阿里系的app全线在用.. 理论上是可以实现的.. 而且我们在编码过程中.. 可以把IOS工程师,安卓工程师和前端工程师以及部分熟悉一点前端的后端工程师都拉过来贡献一套代码.. 代码质量可以得到保障 现在想想只能说... 太天真了... 你也不想想人家阿里有多少大牛有多少人在做这个项目.. 再说淘宝都卡成啥样了大家还是愿意用.. 如果你的项目这样卡两下你的app是否还能像淘宝那样拉住顾客?? 这就像你说你想写一篇巨著... 你打算用英文写... 翻译成中文 俄文 日文(ios android web)... 让人看了还能把别人国家的感动得稀里哗啦的.. 本身难度就会不小.. 另外你在android中打开布局边界看一下天猫飞猪... 里面weex的界面已经只剩下很少的界面了.. 很多界面已经替换成了原生或者webview的混合界面... 做得那么杂用户体验还过得去....
- 下一篇
Android Socket编程(udp)初探
前言 昨天刚把socket tcp编程简单讲解了,今天趁热打铁把udp编程也讲一下。一个是为了提醒自己,坚持下去,另外还是为了提升技术打下基础。如果讲的有什么不对的还请各位指正。 首先 先上图,俗话说no pic say a xx udp编程服务端.png udp编程客户端.png 其次 客户端代码(线程中) public class UdpClientThread extends Thread { //IP地址 private String mAddress; //端口 private int port; //发送内容 private String msg; private Handler mHandler; public UdpClientThread(Handler handler, String address, int port, String msg) { this.mHandler = handler; this.mAddress = address; this.port = port; this.msg = msg; } @Override public void ru...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS6,CentOS7官方镜像安装Oracle11G
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS8编译安装MySQL8.0.19