Androidチャットルーム(サーバ)

16931 ワード

Androidチャットルーム(サーバ)
黒衣の侠客
一.前言:
このブログは、前編『Androidチャットルーム(クライアント)』を受けています
二.準備:
サーバは主にJavaネットワークプログラミングに関連しています.
三.コンパイラ:
サーバーのコードはすべてideaに书き込みます.もちろんeclipseに书いてもいいです.操作するときは、まずサーバーを开けて运行し、それからクライアントを操作します.私が操作するときは、PC侧がサーバーとして、携帯电话と仮想机がクライアントとして、ここで注意しなければならないのは、携帯电话はパソコンと同じWiFiに接続しなければなりません.仮想机を使うと、これらの面倒を省くことができます.(仮想マシンとパソコンはもともと同じWiFiに接続されています)
四.コード:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class Server {
    public static void main(String[] args){
        //startServer=new startServer();
        new startServer().start();//new           (  startServer    Thread)
    }
    public static ArrayList<UserThread> socketList=new ArrayList<UserThread>();//       UserThread(UserThread       )     
    public static startServer startServer;
    static class startServer extends Thread{
        public void run(){
           try{
               ServerSocket serverSocket = new ServerSocket(6666);
               //      :6666 ServerSocket  
               while(true){//   
                   Socket socket = serverSocket.accept();//  socket  ,          
                   System.out.println(""+socket);//        IP  ,       ,        
                   UserThread userThread = new UserThread(socket);//       UserTread     ,  userThread  
                   Server.socketList.add(userThread);
                   new Thread(userThread).start();//         
               }
           }catch(IOException e){
               e.printStackTrace();
           }
        }
    }
    static class UserThread implements Runnable{
        private Socket skt;
        private DataOutputStream dos;
        private DataInputStream dis;
        public DataOutputStream getDos(){//     
            return dos;
        }
        public void setDos(DataOutputStream dos){//        
            this.dos=dos;
        }
        public DataInputStream getDis(){//     
            return dis;
        }
        public void setDis(DataInputStream dis){//        
            this.dis=dis;
        }
        public UserThread(Socket socket){//      
            skt=socket;
        }
        @Override
        public void run(){
            try{
                dos= new DataOutputStream(skt.getOutputStream());//     (                )
                dis= new DataInputStream(skt.getInputStream());//           (   )
                String recMsg ="";
                while(true){//        
                    if(!"".equals(recMsg=dis.readUTF())){//        ,      recMsg 
                        System.out.println("      "+ recMsg);//  :      +“     ”
                        for(UserThread s:socketList){//  for  
                            if(s.equals(this)){
                                continue;
                            }
                            try{
                                s.getDos().writeUTF(recMsg);// UTF-8         
                            }catch(IOException e){
                                socketList.remove(s);// s     socketList   
                                e.printStackTrace();
                            }
                        }
                        recMsg="";//recMsg      
                    }
                }
            }catch(IOException e){
                e.printStackTrace();
            }
        }
    }
}

まとめ:
これまで、クライアントとサーバーのブログはすべて完了しており、ソースコードは次のブログで、とにかく、今回のAndroidチャットルームの書くのは大変で、中には考えられない抜け穴がたくさんありますが、まあ、基本的なグループチャット機能を実現しました.今、Androidチャットルームは一段落しました.androidの知識を勉強し続けることができます.また、サーバの重要な詳細については、dosに関するリンクを提供します.writeUTFの長さ問題Javaでの強化forループreadUTF()とwriteUTF()の知識についての説明Server Socketの詳細