android使用Socket通信实现多人聊天应用
作者:其实我叫孟小贤 发布时间:2023-07-08 02:43:37
使用Socket实现多人聊天应用,供大家参考,具体内容如下
在讲scoket通信器先可以先了解一下网络协议
手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。可以将网络协议分为四层,从高到低依次为:应用层、传输层、网络层、链路层。
两种Socket类型的基本通信
TCP是一个可靠的、面向连接的协议。它可以保证数据从连接的一方传递到另一方,并且发送数据的顺序和所接收数据的顺序一致。当应用程序需要一个可靠的、点对点的连接时,可以使用TCP。
UDP是一种不可靠的通信协议,没有检测错误的机制,也不重发丢失的数据。接收到的数据包的顺序可能与发送的数据包的顺序不一致。采用UDP进行通信时,事先不需要建立连接。而采用TCP进行通信时,首先要建立一个连接。TCP的通信质量比UDP高,UDP的开销比TCP小。
这里我们以TCP协议为主
其实android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信。两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据。而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求。 那么,什么是socket?Socket又称套接字,在程序内部提供了与外界通信的端口,即端口通信。通过建立socket连接,可为通信双方的数据传输传提供通道。socket的主要特点有数据丢失率低,使用简单且易于移植。
Socket套接字概念
套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。
先看一下TCP通信的步骤:
建立Socket连接
• 连接过程分为三个步骤:
–服务端监听
–客户端请求
–连接确认
(多线程机制,各个客户端和服务器之间的通信)
–服务端:ServerSocket
–客户端:Socket
–信息传输:
• 发送信息getoutputsream() write();
• 接收信息getinputstream() read();
案例:
使用TCP协议通信
java服务端,此时是使用java做服务端
ScoketDemo .java
package scoket.activity;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class ScoketDemo {
public static List<Socket> clients = new ArrayList<Socket>();// 创建一个集合存放所有的客户端
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
ServerSocket ss;
while (true) {
ss = new ServerSocket(2019);
Socket s = ss.accept();// 使服务端处于监听状态
clients.add(s);
// 为每一个客户端开设一个单个线程
new ChatThread(s).start();
// OutputStream os=client.getOutputStream();
// os.write("Nice to meet you!".getBytes("utf-8"));
// os.close();//网络编程流的关闭是按栈的方式关闭的
// client.close();
}
// No enclosing instance of type ScoketDemo is accessible. Must qualify
// the allocation
// with an enclosing instance of type
// ScoketDemo (e.g. x.new A() where x is an instance of ScoketDemo).
}
public static class ChatThread extends Thread {
Socket client;
BufferedReader br;
public ChatThread(Socket c) {
super();
this.client = c;
try {
br = new BufferedReader(new InputStreamReader(
client.getInputStream(), "UTF-8"));// 将客户端对象封装一下
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
String content = null;
// 获取客户端传递过来的数据
try {
while ((content = br.readLine()) != null) {
// 再将服务端的数据返回给客户端
OutputStream os = client.getOutputStream();
os.write(content.getBytes("utf-8"));
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
android客户端
ChatScoketDemoActivity.java
package com.scoket.activity;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class ChatScoketDemoActivity extends Activity implements OnClickListener {
/** Called when the activity is first created. */
private EditText name, setence, show;
private Button btn;
Socket client;
Handler myHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
if (msg.what==123) {
String str = show.getText().toString();
show.setText(str +"\n"+ msg.getData().getString("chat"));
}
};
};
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button) findViewById(R.id.button1);
name = (EditText) findViewById(R.id.name);
setence = (EditText) findViewById(R.id.setence);
show = (EditText) findViewById(R.id.show);
btn.setOnClickListener(this);
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
client = new Socket("172.20.52.26", 2019);// 网络访问最好放在线程中
new chatThread(client).start();// 启动子线程
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
String s1 = name.getText().toString();
String s2 = setence.getText().toString();
String s3 = s1 + ":" + s2+"\n";
if (client != null) {
try {
client.getOutputStream().write(s3.getBytes("utf-8"));// 获取从客户端得到的数据
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} //setence.setText("");//相当于刷新
}
class chatThread extends Thread {
Socket s;
public chatThread(Socket s) {
super();
this.s = s;
}
@Override
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
while (true) {
String content = br.readLine();
if (content != null) {
Bundle bundle = new Bundle();
bundle.putString("chat", content);
Message msg = new Message();
msg.setData(bundle);
msg.what=123;
myHandler.sendMessage(msg);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
来源:https://blog.csdn.net/mxcsdn/article/details/51495825


猜你喜欢
- 大家好,今天尝试用swing技术写一个贪吃蛇大作战小游戏,供大家参考。 效果展示效果展示一、游戏界面二、得分情况&nb
- 先给大家看下效果图:MenuPopwindow:package com.cloudeye.android.cloudeye.view;imp
- 队列在编程语言中是如何定义的呢?小编与大家分享自己的经验。队列的定义队列是限制结点插入操作固定在一端进行,而结点的删除操作固定在另一端进行的
- 本文实例为大家分享了Java实现斗地主的具体代码,供大家参考,具体内容如下import java.util.ArrayList;import
- 一、建数据库和表1.数据库demo1放一张user表SET FOREIGN_KEY_CHECKS=0;-- ----------------
- 0-1背包的问题背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重
- LRU简介LRU是Least Recently Used 近期最少使用算法,它就可以将长时间没有被利用的数据进行删除。实现最近面了阿里的外包
- 1.要求输入10个整数,从大到小排序输出输入:2 0 3 -4 8 9 5 1 7 6输出:9 8 7 6 5 3 2 1 0 -4解决方法
- C# windows语音识别与朗读示例,供大家参考,具体内容如下本示例通过windows语音识别功能进行语音识别和文本朗读。打开window
- 1.给定时间戳返回指定的时间格式private string StampToDate(string timeStamp,string for
- 现在的项目基本上都是java web项目,所以导入jar包会出现问题,主要介绍一下java项目与javaweb项目的区别:java项目:在c
- 我们在编写Web应用时,经常需要对页面做一些安全控制,比如:对于没有访问权限的用户需要转到登录表单页面。要实现访问控制的方法多种多样,可以通
- 实例如下:static bool CheckPowerOfTwo(ulong num){ return num > 0 &
- 一、安装JDK1.卸载旧版本或者系统自带的JDK(1)列出所有已安装的JDKrpm -qa | grep jdk(2)卸载不需要的JDKyu
- Android的布局管理器本身就是个UI组件,所有的布局管理器都是ViewGroup的子类,而ViewGroup是View的子类,所以布局管
- 这篇文章主要介绍了Java流程控制顺序结构原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可
- 本文实例为大家分享了java基于UDP实现在线聊天的具体代码,供大家参考,具体内容如下效果图:一、学习UDP的简单使用步骤接收端:Datag
- /// <summary> /// 为图片生成缩略图 /// </summ
- 先来看看网易云APP的效果:前言关于网易云音乐推荐歌单界面的实现一、实现1.自定义一个圆角图片控件(也可直接使用第三方框架)由于是一些简单的
- 需求在前面的文章里使用.NET 6开发TodoList应用之领域实体创建原理和思路,我们留了一个坑还没有填上,就是在数据库保存的时