Android基于TCP的局域网聊天通信
概述
详细
一、准备工作
开发环境
jdk1.8
Eclipse Luna Service Release 1 (4.4.1)
运行环境:
华为荣耀6(Android4.4)、华为p9(Android7.0)
实现功能:同一局域网下,两台设备进行tcp通信聊天。
详情请参考博客:http://blog.csdn.net/VNanyesheshou/article/details/74896575
二、程序实现
工程截图:
2、实现思路
Android在包Java.NET包下提供了ServerSocket和Socket类,ServerSocket用于创建服务器的Socket。Socket用于实例化客户端的Socket。当连接成功,客户端和服务端都会产生一个Socket实例,通过此Socket进行通信。
3、具体代码
服务端
服务端ServerSocket的构造方法有以下几种:
ServerSocket ():构造一个新的未绑定的ServerSocket。
ServerSocket (int port):构造一个新的ServerSocket并绑定到指定端口,如果port等于0,则端口由系统自动分配。
ServerSocket (int port, int backlog):构造一个新的ServerSocket并绑定到指定端口,并指定进入队列的数目。如果port等于0,则端口由系统自动分配。
ServerSocket (int port, int backlog, InetAddress localAddress):构造一个新的ServerSocket并绑定到指定端口和指定的地址,并指定进入队列的数目。如果port等于0,则端口由系统自动分配。如果localAddress为null,则可以使用任意地址。
1 开启服务
try { //开启服务、指定端口号
ServerSocket mServerSocket = new ServerSocket(5566);
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(this, "服务开启失败", Toast.LENGTH_SHORT).show(); return;
}
2调用ServerSocket的accept(),监听连接请求,如果客户端请求连接,则接收连接,返回Scoekt对象。
Socket mSocket = mServerSocket.accept();
3 调用Socket类的getInputStream()和getOutputStream()获取输入输出流。
//获取输入流
mInStream = mSocket.getInputStream();
//获取输出流
mOutStream = mSocket.getOutputStream();
步骤4:开始发送、接收数据。
try { //发送
mOutStream.write(msg.getBytes());
mOutStream.flush();
}catch (Exception e) {
e.printStackTrace();
} byte[] buffer = new byte[1024];
//循环执行read,用来接收数据。
//数据存在buffer中,count为读取到的数据长度。
int count = mInStream.read(buffer);
步骤5:服务不再需要,则关闭服务
if(mServerSocket != null){
try {
mServerSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
客户端
TCP客户端工作具体步骤:
步骤1:创建一个Socket,连接到服务器端、指定端口号。放在子线程中运行,否则会有问题。
class SocketConnectThread extends Thread{
public void run(){ try { //指定ip地址和端口号
mSocket = new Socket(mIpAddress,mClientPort); if(mSocket != null){ //获取输出流、输入流
mOutStream = mSocket.getOutputStream();
mInStream = mSocket.getInputStream();
}
} catch (Exception e) {
e.printStackTrace();
mHandler.sendEmptyMessage(MSG_SOCKET_CONNECTFAIL); return;
}
Log.i(TAG,"connect success");
mHandler.sendEmptyMessage(MSG_SOCKET_CONNECT);
} }
步骤2:调用Socket类的getInputStream()和getOutputStream()获取输入输出流。
具体代码如上所示。
步骤3:发送、接收数据。(发送接收数据与服务端方法相同。)
发送数据:
private void writeMsg(String msg){ if(msg.length() == 0 || mOutStream == null) return; try { //发送
mOutStream.write(msg.getBytes());
mOutStream.flush();
}catch (Exception e) {
e.printStackTrace();
}
}
接收数据:(从输入流读取数据,需要在一个子线程中循环运行下面的方法。)
byte[] buffer = new byte[1024];//循环执行read,用来接收数据。//数据存在buffer中,count为读取到的数据长度。int count = mInStream.read(buffer);
步骤4:关闭Socket
public void closeConnection(){
try {
if (mOutStream != null) {
mOutStream.close(); //关闭输出流
mOutStream = null;
}
if (mInStream != null) {
mInStream.close(); //关闭输入流
mInStream = null;
}
if(mSocket != null){
mSocket.close(); //关闭socket
mSocket = null;
}
} catch (IOException e) {
e.printStackTrace();
}
if(mReceiveThread != null){
mReceiveThread.threadExit();
mReceiveThread = null;
}
}
在清单文件中添加权限
AndroidManifest.xml 文件
<uses-permission android:name="android.permission.INTERNET"/>
TCP通信的使用基本就完成了,最后看一下图片,更容易理解其通信机制。
三、运行效果
运行:
选择作为客户端还是服务端
作为服务端如下:(服务端设置监听的端口号)
作为客户端如下:(客户端要设置连接的服务端的ip地址,及端口号)
四、其他补充
参考文章:http://blog.csdn.net/VNanyesheshou/article/details/74896575
注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权
Android基于TCP的局域网聊天通信的更多相关文章
- Android基于UDP的局域网聊天通信
代码地址如下:http://www.demodashi.com/demo/12057.html 记得把这几点描述好咯:代码实现过程 + 项目文件结构截图 + 演示效果 1. 开发环境 1.1 开发工具 ...
- Python网络编程03 /缓存区、基于TCP的socket循环通信、执行远程命令、socketserver通信
Python网络编程03 /缓存区.基于TCP的socket循环通信.执行远程命令.socketserver通信 目录 Python网络编程03 /缓存区.基于TCP的socket循环通信.执行远程命 ...
- Java Socket实现基于TCP和UDP多线程通信
一.通过Socket实现TCP编程 1.1 TCP编程 TCP协议是面向连接,可靠的,有序的,以字节流的方式发送数据.基于TCP协议实现网络通信的类有客户端的Socket类和服务器端的ServerSo ...
- 基于TCP协议的聊天室控制台版
我之前写过一篇博客,主要是基于TCP协议实现的聊天室swing版,在此再写一个基于TCP协议实现的聊天室控制台版,便于学习和比较. package 聊天室console版.utils; import ...
- 浅析C#基于TCP协议的SCOKET通信
TCP协议是一个基本的网络协议,基本上所有的网络服务都是基于TCP协议的,如HTTP,FTP等等,所以要了解网络编程就必须了解基于TCP协议的编程.然而TCP协议是一个庞杂的体系,要彻底的弄清楚它的实 ...
- Android 基于TCP多线程通信实现群聊天的功能
1.TCP多线程原理图 2.实现方法 (1)服务器端 (2)客户端 3.java后台代码 主界面 package com.lucky.test50socket2; import android.ann ...
- python 30 基于TCP协议的socket通信
目录 1. 单对单循环通信 2. 循环连接通信:可连接多个客户端 3. 执行远程命令 4. 粘包现象 4.1 socket缓冲区 4.2 出现粘包的情况: 4.3 解决粘包现象 bytes 1. 单对 ...
- 基于TCP协议的socket通信
一.服务器端 1.创建serverSocket,即服务器端的socket,绑定指定的端口,并侦听此端口 ServerSocket server = new ServerSocket(8888); 2. ...
- IOS 基于TCP的socket通信详解(原创)
最近在整理通信层相关知识,这篇文章是边整理边写的,有些地方可能不够准确,还请各位路过的大牛专家指出来.这次整理的socket通信是基于TCP的,实现方式是GCD形式,以下记录的都是些理论知识,方便自己 ...
随机推荐
- .Net异步编程 z
1. 引言 最近在学习Abp框架,发现Abp框架的很多Api都提供了同步异步两种写法.异步编程说起来,大家可能都会说异步编程性能好.但好在哪里,引入了什么问题,以及如何使用,想必也未必能答的上来. 自 ...
- python笔记32-ddt框架优化(生成html报告注释内容传变量)
前言 至于什么是ddt这个可以参考我之前写的博客内容,使用ddt框架的时候,有个问题困扰我很久了,一直没得到解决(也有很大小伙伴问过我,没解决抱歉了!) 这个问题就是:如何使用ddt框架时,生成的ht ...
- python笔记30-docstring注释添加变量
前言 python里面添加字符串注释非常简单,如何将变量放入 python 的函数注释里面呢? docstring也就是给代码加注释的内容了,python可以给函数,类.方法,模块添加注释内容,注释标 ...
- 《Windows核心编程》第八章——用户模式下的线程同步
下面起了两个线程,每个对一个全局变量加500次,不假思索进行回答,会认为最后这个全局变量的值会是1000,然而事实并不是这样: #include<iostream> #include &l ...
- Linux学习杂记
近期一口气看完了韩顺平老师讲的Linux视频教程,自己也在学习的过程中做了些笔记,记载例如以下.希望帮助到一些喜欢研究Linux的同学.也算是在云端备份一下笔记吧.以免电脑出现不可控的因素而遗失自己的 ...
- C++11学习
转自: https://www.cnblogs.com/llguanli/p/8732481.html Boost教程: http://zh.highscore.de/cpp/boost/ 本章目的: ...
- 如何强制使用某一大小的包去ping某个IP地址?
测试MTU的时候用得到的, 命令如下: ping -f -l 9000 10.110.68.40 ping命令的帮助输出如下: C:\Users\administrator>ping /? Us ...
- Search a 2D Matrix leetcode java
题目: Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the f ...
- 分解大量switch-case分支的两种方法
项目经过长期多人的维护,所谓人多手杂,出现不少过多过长的switch-case分支,或者多重switch-case嵌套.每每添加功能,我都会紧皱眉头,然后带着罪恶感向已经成百上千行的函数里再添上一个c ...
- 敏捷方法之极限编程(XP)和 Scrum区别
敏捷(Agile)作为一种开发流程, 目前为各大公司所采用, 敏捷流程的具体实践有XP 和Scrum, 似乎很少有文章介绍这两者的区别, 发现一篇外文, 见解非常深刻, 特将其翻译一把. 原文(DIF ...