当前位置: 代码迷 >> 综合 >> ChatAPP------开发(基本原理)
  详细解决方案

ChatAPP------开发(基本原理)

热度:29   发布时间:2023-12-14 14:48:11.0

一,简介基本原理:启动ChatAPP时,同时启动ServerSocket,不断循环接收,相当于一个简易的服务器。用于接收别的客户端发过来的信息,于此同时布局客户端,使其能够发送信息到别的ChatAPP。



二,实现
1,ServerSocket的创建和实现

private ServerSocket serverSocket = null;/*服务器端接收数据需要注意以下一点:服务器端应该是多线程的,因为一个服务器可能会有多个客户端连接在服务器上;*/private void receiveData() {Thread thread = new Thread(){@Overridepublic void run() {super.run();/*指明端口号*/try {serverSocket = new ServerSocket(8000);}catch (IOException e){e.printStackTrace();}GetIpAddress.getLocalIpAddress(serverSocket);Message message_1 = handler.obtainMessage();message_1.what = 1;message_1.obj = "IP:" + GetIpAddress.getIP() + " PORT: " + GetIpAddress.getPort();handler.sendMessage(message_1);/*循环启动服务*/boolean b = true;while (b){Socket socket = null;try {if (!serverSocket.isClosed()){socket = serverSocket.accept();inputStream = socket.getInputStream();new ServerThread(socket,inputStream).start();}else {b = false;socket.close();return;}}catch (Exception e){e.printStackTrace();}}}};thread.start();
}class ServerThread extends Thread{private Socket socket;private InputStream   inputStream;private StringBuffer stringBuffer = MainActivity.this.stringBuffer;public ServerThread(Socket socket,InputStream inputStream){this.socket = socket;this.inputStream = inputStream;}@Overridepublic void run() {int len;byte[] bytes = new byte[20];boolean isString = false;try {//在这里需要明白一下什么时候其会等于 -1,其在输入流关闭时才会等于 -1,//并不是数据读完了,再去读才会等于-1,数据读完了,最结果也就是读不到数据为0而已;while ((len = inputStream.read(bytes)) != -1) {for(int i=0; i<len; i++){if(bytes[i] != '\0'){stringBuffer.append((char)bytes[i]);}else {isString = true;break;}}if(isString){Message message_2 = handler.obtainMessage();message_2.what = 2;message_2.obj = stringBuffer;handler.sendMessage(message_2);isString = false;}}//当这个异常发生时,说明客户端那边的连接已经断开} catch (IOException e) {e.printStackTrace();try {inputStream.close();socket.close();} catch (IOException e1) {e1.printStackTrace();}}}}

2,本机IP地址的获取

/**
* 获取IP地址和端口号
*/
public class GetIpAddress {public static String IP;public static int PORT;public static String getIP(){return IP;}public static int getPort(){return PORT;}public static void getLocalIpAddress(ServerSocket serverSocket) {try {for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {NetworkInterface intf = en.nextElement();for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {InetAddress inetAddress = enumIpAddr.nextElement();String mIP = inetAddress.getHostAddress().substring(0, 3);if (mIP.equals("192")) {IP = inetAddress.getHostAddress();    //获取本地IPPORT = serverSocket.getLocalPort();    //获取本地的PORTLog.e("IP", "" + IP);Log.e("PORT", "" + PORT);}}}} catch (SocketException e) {e.printStackTrace();}}
}