Android中基于Socket的网络通信
1. Socket介绍
2. ServerSocket的建立与使用
3. 使用ServerSocket建立聊天服务器-1
4. 使用ServerSocket建立聊天服务器-2
5. 在Android中创建Socket客户端
------------------------------------------------------------------
工程源码:SocketDemo.zip
服务器端 - Java工程:ServerSocketDemo
客户端 - Android工程:AndroidSocketClient
------------------------------------------------------------------
1. Socket介绍
Socket 又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。ServerSocket 用于服务器端,Socket 是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个 Socket 实例,操作这个实例,完成所需的会话。
对于一个网络连接来说,套接字是平等的,没有差别, 不会应用在服务器端或者客户端而产生不同级别。
不管是Socket还是ServerSocket 他们的工作都是通过Socket类及其子类完成。
* 基于TCP连接,数据传输有保障
* 适于建立长时间的连接
* 通常用于即时通信
2. ServerSocket的建立与使用
3. 使用ServerSocket建立聊天服务器-1
3.1 建立Java工程: ServerSocketDemo
* ChatSocket.java
public class ChatSocket extends Thread {Socket socket;public ChatSocket(Socket s) {socket = s;}public void out(String out) {try {socket.getOutputStream().write(out.getBytes("UTF-8"));} catch (Exception e) {e.printStackTrace();}}@Overridepublic void run() {int count = 0;while (true) {count++;out("loop : " + count + ", \t");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}
* ServerListener.java
public class ServerListener extends Thread {@Overridepublic void run() {ServerSocket serverSocket;try {serverSocket = new ServerSocket(12345);while (true) {// 监听 12345端口Socket socket = serverSocket.accept();// 建立连接JOptionPane.showMessageDialog(null,"There is an client access 12345 port");new ChatSocket(socket).start();}} catch (IOException e) {e.printStackTrace();}} }
* MyServerSocket.java
public class MyServerSocket {public static void main(String[] args) {new ServerListener().start();}}
3.2 管理员权限打开 CMD窗口: telnet localhost 12345
两个线程互补影响
4. 使用ServerSocket建立聊天服务器-2
3中的两个Client不能相互通信
所以在3的基础上修改项目:
* 新建 ChatManager.java(单例模式) 来管理Socket连接
* 修改: ServerListener.java, 来存储 所有连接 到 Server的 Socket
* 在ChatSocket线程中,增加接收消息的 代码
具体项目可以看源代码
5. 在Android中创建Socket客户端
在Android中创建Socket客户端。使用Socket建立客户端链接,并且在AsyncTask中执行网络读写的任务,将用户输入的内容发送到服务器,并接收服务器发来的数据,显示到界面上。开启多个虚拟机模拟多人聊天效果。
拿4中的Java项目作为服务器端
创建 Android客户端 项目: AndroidSocketClient
建立一个如图所示的布局:
public class MainActivity extends Activity {EditText etIP, etComposing;TextView tvContent;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);etIP = (EditText) findViewById(R.id.etIP);etComposing = (EditText) findViewById(R.id.etComposing);tvContent = (TextView) findViewById(R.id.tvContent);findViewById(R.id.btnConn).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stub connect();}});findViewById(R.id.btnSend).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stub send();}});}Socket socket = null;BufferedWriter bw;BufferedReader br;public void connect() {AsyncTask<Void, String, Void> read = new AsyncTask<Void, String, Void>() {@Overrideprotected Void doInBackground(Void... params) {try {socket = new Socket(etIP.getText().toString(), 12345);bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));br = new BufferedReader(new InputStreamReader(socket.getInputStream()));publishProgress("@success");try {String line;while ((line = br.readLine()) != null) {publishProgress(line);}} catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace();}} catch (UnknownHostException e) {// TODO Auto-generated catch blockpublishProgress("@fail");e.printStackTrace();} catch (IOException e) {publishProgress("@fail");e.printStackTrace();}return null;}@Overrideprotected void onProgressUpdate(String... values) {if (values[0].equals("@success")) {tvContent.append("Success connect to Server\n");} else if(values[0].equals("@fail")) {tvContent.append("Connect to Server Fail\n");} else{Log.d("CARLOZ", "Other: " + values[0]);tvContent.append("Other: " + values[0] + "\n");}super.onProgressUpdate(values);}};read.execute();}public void send() {try {tvContent.append("Me: " + etComposing.getText().toString() + "\n");bw.write(etComposing.getText().toString() + "\n");bw.flush();etComposing.setText("");// clear} catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace();}} }
运行效果如下,下面的弹框是Java程序的Dialog
同时开两台虚拟机的运行效果如下:
Android中基于Socket的网络通信相关推荐
- Android中基于心知天气API获取天气信息
Android中基于心知天气获取天气信息 JSON JSON简介 JSON对象 JSON数组 JSON解析 Android中获取天气 获取天气的流程 获取心知天气的API key 获取心知天气的API ...
- android 网络通信方式,Android中基于TCP协议的网络通信
一.Android网络简介 Android与服务器的通信方式主要有两种,一种是Http通信,另一种是Socket通信. HTTP通信:Android中内置HttpClient,这样可以发方便的发送Ht ...
- 【Android】基于Socket的即时聊天(群聊)
近来感觉秋招无望,学习Socket的时候,便做了个基于Socket的群聊工具: 先看看最终效果吧 项目GitHub通道(详细代码请自行copy) 如何利用Socket通信 socket又称为" ...
- Android中通过Socket直接与RILD进行通信
点击打开链接 1 RIL_J与RIL_C通信 上层通常要和RILD通信,是通过Socket,在RIL_JAVA层实现: 沿着这样代码流程进行Framework--native: Phone--RIL_ ...
- android中基于蓝牙开发的demo
今儿闲着无聊,重新浏览android中sdk重的sample中的demo,觉的BluetoothChat写的不错,就把它搬到这里,以方便查看和学习. 主显示界面activity: /** Copyri ...
- Android中基于TCP协议的网络通信之使用Socket进行通信
TCP协议被称为一种端到端的协议.这是因为它为两台计算机的连接起到了重要作用:当一台计算机需要与另一台计算机进行接连时,TCP协议会他们之间建立一个连接:用于发送和接收数据的虚拟链路. TCP协议负责 ...
- Android中关于Socket通信数据大小,内存缓冲区和数据可靠性的一点调查
关于TCP和UDP Socket通信的区别: 应用场景: UDP传输协议效率高,但不可靠: TCP传输效率低,但可靠. 传输数据大小: UDP传输数据限定在64K以下: TCP传输数据无大小限制,可进 ...
- 多个android手机客户端通信,android中利用Socket实现手机客户端与PC端进行通信
服务器端: import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; impo ...
- Android基础—基于Socket实现上传大文件
上节中我们给大家接触了Socket的一些基本概念以及使用方法,然后写了一个小猪简易聊天室的 Demo,相信大家对Socket有了初步的掌握,本节我们来学习下使用Socket来实现大文件的断点续传! 这 ...
最新文章
- 【转载】python3安装scrapy之windows32位爬坑
- REST 在 Java 中的使用
- 图说开源许可协议:GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
- easyui 动态设置单元格控件_比Excel还简单,实现动态报表原来只需要十分钟!
- Hystrix在网关Zuul使用中遇到问题
- Akka-CQRS(2)- 安装部署cassandra cluster,ubuntu-16.04.1-LTS and MacOS mojave
- linux下运行springboot项目jar包
- 项目管理49个过程超详细总结(持续更新中)
- 1×pbs缓冲液配方_pbs配方_1xpbs配方_pbs缓冲液配制
- 新版男神女神完整投票系统源码V5.5.21版本
- Questa sim使用常见报错汇总
- Unity-Spine换装问题
- java声音变音代码实现_大话音频变声原理 附简单示例代码
- 一个古老故事--线程和线程池的故事
- 理解“万事万物皆对象”
- Qt编写安防视频监控系统49-多数据库支持
- OPC教程一:什么是OPC
- android id如何修改密码,小编教你忘记Apple ID密码怎么办?以及如何修改密码
- 浅谈蛇形走线怎么用,你知道吗?
- linux学习笔记16
热门文章
- Spring MVC 中使用AOP 进行事务管理--XML配置实现
- python核心编程——python对象
- C# 之 Math取整
- C#调用C++DLL传递结构体数组的终极解决方案
- 如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集
- error LNK2001: unresolved external symbol QtCored.lib	using staic Qt lib
- 学点 C 语言(20): 数据类型 - 指针
- IOS开发基础之网易新闻UICollectionView的使用第3天
- 晋级赛关键一场遇到服务器中途维护,第四届全球争霸赛-大区赛常见问题说明...
- 鱼骨图分析法实际案例_让你头脑更精明的十种思考法:鱼骨图