android聊天程序 java_Android简单的聊天室开发(client与server沟通)

本文介绍了如何在Android上使用Java实现一个简单的TCP聊天室,包括TCP/IP协议基础、ServerSocket创建服务器端、Socket进行通信及异常处理。通过ServerSocket监听客户端连接,每个连接创建一个新线程处理通信,实现数据的广播。客户端使用Socket连接服务器,通过多线程读取服务器数据并在UI上显示。整个程序展示了C/S结构的聊天应用基础原理。
摘要由CSDN通过智能技术生成

1.预备知识:Tcp/IP协议与Socket

TCP/IP

是Transmission Control Protocol/Intemet Protocol的简写,中文译名为传输控制协议/因特网互联协议。又叫网络通信协议,这个协议是Internet最主要的协议,是Internet国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的。

TCP/IP协议遵循的是一个抽象的分层模型,这个模型中全部的TCP/IP系列网络协议都被归类到4个抽象的“层”中。

每一抽象层建立在低一层提供的服务上,而且为高一层提供服务。完毕一些特定的任务须要众多的协议协同工作。这些协议分布在參考模型的不同层中,因此有时称它们为一个协议栈。

TCP/IP參考模型从下到上分别包含网络接口层、网络互连层、传输层、应用层四层常常使用的包含HTTP (万维网服务)、FTP

(文件传输)、SMTP (电子邮件)、SSH

(安全远程登录)、DNS (IP地址寻找)在内的很多协议都被觉得执行在TCP/IP协议栈的应用层之上。每一个应用层协议一般都会使用到两个传输层协议之中的一个:面向连接的TCP传输控制协议和无连接的包传输UDP用户数据报文协议。

传输层的协议可以解决诸如端到端可靠性(数据是否已经到达目的地)和保证数据依照正确的顺序到达这种问题。

TCP是一个“可靠的”、面向连接的传输机制,它提供一种可靠的字节流保证数据完整、无损而且按顺序到达。TCP尽置连续不断地測试网络的负载而且控制发送数据的速度以避免网络过载。另外。TCP试图将数据依照规定的顺序发送。

这是它与UDP不同之处,但这在实时数据流或者路由高网络层丢失率应用的时候可能成为一个缺陷。

UDP是一个无连结的数据报协议。它是一个“尽最大努力交付”或者“不可靠”协议。不是由于它特别“不可靠”。而是由于它不检查数据包是否已经到达目的地,而且不保证它们按顺序到达。假设一个应用程序须要这些特点,它必须自己提供或者使用TCP。

UDP的典型应用是如流媒体(音频和视频等)这样按时到达比可靠性更重要的应用,或者如DNS査找这样的简单查询/响应应用,假设建立可靠的连接则所做的额外工作将是非常多的。

在网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通经常使用来实现客户方和服务方的连接。

Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个port号唯一确定。

在传统的UNIX环境下能够操作TCP/IP协议的接口不止Socket—个,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必定联系的。

只是在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。

也就是说在Java环境下我们实现基于TCP/IP协议的网络编程须要採用Socket机制。

Socket编程比基于URL的网络编程提供了更高的传输效率、更强大的功能和更灵活的控制,可是却要更复杂一些。因为Java本身的特殊性,Socket编程在Java中可能已经是层次最低的网络编程接口,在Java屮要直接操作协议中更低的层次,须要使用Java的本地方法调用(JNI),在这里就不予讨论了。

Android中进行Socket编程与普通Java程序所进行的Socket编程的方式保持一致。不同的是数据的来源以及显示上有所差别。採用Java语言开发的一些网络编程的应用比方最经典的聊天室应用能够非常easy地移植到Android平台上。而因为TCP协议要比UDP协议的应用广泛。如经常使用的HTTP、FTP、SMTP等协议都是採用TCP协议,因此这里主要介绍Android中基于TCP协议的Socket编程。

Socket通经常使用来实现C/S结构。使用Socket进行Client/Server程序设计的一般连接过程是这种:Server端监听某个port是否有连接请求。Client端向Server端发出连接请求,Server端向Client端发回Accept

(接受)消息。一个连接就建立起来了。

Server端和Client端都能够通过Send、Write等方法与对方通信。

Java在包java.net中提供了两个类Socket和ServerSocket。分别用来表示双向连接的client和服务端。

2.使用ServerSocket创建TCPserver端

Java中能接收其它通信实体连接请求的类是ServerSocket,ServerSocket对象用于监听来自client的Socket连接,假设没有连接,它将一直处于等待状态。ServerSocket包括一个监听来自client连接请求的方法。

1)Socket accept():假设接收到一个clientSocket的连接请求,该方法将返回一个与连接clientSocket相应的Socket;否则该方法将一直处于等待状态,线程也被堵塞。

创建ServerSocket对象。ServerSocket类提供了例如以下几个构造器:

2)ServerSocket(int port):用指定的portport来创建一个ServerSocket。

该port应该是有一个有效的port整数值:0〜65

535。

3)ServerSocket(int port,int backlog):添加一个用来改变连接队列长度的參数backlog。

4)ServerSocket(int port.int backlog,lnetAddresslocalAdd():在机器存在多个IP地 址的情况下,同意通过localAddr这个參数来指定将ServerSocket绑定到指定的IP地址。

注:当ServerSocket使用完成后,应使用ServerSocket的close()方法来关闭该ServerSocket。

通常情况下,server不应该仅仅接收一个client请求,而应该不断地接收来自client的全部请求。

如以下代码所看到的:

//创建一个ServerSocket。用于监听client的连接请求

ServerSocket ss=newServerSocket(1566);

//不停地从接收来自client的请求

while(true)

{

//每当接受一个来自client的Socket的请求,server端也相应产生一个Socket

Socket s=ss.accept();

//以下就能够使用Socket进行通信了

//..........

}

3.使用Socket进行通信

client通常可使用Socket的构造器来连接到指定server,Socket通常可使用例如以下两个构造器。

1)Socket(lnetAddress/String remoteAddress, int port):创建连接到指定远程主机、远程port的Socket。该构造器没有指定本地地址、本地port,默认使用本地主机的默认IP地址。默认使用系统动态指定的IP地址。

2)Socke

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值