Android实现简单C/S聊天室应用

Android的网络应用:简单的C/S聊天室,供大家参考,具体内容如下

服务器端:提供两个类

创建ServerSocket监听的主类:MyServer.java

负责处理每个Socket通信的线程类:ServerThread.java

客户端:是一个Android应用程序

==>MultiThreadClient

界面提供两个文本框和一个发送按钮

Activity通过Handler来处理来自子线程的消息

客户端需要一个子线程负责读取来自网络的数据

项目效果:

服务器端代码:

MyServer.java

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class MyServer
{
 //定义保存所有Socket的ArrayList
 public static ArrayList<Socket> socketList
 = new ArrayList<Socket>();
  public static void main(String[] args)
 throws IOException
  {
    ServerSocket ss = new ServerSocket(8000);
 while(true)
 {
  //此行代码会阻塞,将一直等待别人的连接
  Socket s = ss.accept();
  socketList.add(s);
  //每当客户端连接后启动一条ServerThread线程为该客户端服务
  new Thread(new ServerThread(s)).start();
}

ServerThrad.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;

//负责处理每个线程通信的线程类
public class ServerThread implements Runnable
{
 //定义当前线程所处理的Socket
 Socket s = null;
 //该线程所处理的Socket所对应的输入流
 BufferedReader br = null;
 public ServerThread(Socket s)
 throws IOException
 {
 this.s = s;
 //初始化该Socket对应的输入流
 br = new BufferedReader(new InputStreamReader(
  s.getInputStream() , "utf-8"));  //②
 }
 public void run()
 {
 try
 {
  String content = null;
  //采用循环不断从Socket中读取客户端发送过来的数据
  while ((content = readFromClient()) != null)
  {
  //遍历socketList中的每个Socket,
  //将读到的内容向每个Socket发送一次
  for (Socket s : MyServer.socketList)
  {
   OutputStream os = s.getOutputStream();
   os.write((content + "\n").getBytes("utf-8"));
  }
  }
 }
 catch (IOException e)
 {
  e.printStackTrace();
 }
 }
 //定义读取客户端数据的方法
 private String readFromClient()
 {
 try
 {
  return br.readLine();
 }
 //如果捕捉到异常,表明该Socket对应的客户端已经关闭
 catch (IOException e)
 {
  //删除该Socket。
  MyServer.socketList.remove(s);  //①
 }
 return null;
 }
}

客户端代码:

布局文件:main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 >
<LinearLayout
 android:orientation="horizontal"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 >
<!-- 定义一个文本框,它用于接受用户的输入 -->
<EditText
 android:id="@+id/input"
 android:layout_width="240px"
 android:layout_height="wrap_content"
 />
<Button
 android:id="@+id/send"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:paddingLeft="8px"
 android:text="@string/send"
 />
</LinearLayout>
<!-- 定义一个文本框,它用于显示来自服务器的信息 -->
<EditText
 android:id="@+id/show"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:gravity="top"
 android:editable="false"
 android:cursorVisible="false"
 />
</LinearLayout>

Activity文件:MultiThreadClient.java

package org.wwj.net;

import java.io.OutputStream;
import java.net.Socket;

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 MultiThreadClient extends Activity
{
 // 定义界面上的两个文本框
 EditText input, show;
 // 定义界面上的一个按钮
 Button send;
 OutputStream os;
 Handler handler;

 @Override
 public void onCreate(Bundle savedInstanceState)
 {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 input = (EditText) findViewById(R.id.input);
 send = (Button) findViewById(R.id.send);
 show = (EditText) findViewById(R.id.show);
 Socket s;
 handler = new Handler()
 {
  @Override
  public void handleMessage(Message msg)
  {
  // 如果消息来自于子线程
  if (msg.what == 0x123)
  {
   // 将读取的内容追加显示在文本框中
   show.append("\n" + msg.obj.toString());
  }
  }
 };
 try
 {
  s = new Socket("183.30.181.228 ", 8000);
  // 客户端启动ClientThread线程不断读取来自服务器的数据
  new Thread(new ClientThread(s, handler)).start(); // ①
  os = s.getOutputStream();
 }
 catch (Exception e)
 {
  e.printStackTrace();
 }
 send.setOnClickListener(new OnClickListener()
 {
  @Override
  public void onClick(View v)
  {
  try
  {
   // 将用户在文本框内输入的内容写入网络
   os.write((input.getText().toString() + "\r\n")
   .getBytes("utf-8"));
   // 清空input文本框
   input.setText("");
  }
  catch (Exception e)
  {
   e.printStackTrace();
  }
  }
 });
 }
}

子线程类:ClientThread.java

package org.wwj.net;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

import android.os.Handler;
import android.os.Message;

public class ClientThread implements Runnable
{
 //该线程负责处理的Socket
 private Socket s;
 private Handler handler;
 //该线程所处理的Socket所对应的输入流
 BufferedReader br = null;
 public ClientThread(Socket s , Handler handler)
 throws IOException
 {
 this.s = s;
 this.handler = handler;
 br = new BufferedReader(
  new InputStreamReader(s.getInputStream()));
 }
 public void run()
 {
 try
 {
  String content = null;
  //不断读取Socket输入流中的内容。
  while ((content = br.readLine()) != null)
  {
  // 每当读到来自服务器的数据之后,发送消息通知程序界面显示该数据
  Message msg = new Message();
  msg.what = 0x123;
  msg.obj = content;
  handler.sendMessage(msg);
  }
 }
 catch (Exception e)
 {
  e.printStackTrace();
 }
 }
}

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

(0)

相关推荐

  • Android 基于Socket的聊天室实例

    Socket是TCP/IP协议上的一种通信,在通信的两端各建立一个Socket,从而在通信的两端之间形成网络虚拟链路.一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信. Client A  发信息给 Client B ,  A的信息首先发送信息到服务器Server ,Server接受到信息后再把A的信息广播发送给所有的Clients 首先我们要在服务器建立一个ServerSocket ,ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接,它将一直处于等待

  • Android编写简单的聊天室应用

    最近写了一个简单的聊天室应用,可以发送表情,更改头像这些功能.主要技术点就是怎样把表情图片放到textview等Ui控件中展示.这里废话不多说,下面是效果图: 这里主要讲下怎样把文本替换到表情,先说下思路,首先我们的图片是保存在本地资源目录drawable中而所有的资源文件都是R这个类来管理,所以我们可以利用正则表达式找出图片id包装成ImageSpan然后把ImageSpan放到SpannableString中,最后把SpannableString放入edittext中,下面是源码: pack

  • Android实现C/S聊天室

    Java中能接受其他通信实体链接请求的类是ServerSocket,ServerSocket对象用于监听来自客户端的Socket链接,如果没有链接,它将一直等待.如果接收到一个客户端Socket的连接请求,ServerSocket的accept()方法将返回一个与客户端Socket对应的Socket(每个TCP连接有两个Socket),否则该方法将一直阻塞,线程也被阻塞. 服务端思路:服务端应该包含多个线程,每个Socket对应一个线程,这个线程负责读取该Socket对应输入流的数据(从客户端发

  • Android使用多线程进行网络聊天室通信

    TCP/IP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket,从而在通信的两端之间形成网络虚拟链路.一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信了.Java对基于TCP协议的网络通信提供了良好的封装,Java使用Socket对象来代表两端通信接口,并通过Socket产生IO流来进行网络通信. 下面的程序Demo是实现一个简单的C/S聊天室的应用,每个客户端该包含两条线程:一条负责生成主界面,响应用户动作,并将用户输入的数据写入Socket对应的输出流中:另一条

  • Android Socket通信实现简单聊天室

    socket通信是基于底层TCP/IP协议实现的.这种服务端不需要任何的配置文件和tomcat就可以完成服务端的发布,使用纯java代码实现通信.socket是对TCP/IP的封装调用,本身并不是一种协议,我们通过socket来调用协议来跟服务端进行通信和数据的传输.socket就像客户端与服务端之间的一条信息通道,每一个不同的客户端都会建立一个独立的socket,双方都没有关闭连接的话,连接-也就是建立好的这条socket通道将一直保持,服务端要跟那一个客户端通信只需要找到对应的socket对

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

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

  • android socket聊天室功能实现

    前提概要 笔者很久之前其实就已经学习过了socket,当然也是用socket做过了聊天室,但是觉得此知识点比较一般,并无特别难的技术点,于是也并未深究. 然而近期一个项目中对socket的使用却让笔者感觉socket强大无比,可以实现诸多功能. 个人Socket体验 项目主要有关智能家居,需要实现多台手机同时对灯进行操作(开或者关),主要需要实现以下几点: 1.进入界面时获取所有灯的状态. 2.一台手机改变了灯的状态,其他的手机上可以有所显示. 3.硬件上改变了灯的状态(手动开关灯),所有手机上

  • Android使用Websocket实现聊天室

    最近的项目中要实现一个聊天的功能,类似于斗鱼TV的聊天室功能,与服务器端人商量后决定用WebSocket来做,但是在这之前我只知道Socket但是听都没有听过WebSocket,但是查看了相关的材料以后发现实现一个聊天室其实是很简单的!下面我们先来看看WebSocket. Autobahn|Android 是由Autobahn开发一个开源的Java/Android网络库,实现了WebSocket协议和Web应用程序消息传输协议来创建本地移动的WebSocket/ WAMP的客服端. WebSoc

  • Android实现简单C/S聊天室应用

    Android的网络应用:简单的C/S聊天室,供大家参考,具体内容如下 服务器端:提供两个类 创建ServerSocket监听的主类:MyServer.java 负责处理每个Socket通信的线程类:ServerThread.java 客户端:是一个Android应用程序 ==>MultiThreadClient 界面提供两个文本框和一个发送按钮 Activity通过Handler来处理来自子线程的消息 客户端需要一个子线程负责读取来自网络的数据 项目效果: 服务器端代码: MyServer.j

  • Android文本视图TextView实现聊天室效果

    本文实例为大家分享了Android文本视图TextView实现聊天室的具体代码,供大家参考,具体内容如下 Math.random()生成随机数的范围是 0 到 1 之间的 日期时间格式new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); //年-月-日 时:分:秒  : HH大写24小时, String类的format()方法用于创建格式化的字符串以及连接多个字符串对象. MainActivity package com.example.junior

  • golang实现一个简单的websocket聊天室功能

    基本原理: 1.引入了 golang.org/x/net/websocket 包. 2.监听端口. 3.客户端连接时,发送结构体: {"type":"login","uid":"我是用户名","msg":"登陆成功"}' .服务端根据login信息,维护一个map,用来存放不同用户的连接体. 4.有用户发言时,将msg内容轮询发给给一个用户. 5.客户端使用js websocket功能,

  • Go语言实现一个简单的并发聊天室的项目实战

    目录 写在前面 并发聊天服务器 具体代码 服务端 客户端 总结 写在前面 Go语言在很多方面天然的具备很多便捷性,譬如网络编程,并发编程.而通道则又是Go语言实现并发编程的重要工具,因为其承担着通道之间互相通信的重任.并且因为其本身就是并发安全的,所以在某些场景下是非常好用的. 并发聊天服务器 这里主要是实现一个简单的并发聊天服务器.首先,客户端可以在服务器中注册自己的信息(登录以及退出),客户端发出的所有的信息由服务器向各个客户端进行转发,或者换句话说是广播. 具体代码 服务端 说的再多,没有

  • Java通过Socket实现简单多人聊天室

    本文实例为大家分享了Java通过Socket实现多人聊天室的具体代码,供大家参考,具体内容如下 Socket可以实现网络上两个程序通过双向通道进行数据的交换,此外它是Java中网络TCP/IP协议的封装,例如可以进行网络通信等等,下面我们就来简单写一下多人聊天室. 首先来分析一下要实现的流程 首先建立一个服务器端,构建ServerSocket并绑定端口 创建socket客户端,连接到指定ip以及其端口 然后使用accept阻塞接收socket发出的连接请求 获取连接后的socket客户端的输入流

  • 简单实现linux聊天室程序

    花了很长时间用来练习掌握linux上socket的一个聊天室程序,可以实现的哦. 具体代码如下 代码一: #ifndef _I_H #define _I_H #include <math.h> #include <stdio.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <unistd.h> #include <

  • python实现简单多人聊天室

    本文实例为大家分享了python实现多人聊天室的具体代码,供大家参考,具体内容如下 刚开始学习python,写了一个聊天室练练手. Server.py import socket,select,thread; host=socket.gethostname() port=5963 addr=(host,port) inputs=[] fd_name={} def who_in_room(w): name_list=[] for k in w: name_list.append(w[k]) ret

随机推荐