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的网络通信相关推荐

  1. Android中基于心知天气API获取天气信息

    Android中基于心知天气获取天气信息 JSON JSON简介 JSON对象 JSON数组 JSON解析 Android中获取天气 获取天气的流程 获取心知天气的API key 获取心知天气的API ...

  2. android 网络通信方式,Android中基于TCP协议的网络通信

    一.Android网络简介 Android与服务器的通信方式主要有两种,一种是Http通信,另一种是Socket通信. HTTP通信:Android中内置HttpClient,这样可以发方便的发送Ht ...

  3. 【Android】基于Socket的即时聊天(群聊)

    近来感觉秋招无望,学习Socket的时候,便做了个基于Socket的群聊工具: 先看看最终效果吧 项目GitHub通道(详细代码请自行copy) 如何利用Socket通信 socket又称为" ...

  4. Android中通过Socket直接与RILD进行通信

    点击打开链接 1 RIL_J与RIL_C通信 上层通常要和RILD通信,是通过Socket,在RIL_JAVA层实现: 沿着这样代码流程进行Framework--native: Phone--RIL_ ...

  5. android中基于蓝牙开发的demo

    今儿闲着无聊,重新浏览android中sdk重的sample中的demo,觉的BluetoothChat写的不错,就把它搬到这里,以方便查看和学习. 主显示界面activity: /** Copyri ...

  6. Android中基于TCP协议的网络通信之使用Socket进行通信

    TCP协议被称为一种端到端的协议.这是因为它为两台计算机的连接起到了重要作用:当一台计算机需要与另一台计算机进行接连时,TCP协议会他们之间建立一个连接:用于发送和接收数据的虚拟链路. TCP协议负责 ...

  7. Android中关于Socket通信数据大小,内存缓冲区和数据可靠性的一点调查

    关于TCP和UDP Socket通信的区别: 应用场景: UDP传输协议效率高,但不可靠: TCP传输效率低,但可靠. 传输数据大小: UDP传输数据限定在64K以下: TCP传输数据无大小限制,可进 ...

  8. 多个android手机客户端通信,android中利用Socket实现手机客户端与PC端进行通信

    服务器端: import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; impo ...

  9. Android基础—基于Socket实现上传大文件

    上节中我们给大家接触了Socket的一些基本概念以及使用方法,然后写了一个小猪简易聊天室的 Demo,相信大家对Socket有了初步的掌握,本节我们来学习下使用Socket来实现大文件的断点续传! 这 ...

最新文章

  1. 【转载】python3安装scrapy之windows32位爬坑
  2. REST 在 Java 中的使用
  3. 图说开源许可协议:GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
  4. easyui 动态设置单元格控件_比Excel还简单,实现动态报表原来只需要十分钟!
  5. Hystrix在网关Zuul使用中遇到问题
  6. Akka-CQRS(2)- 安装部署cassandra cluster,ubuntu-16.04.1-LTS and MacOS mojave
  7. linux下运行springboot项目jar包
  8. 项目管理49个过程超详细总结(持续更新中)
  9. 1×pbs缓冲液配方_pbs配方_1xpbs配方_pbs缓冲液配制
  10. 新版男神女神完整投票系统源码V5.5.21版本
  11. Questa sim使用常见报错汇总
  12. Unity-Spine换装问题
  13. java声音变音代码实现_大话音频变声原理 附简单示例代码
  14. 一个古老故事--线程和线程池的故事
  15. 理解“万事万物皆对象”
  16. Qt编写安防视频监控系统49-多数据库支持
  17. OPC教程一:什么是OPC
  18. android id如何修改密码,小编教你忘记Apple ID密码怎么办?以及如何修改密码
  19. 浅谈蛇形走线怎么用,你知道吗?
  20. linux学习笔记16

热门文章

  1. Spring MVC 中使用AOP 进行事务管理--XML配置实现
  2. python核心编程——python对象
  3. C# 之 Math取整
  4. C#调用C++DLL传递结构体数组的终极解决方案
  5. 如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集
  6. error LNK2001: unresolved external symbol QtCored.lib using staic Qt lib
  7. 学点 C 语言(20): 数据类型 - 指针
  8. IOS开发基础之网易新闻UICollectionView的使用第3天
  9. 晋级赛关键一场遇到服务器中途维护,第四届全球争霸赛-大区赛常见问题说明...
  10. 鱼骨图分析法实际案例_让你头脑更精明的十种思考法:鱼骨图