android使用Socket通信实现多人聊天应用

使用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();
   }
  } 

 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android仿微信语音聊天功能

    本文实例讲述了Android仿微信语音聊天功能代码.分享给大家供大家参考.具体如下: 项目效果如下: 具体代码如下: AudioManager.java package com.xuliugen.weichat; import java.io.File; import java.io.IOException; import java.util.UUID; import android.media.MediaRecorder; public class AudioManager { private

  • Android蓝牙通信聊天实现发送和接受功能

    很不错的蓝牙通信demo实现发送和接受功能,就用了两个类就实现了,具体内容如下 说下思路把 主要有两个类 主界面类 和 蓝牙聊天服务类 . 首先创建线程 实际上就是创建BluetoothChatService() (蓝牙聊天服务类) 这个时候把handler 传过去 这样就可以操作UI 界面了,在线程中不断轮询读取蓝牙消息,当主界面点击发送按钮时 调用BluetoothChatService 的发送方法write 方法,这里的write 方法 使用了handler 发送消息,在主界面显示,另一个

  • Android 应用APP加入聊天功能

    简介 自去年 LeanCloud 发布实时通信(IM)服务之后,基于用户反馈和工程师对需求的消化和对业务的提炼,上周正式发布了「实时通信 2.0 」.设计理念依然是「灵活.解耦.可组合.可定制」,具体可以参考<实时通信开发指南>,了解 LeanCloud 实时通信的基本概念和模型. 下载和安装 可以到 LeanCloud 官方下载点下载 LeanCloud IM SDK v2 版本.将下载到的 jar 包加入工程即可. 一对一的文本聊天 我们先从最简单的环节入手,看看怎么用 LeanCloud

  • Android编程实现泡泡聊天界面实例详解(附源码)

    本文实例讲述了Android编程实现泡泡聊天界面的方法.分享给大家供大家参考,具体如下: 昨天写了个界面,实现了Android泡泡聊天界面.运行结果如下,点击发送按钮,屏幕就显示Text的内容. 我也是在网上的一份源码的基础上更改的,整个泡泡界面的实现要点: (1)主界面其实就是一个List View (2)文字显示界面其实就使用了android:background="@drawable/incoming"这个东西.背景图片的格式是xxx.9.png,专门用来缩放的,不然显示效果非常

  • Android中基于XMPP协议实现IM聊天程序与多人聊天室

    简单的IM聊天程序 由于项目需要做一个基于XMPP协议的Android通讯软件.故开始研究XMPP. XMPP协议采用的是客户端-服务器架构,所有从一个客户端发到另一个客户端的消息和数据都必须经过XMPP服务器转发,而且支持服务器间DNS的路由,也就是说可以构建服务器集群,使不同的 服务器下的客户端也可以通信,XMPP的前身是一个开源组织制定的网络通信协议--Jabber,XMPP的核心是在网络上分片段发送XML流的协议,这个协议是XMPP的即时通讯指令的传递手段.       为了防止服务器间

  • android 仿微信聊天气泡效果实现思路

    微信聊天窗口的信息效果类似iphone上的短信效果,以气泡的形式展现,在Android上,实现这种效果主要用到ListView和BaseAdapter,配合布局以及相关素材,就可以自己做出这个效果,素材可以下一个微信的APK,然后把后缀名改成zip,直接解压,就可以得到微信里面的所有素材了.首先看一下我实现的效果: 以下是工程目录结构: 接下来就是如何实现这个效果的代码: main.xml,这个是主布局文件,显示listview和上下两部分内容. 复制代码 代码如下: <?xml version

  • Android高仿微信聊天界面代码分享

    微信聊天现在非常火,是因其界面漂亮吗,哈哈,也许吧.微信每条消息都带有一个气泡,非常迷人,看起来感觉实现起来非常难,其实并不难.下面小编给大家分享实现代码. 先给大家展示下实现效果图: OK,下面我们来看一下整个小项目的主体结构: 下面是Activity的代码: package com.way.demo; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import jav

  • android Socket实现简单聊天功能以及文件传输

    干程序是一件枯燥重复的事,每当感到内心浮躁的时候,我就会找小说来看.我从小就喜爱看武侠小说,一直有着武侠梦.从金庸,古龙,梁羽生系列到凤歌(昆仑),孙晓(英雄志)以及萧鼎的(诛仙)让我领略着不一样的江湖. 如果你有好看的武侠系列小说,给我留言哦.题外话就扯这么多了,接着还是上技术. 看看今天实现的功能效果图: 可以这里使用多台手机进行通讯,我采用的服务器发送消息. 是不是只有发送消息,有些显得太单调了.好,在发送消息的基础上增加文件传输.后期会增加视频,音频的传输,增加表情包.那一起来看看图文消

  • Android仿QQ、微信聊天界面长按提示框效果

    先来看看效果图 如何使用 示例代码 PromptViewHelper pvHelper = new PromptViewHelper(mActivity); pvHelper.setPromptViewManager(new ChatPromptViewManager(mActivity)); pvHelper.addPrompt(holder.itemView.findViewById(R.id.textview_content)); 使用起来还是很简单的 首先new一个PromptViewH

  • Android RichText 让Textview轻松的支持富文本(图像ImageSpan、点击效果等等类似QQ微信聊天)

    AndroidRichText帮助实现像QQ,微信一样的,一个TextView里既有文字又有表情又有图片的效果,采用插件化的框架,代码简单,可拓展性强. 基础框架包只有四个java文件, RichTextWrapper :TextView的包裹类,实现支持富文本,通过new RichTextWrapper(TextView v)来构造. RTMovementMethod: 继承自Android原生的LinkMovementMethod,重写onTouchEvent方法,优化了ClickSpan(

随机推荐