`
sunluo948040237
  • 浏览: 4609 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

在Android中利用Socket实现的聊天室(TCP)

阅读更多



         最近研究了一下Java中的socket通信机制,由于英语水平不好,只能习惯性的百度、谷歌上找相关类文章,总是有一些收获的,也遇到了不少小困难(其实是对这些机制不了解),现在写下来。

        顺便说一下,网上的那些源代码都是复制来复制去,照样写上去总是不能正常运行,是他们的错的还是我写的是错的?

下面是一些最基本的东西,网上总结的。

 端口 :端口是将应用程序与IP网络相关联,是应用进程的地址标识。分为两种公用端口(0~1023)和临时端口(1024~65535),我们用的就是临时端口。

 

套接字:区分不同应用程序进程间的网络通信和连接,主要有3个参数:通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。Socket原意是“插座”。通过将这3个参数结合起来,与一个“插座”Socket绑定,应用层就可以和传输层通过套接字接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

 

 流:Java中的流分为两种,一种是字节流(8位),另一种是字符流(16),分别由四个抽象类来表示:InputStream,OutputStream,Reader,Writer。 

          InputStream/OutputStream:

                             是所有的输入和输入类的基类。 
                             面向字节形式的I/O操作(8位字节流)。 
          Reader/Writer:

 

                             面向字符的I/O操作(16位的Unicode字符,在JAVA语言中,byte类型是8位的,char类型是16位的,所以在处理中文的时候需要用Reader和Writer  

 

 

InputStreamReader:可以将InputStream转换为Reader 
OutputStreamWriter:可以将OutputStream转换为Writer 

 

关于TCP的三次握手可以看这个:http://www.cnblogs.com/rootq/articles/1377355.html

基于TCP的聊天室

下面是效果图:

客户端将消息发往服务端用的是字节流,服务器端发往客户端用的是字符流。

Client客户端代码:

开启一个ServerSocket监听一个端口

/**
 * 服务器端 *
 */
public class Server {
	
	private ServerSocket sock ;
	private String str ;
	private List<Socket> sockLi = new ArrayList<Socket>();
	private String conte = null;//当前接收到的信息
	public Server()
	{
		try {
			//* 创建ServerSocket负责接收客户连接请求
			sock = new ServerSocket(5171,3);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void beginServer()
	{
		while(true)
		{
			try {
				Socket soc = sock.accept() ;
				sockLi.add(soc);
				//开启线程
				new Thread(new Serv(soc)).start();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	private class Serv implements Runnable{
		
		private Socket soc ;
		
		public Serv(Socket so)
		{
			this.soc = so;
		}
		@Override
		public void run() {
			try {
			InputStream instr = soc.getInputStream();
			while(!soc.isClosed()){
				//从流中读取下一个字节
				int len = instr.read();	
				//从字节流中读取信息
				byte[] bt = new byte[len];
				instr.read(bt, 0, len);
				str = new String(bt);
			
				if(str.equals("end"))
				{
					Thread.sleep(200);
					soc.close();
					sockLi.remove(soc);
					break ;
				}
				else if(str.trim().equals(""))
				{
					continue ;
				}
				else 
				{
					conte = str;
					sendMessage();
				}
			}
				
			} catch (IOException e) {
				//连接断开
				sockLi.remove(soc);
				e.printStackTrace();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}	
		}
		
	}
	
	private void sendMessage()
	{
		PrintWriter pr;
		for(Socket so:sockLi)
		{
			try {
				pr = new PrintWriter(so.getOutputStream(),true);
				pr.print(conte+"\n");
				pr.flush();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args)
	{
		Server se = new Server();
		se.beginServer();
	}
}
 提一下 readline和read都会阻塞进程,readline遇到\n会返回,所以在客户端发送消息后要发送一个\n表示已经发送完。
客户端:具体操作类ScoketSend
public class SocketSend {
	
	public static void main(String[] args)
	{
	}

	private Handler hd ;
	private BufferedReader buf ;
	static Socket sock ;
	private Bundle bun;
	private String name ;
	public SocketSend(Handler hd,String name)
	{
		this.name = name ;
		this.hd = hd ;
		try {
			sock = new Socket();
			bun = new Bundle();
			//android中的本地地址为10.0.2.2
			InetSocketAddress isa = 
				new InetSocketAddress("10.0.2.2", 5171); 
			sock.connect(isa, 300);//如果300ms没有连接到就会失败
			buf = new BufferedReader(
				new InputStreamReader(sock.getInputStream()));
			
			new Thread(new messtake(buf)).start();
			
		
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	private class messtake implements Runnable{
		private BufferedReader bu= null ;
		public messtake(BufferedReader buf)
		{
			bu = buf ;
		}
		@Override
		public void run() {
			String msg ="";
			try {
			while ((msg = bu.readLine()) != null) {
				if(msg.trim().equals(""))
				{//这里会接收到一个空白字符串,还不知道为什么 !
					continue;
				}
		    	//先把字符串中原本的/n替换掉,客户端接收再替换过来
			//一下是android部分通知ui更新
                    	bun.putString("contentMess", 
		   	msg.replace("Sun948040237", "\n"));
                    	bun.putInt("type", 1);
                    	Message message = new Message();
                    	message.setData(bun);
                    	hd.sendMessage(message); 
	            	}  
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	//向服务器发送消息
	public void send(String content)
	{
		try {
			content = name+"&#&" +content ;
			OutputStream ou = sock.getOutputStream();
			ou.write(content.getBytes().length);
			ou.write(content.getBytes());
			ou.flush();
			
		} catch (IOException e) {
			bun.putString("contentMess", "发送失败:"+content);
            bun.putInt("type", 0);
            Message message = new Message();
			message.setData(bun);
            hd.sendMessage(message); 
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
 
 客户端调用的时候

//NAME是昵称 

 

String con = "苹果";
new SocketSend(myHandler,NAME).send(con.replace("\n", "Sun948040237")+"\n");

 

下面是下载示例的链接

http://pan.baidu.com/s/1GbbK8

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    AndroidSocket聊天室

    在Android平台上,构建一个Socket聊天室是一个典型的网络通信应用场景,主要涉及到Java的Socket编程和Android的客户端开发。本文将深入探讨如何使用Socket技术在Android上实现一个简单的聊天室功能。 首先,我们...

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

    在实现聊天功能时,我们需要创建一个ServerSocket实例,设定监听的端口,然后在一个循环中调用其accept()方法来接受来自客户端的连接请求。每个连接请求都会创建一个新的Socket实例,代表与客户端的单个连接。客户端...

    Android高级应用源码-Android例子源码Socket实现粗略的聊天室功能.zip

    这个"Android高级应用源码-Android例子源码Socket实现粗略的聊天室功能.zip"包含了一个基本的Android项目,它展示了如何利用Java的Socket类在客户端和服务器之间进行数据通信,从而实现聊天功能。 首先,我们需要...

    android实现Socket通信聊天Demo

    在这个“android实现Socket通信聊天Demo”项目中,开发者创建了一个简单的聊天室,让用户能够通过Socket进行实时交流。 首先,我们要理解TCP协议。TCP(Transmission Control Protocol)是互联网协议族中的传输层...

    Android基于Socket聊天室

    Android基于Socket实现的聊天室功能 注解详细 一看就懂 包含服务器和客户端 服务器是一段java代码 客户端直接运行在手机上 用DOS(MyEclipse)开启服务器 然后运行模拟器或者手机即可。 注:请将客户端代码中的ip...

    Android例子源码Socket实现粗略的聊天室功能.zip

    本示例源码展示了如何利用Java的Socket库在Android平台上实现一个基础的聊天室功能。这个简单聊天室允许用户发送和接收消息,为理解Android网络编程提供了一个很好的实践平台。 首先,我们来看"Android例子源码...

    Android实现的一对一聊天(socket),包括服务器和客户端,android studio2.3开发

    在这个项目中,开发者使用了Socket通信协议来构建服务器和客户端之间的数据传输,实现了类似QQ和WeChat的沉浸式聊天界面。以下是关于这个项目的详细知识点: 1. **Socket编程**: Socket是网络通信的基础,它为两...

    Android简易版聊天室

    在本文中,我们将深入探讨如何构建一个简单的Android聊天室应用,以及它与PC服务器端和客户端的交互。这个"Android简易版聊天室"项目旨在提供一个基础架构,用于理解多平台间实时通信的工作原理。 首先,我们要理解...

    Android客户端C#服务器Socket聊天室(VS2008可用)

    在本项目中,“Android客户端C#服务器Socket聊天室”是一个示例应用,它演示了如何使用Socket编程在Android客户端和C#服务器之间实现一个简单的聊天功能。Socket编程是网络通信的基础,它允许两个设备(在这里是...

    Android socket聊天室

    总之,创建一个Android socket聊天室是一个涉及网络编程和Android应用设计的综合性任务。通过使用Java的Socket API,结合Android的多线程和网络权限管理,我们可以构建一个允许用户之间实时交流的聊天平台。

    安卓开发-Android例子源码Socket实现粗略的聊天室功能.zip

    在安卓开发中,实现一个基于Socket的简单聊天室功能是一个基础但重要的技能。这个例子源码展示了一种方法,让两个或多个用户通过网络进行实时通信。以下将详细讲解涉及的知识点。 1. **Android应用架构**:Android...

    Android中Socket通信

    本项目模拟了一个简单的客户端-服务器(CS)聊天室,让我们深入了解一下Android中的Socket通信及其实现。 首先,理解Socket的基本概念至关重要。Socket是网络通信中的一个端点,它允许两个应用程序通过网络进行数据...

    使用Android网络编程实现简易聊天室

    在Java中我们可以利用socket编程实现聊天室,在Android中也一样,因为Android完全支持JDK本身的TCP、UDP网络通信API。我们可以使用ServerSocket、Socket来建立基于TCP/IP协议的网络通信;也可以使用DatagramSocket、...

    Java Socket多人聊天室

    Java Socket 多人聊天室是一种基于C/S(客户端/服务器)架构的通信系统,它利用Java的Socket编程技术实现用户之间的实时交流。在本项目中,服务器端(Server)负责接收多个客户端(Client)的连接请求,管理和传递...

    Android 基于Socket的聊天室实例

    在Android开发中,构建基于Socket的聊天室是一个常见的练习,它可以帮助开发者理解网络通信的基本原理。Socket编程是TCP/IP协议栈的一部分,它提供了进程间通信(IPC)的能力,尤其是在网络环境中。下面我们将深入...

    网络编程课程设计报告-Android-Socket-聊天室.doc

    通过这份报告,我们可以了解到构建一个基于Android的Socket聊天室应用涉及的技术点,包括Socket编程原理、服务器和客户端的工作流程,以及如何设计和实现聊天系统的各种功能。这对于理解和实践网络编程,尤其是...

    以C#编写的Socket服务器的Android手机聊天室Demo

    在开发一个聊天室程序时,我们可以使用Socket、Remoting、...而现在,我正要实现一个C#语言作为服务器端、Android作为客户端的聊天室。由于服务器端和客户端不是同一语言(C#和java),所有我选择了Socket作为通信协议。

    基于socket的简易多人聊天室

    基于Socket的简易多人聊天室是利用这一技术实现的一个多用户交互的平台。在这个聊天室中,用户可以通过发送消息与房间内的其他用户实时交流。 【描述】: "基于socket的简易多人聊天室基于socket的简易多人聊天室...

    安卓Android源码——例子源码Socket实现粗略的聊天室功能.zip

    本示例源码是关于如何使用Socket实现一个简单的聊天室功能。Socket在计算机网络编程中扮演着核心角色,它提供了应用程序间的双向通信,使得数据能在不同设备之间交换。在安卓环境中,Socket可以用于实现客户端和...

    Socket实现粗略的Android聊天功能.

    这个项目中的代码应该包含了实现以上所有概念的示例,通过查看源代码,你可以更好地理解如何在Android上利用Socket进行C/S通信,实现基本的聊天功能。这是一个很好的起点,为进一步开发更复杂、功能丰富的聊天应用...

Global site tag (gtag.js) - Google Analytics