欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2022-04-12 11:25:29
android的网络应用:简单的c/s聊天室,供大家参考,具体内容如下 服务器端:提供两个类 创建serversocket监听的主类:myserver.java 负责...

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

服务器端:提供两个类

创建serversocket监听的主类:myserver.java

负责处理每个socket通信的线程类:serverthread.java

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

==>multithreadclient

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

activity通过handler来处理来自子线程的消息

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

项目效果:

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

服务器端代码:

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

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