zoukankan      html  css  js  c++  java
  • 冲刺十五天

    实现链接数据库端的朋友信息展示以及Socket通信学习

    链接数据库的朋友信息并展示

    package com.example.newbsh.UI.friends;
    
    import androidx.lifecycle.ViewModelProviders;
    
    import android.os.Bundle;
    
    import androidx.annotation.NonNull;
    import androidx.annotation.Nullable;
    import androidx.fragment.app.Fragment;
    
    import android.os.Handler;
    import android.os.Message;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ListView;
    import android.widget.TextView;
    
    import com.example.newbsh.HttpUtil.HttpUtil;
    import com.example.newbsh.MainActivity;
    import com.example.newbsh.R;
    import com.example.newbsh.UI.friends.list.SideBar;
    import com.example.newbsh.UI.friends.list.SortAdapter;
    import com.example.newbsh.UI.friends.list.User;
    
    import org.json.JSONArray;
    import org.json.JSONException;
    
    import java.util.ArrayList;
    import java.util.Collections;
    
    public class FriendFragment extends Fragment {
    
        private FriendViewModel mViewModel;
        private View view;
        private ListView listView;
        private SideBar sideBar;
        private ArrayList<User> list;
        private Handler handler;
        private String getUsername(){
            return MainActivity.getUserName();
        }
        public static FriendFragment newInstance() {
            return new FriendFragment();
        }
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                                 @Nullable Bundle savedInstanceState) {
            view=inflater.inflate(R.layout.friend_fragment, container, false);
            return view;
        }
    
        @Override
        public void onActivityCreated(@Nullable Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            mViewModel = ViewModelProviders.of(this).get(FriendViewModel.class);
            // TODO: Use the ViewModel
            initView();
            getThreadData();
            handler = new Handler(new Handler.Callback() {
                @Override
                public boolean handleMessage(@NonNull Message msg) {     //线程回调更新数据
                    if (msg.what == 200)
                    {
                        list=new ArrayList<>();
                        JSONArray jsonArray=(JSONArray)msg.obj;
                        for(int i=0;i<jsonArray.length();i++)
                        {
                            try {
                                String friendname= (String) jsonArray.getJSONObject(i).get("friendname");
                                String friendurl= (String) jsonArray.getJSONObject(i).get("friendurl");
                                User bean=new User(friendname,friendurl);
                                list.add(bean);
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                        Collections.sort(list); // 对list进行排序,需要让User实现Comparable接口重写compareTo方法
                        SortAdapter adapter = new SortAdapter(view.getContext(), list);
                        listView.setAdapter(adapter);
                    }
                    return true;
                }
            });
        }
        private void initView() {
            listView = (ListView) view.findViewById(R.id.listView);
            sideBar = (SideBar) view.findViewById(R.id.side_bar);
            sideBar.setOnStrSelectCallBack(new SideBar.ISideBarSelectCallBack() {
                @Override
                public void onSelectStr(int index, String selectStr) {
                    for (int i = 0; i < list.size(); i++) {
                        if (selectStr.equalsIgnoreCase(list.get(i).getFirstLetter())) {
                            listView.setSelection(i); // 选择到首字母出现的位置
                            return;
                        }
                    }
                }
            });
        }
        private void getThreadData() {                     //线程封装网络请求
            new Thread(new Runnable() {
                @Override
                public void run() {
                    String reqdata = "";
                    String address="http://39.97.181.86/BaiXiaoSheng/myfriend?username="+getUsername();
                    try {
                        final JSONArray json = new JSONArray(String.valueOf(HttpUtil.sendPost(address, reqdata)));
                        Log.d("tag", json.toString());
                        Message msg = new Message();
                        msg.what = 200;
                        msg.obj = json;
                        handler.sendMessage(msg);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }

    Socket通信与本地服务器端链接

    服务器端:

    package servlet;
    
    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.security.Provider;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class Server {
    
        private static final int PORT=12345;
        private List<Socket> mlist=new ArrayList<>();
        private ServerSocket server=null;
        private ExecutorService myExecutorService=null;
        public static void main(String[] args){
            new Server();
        }
        public Server()
        {
            try {
                server=new ServerSocket(PORT);
                //创建线程池
                myExecutorService=Executors.newCachedThreadPool();
                System.out.println("服务端运行中...
    ");
                Socket client=null;
                while(true)
                {
                    client=server.accept();
                    mlist.add(client);
                    myExecutorService.execute(new Service(client));
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        class Service implements Runnable
        {
            private Socket socket;
            private BufferedReader in = null;
            private String msg = "";
    
            public Service(Socket socket) {
                this.socket = socket;
                try
                {
                    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    msg = "用户:" +this.socket.getInetAddress() + "~加入了聊天室"
                            +"当前在线人数:" +mlist.size();
                    this.sendmsg();
                }catch(IOException e){e.printStackTrace();}
            }
    
            @Override
            public void run() {
                try{
                    while (true)
                    {
                        if((msg=in.readLine())!=null)
                        {
                            if(msg.equals("bye"))
                            {
                                System.out.println("~~~~~~~~~~~");
                                mlist.remove(socket);
                                in.close();
                                msg = "用户:" + socket.getInetAddress()
                                        + "退出:" +"当前在线人数:"+mlist.size();
                                socket.close();
                                this.sendmsg();
                                break;
                            }
                            else
                            {
                                msg=socket.getInetAddress()+"  说:"+msg;
                                this.sendmsg();
                            }
                        }
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
            //为连接上服务端的每个客户端发送信息
            public void sendmsg()
            {
                System.out.println(msg);
                int num = mlist.size();
                for(int index = 0;index < num;index++)
                {
                    Socket mSocket = mlist.get(index);
                    PrintWriter pout = null;
                    try {
                        pout = new PrintWriter(new BufferedWriter(
                                new OutputStreamWriter(mSocket.getOutputStream(),"UTF-8")),true);
                        pout.println(msg);
                    }catch (IOException e) {e.printStackTrace();}
                }
            }
        }
    }

    安卓端:

    package com.example.sockettest;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.os.StrictMode;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.net.Socket;
    
    public class SocketActivity extends AppCompatActivity implements Runnable {
    
        //定义相关变量,完成初始化
        private TextView txtshow;
        private EditText editsend;
        private Button btnsend;
        private static final String HOST = "192.168.137.1";
        private static final int PORT = 12345;
        private Socket socket = null;
        private BufferedReader in = null;
        private PrintWriter out = null;
        private String content = "";
        private StringBuilder sb = null;
    
        //定义一个handler对象,用来刷新界面
        public Handler handler = new Handler() {
            public void handleMessage(Message msg) {
                if (msg.what == 0x123) {
                    sb.append(content);
                    txtshow.setText(sb.toString());
                }
            }
        };
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_socket);
            if (android.os.Build.VERSION.SDK_INT > 9) {
                StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                StrictMode.setThreadPolicy(policy);
            }
    
            sb = new StringBuilder();
            txtshow = (TextView) findViewById(R.id.txtshow);
            editsend = (EditText) findViewById(R.id.editsend);
            btnsend = (Button) findViewById(R.id.btnsend1);
    
            //当程序一开始运行的时候就实例化Socket对象,与服务端进行连接,获取输入输出流
            //因为4.0以后不能再主线程中进行网络操作,所以需要另外开辟一个线程
            new Thread() {
                public void run() {
                    try {
                        socket = new Socket(HOST, PORT);
                        in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
                        out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
                                socket.getOutputStream())), true);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }.start();
    
            new Thread(new Runnable() {
                @Override
                public void run() {
                    btnsend.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            String msg = editsend.getText().toString();
                            if (socket.isConnected()) {
                                if (!socket.isOutputShutdown()) {
                                    out.println(msg);
                                }
                            }
                        }
                    });
                }
            }).start();
    
            //为发送按钮设置点击事件
            new Thread(SocketActivity.this).start();
        }
    
        //重写run方法,在该方法中输入流的读取
        @Override
        public void run() {
            try {
                while (true) {
                    if (socket.isConnected()) {
                        if (!socket.isInputShutdown()) {
                            if ((content = in.readLine()) != null) {
                                content += "
    ";
                                handler.sendEmptyMessage(0x123);
                            }
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

     

     

  • 相关阅读:
    201521123099 《Java程序设计》第6周学习总结
    201521123099《java程序设计》第五周学习总结
    201521123099 《Java程序设计》第3周学习总结
    201521123099 《Java程序设计》第9周学习总结
    201521123099 《Java程序设计》第4周学习总结
    陈敏第一周Java课程总结
    maven常见配置
    使用swagger管理接口
    Reportng配置报告地址
    Testng基本问题
  • 原文地址:https://www.cnblogs.com/xiaofengzai/p/12865916.html
Copyright © 2011-2022 走看看