android socket 入门理解

博客介绍了Socket的概念,将其比喻为插座插孔,客户端像插头,插入后形成数据传输通道。还给出了Socket的简单用法,需搭建服务端和客户端,服务端接收客户端连接请求,并展示了在Android Studio测试用例里的服务端代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.首先什么是socket?

答:socket,意思是套接字,简单意思是,插座上的插孔,服务器有若干插孔,每个客户端类似一个插头,我们把插头插入插孔,就形成了一个传输通道,有了这个通道就可以传输数据了。这纯碎个人理解哦。当然初次接触这样理解就好了。

2.简单用法

首先要搭建一个服务端(ServerClient)和一个客户端(CustomClient), 服务端用来接收客户端的连接请求,当然这个请求首先由客户端发起。废话少说:先搭建一个简单服务端(我这里方法写在android studio 测试用例里面了)

//服务端代码

 @Test
 public void ServerClient() {
     final int PORT = 8000;//提供客户端访问的端口号,要确保两端一致
     List<Socket> mList = new ArrayList<Socket>();
     ServerSocket server = null;
     ExecutorService mExecutorService = Executors.newCachedThreadPool();//创建一个线程池
  
     Socket client = null;

     try {
         server = new ServerSocket(PORT);//创建一个服务端对象,用来接收客户端连接
         System.out.println("服务端已启动...");
         //这是一个死循环,用来不断循环监听,是否有客户端请求
         while (true) {

             client = server.accept();
             mList.add(client);

             //当客户端连接成功,新开一条线程去处理相关业务
             mExecutorService.execute(new MyRunnable(client));
         }
     } catch (IOException e) {
         e.printStackTrace();
     }



 }

public class MyRunnable implements Runnable {
    private Socket socket;
    private BufferedReader in = null;
    private PrintWriter printWriter=null;
    String receiveMsg;
    String sendMsg;
    public MyRunnable(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
       //这里也是一个死循环,在此客户端没有断开之前,实时响应客户端请求,并且给出回复
       //如果客户端发出断开请求 ,当然是约定好,假如客户端发送一个exit,那么我不在循环
        while (true){
            try {
                DataInputStream dataInputStream=new DataInputStream(socket.getInputStream());
                String msg=dataInputStream.readUTF();
                System.out.println("msg:"+msg);

                DataOutputStream dataOutputStream=new DataOutputStream(socket.getOutputStream());
                dataOutputStream.writeUTF("收到了客户端的信息:"+msg);
                dataOutputStream.flush();
                if(msg.contains("exit")){
                   socket.close();
                   break;//跳出循环
                }

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

//安卓服务客户端代码

//开启socket 长连接
private Socket mSocket;
private OutputStream mOutputStream;
private DataOutputStream mDataOutputStream;

private void startLongLink() {
    new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... voids) {
            try {
                if (mSocket == null || mSocket.isClosed() || !mSocket.isConnected()) {
                    mSocket = new Socket("192.168.8.111", 8000);
                } else {
                    Log.e("TAG", "socket is alive");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }


        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            if (mSocket != null && !mSocket.isClosed() && mSocket.isConnected()) {
                sendMsgToServer();

               executorService.execute(new Runnable() {
                   @Override
                   public void run() {
                       while (true){
                           try {
                               InputStream inputStream=mSocket.getInputStream();
                               if(inputStream!=null){
                                   DataInputStream dataInputStream=new DataInputStream(inputStream);
                                   Log.e("TAG","server apply:"+dataInputStream.readUTF());
                               }
                           } catch (IOException e) {
                               e.printStackTrace();
                           }
                       }
                   }
               });
            }

        }
    }.execute();


}


private void sendMsgToServer() {
    executorService.execute(new Runnable() {
        @Override
        public void run() {
            try {
                mOutputStream = mSocket.getOutputStream();
                mDataOutputStream = new DataOutputStream(mOutputStream);
                mDataOutputStream.writeUTF(editText.getText().toString());
                mDataOutputStream.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    });
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值