android⽹络编程--Socket通信(03)点对点Android聊天室实
现(带服务器。。。
1-简介:
概念:在⽹络上的两个程序通过⼀个双向的通信连接实现数据的交换,这个双向链路的⼀端称为⼀个socket。
组成:由⼀个IP地址和⼀个端⼝号唯⼀确定,是TCP/IP 协议的⼀个⼗分流⾏的编程界⾯。
应⽤:socket编程⽐基于URL的HTTP⽹络编程提供了更⾼的传输效率、更强⼤的功能和更灵活的控制,但却复杂⼀些。
地位:socket已经是java中层次最低的⽹络编程接⼝,在java中直接操作协议中更低的层次,需要使⽤java本地⽅法调⽤(JNI)。
基础:Server端监听某个端⼝是否有连接请求,Client端向Server端发出连接请求,Server端向Client端发回Accept消息,⼀个连接就建⽴起来了;
Server和Client端都可以⽤Send和Write等⽅法,与对⽅通信,Java在包java中提供了两个类Socket和ServerSocket。
⽬前⽹上的资源⼤都⽆法实现点对点通信,要么⽤服务器⼴播,本实例将实现socket 指定的点点通信。
2-功能简介:
界⾯设计有点挫,重点在于功能,这是安卓客户端, 上⾯的 spinner下拉列表⽤来选择在线⽤户,
中间的TextView⽤于显⽰接收到的信息,(这⾥设计略简单,只做DEMO参考级别),
最下⾯输⼊聊天内容,发送按钮进⾏点对点通信。
3-服务器编程:
S1.新建⼀个java⼯程充当java 服务器,命名为ChatServer:
S2 编写服务器程序:
S2.1.ServerThread
服务线程,启动服务器时启动,开启服务ServerSocket⽤以监听端⼝收到的客户端信息。web;
import java.io.IOException;
import java.ServerSocket;
import java.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class ServerThread implements Runnable {
// ServerSocket 类对象
private ServerSocket serverSocket = null;
// 服务器端⼝设置
private static final int PORT = 8888;
// 存储接收到客户端的消息
public List<Message> messagelt = null;
// 服务器启动标志位
private boolean isStart = true;
// 存储客户端socket
/
/ 存储客户端socket
public HashMap<String, ClientHandlerThread> clientsMap = null;
/**
* 构造函数
*/
public ServerThread(){
// 初始化 message 存储list
messagelt = new ArrayList<Message>();
// 初始化客户端socket
clientsMap = new HashMap<String, ClientHandlerThread>();
try {
/
/ 开启服务器socket
serverSocket = new ServerSocket(PORT);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 启动消息处理线程
new Thread(new MessageHandlerThread(this)).start();
}
/**
* ⼀旦有客户端连⼊,就启动客户端处理线程,并加⼊服务器客户端HashMap中
*/android编程入门指南 pdf
@Override
public void run() {
// TODO Auto-generated method stub
while(isStart){
try {
// 获取⼀个连接客户端
Socket socket = serverSocket.accept();
System.out.println("连⼊⼀个客户端:" + InetAddress().getHostAddress());
// 创建clientHandler线程
ClientHandlerThread clientRunnable = new ClientHandlerThread(socket, this);
Thread clientThread = new Thread(clientRunnable);
clientThread.start();
// 将成功获取到的客户端保存起来
if(socket != null){
synchronized(clientsMap){
clientsMap.InetAddress().getHostAddress(), clientRunnable);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 关闭 ServerSocket
*/
public void finalize(){
// 关闭 ServerSocket
try {
serverSocket.close();
} catch (IOException e) {
/
/ TODO Auto-generated catch block
e.printStackTrace();
e.printStackTrace();
}
serverSocket = null;
}
}
class Message{
public String IP;
public String info;
public Message(String iP, String info) {
super();
IP = iP;
this.info = info;
}
}
S2.2.ClientHandlerThread
客户端处理线程,当有⼀个客户端连⼊服务器时,启动⼀个线程接收客户端信息。
web;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.Socket;
public class ClientHandlerThread implements Runnable {
// 客户端socket
public Socket clientSocket = null;
// socket 的输⼊,输出流
private DataInputStream in = null;
public DataOutputStream out = null;
// 服务器线程ServerThread
private ServerThread serverThread = null;
/**
* 构造函数
* @param socket
* @param serverThread
*/
public ClientHandlerThread(Socket socket, ServerThread serverThread){
this.serverThread = serverThread;
this.clientSocket = socket;
// 获取对服务器操作的输⼊输出流
try {
in = new InputStream());
out = new OutputStream());
} catch (IOException e) {
/
/ TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 监听对应的客户端是否有消息发送
*/
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
try {
String iP = in.readUTF();
String info = in.readUTF();
Message message = new Message(iP, info);
// 打印接收信息
System.out.println("[" + InetAddress().getHostAddress() + "] -> [" + message.IP + "]:" + message.info);    // 将客户端发送的信息存储到 Message LIST中
synchronized (ssagelt) {
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
break;
}
}
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。