• android-------- socket 实现客户端与服务器端通信


    前面介绍了Socket的简介和原理,今天简单的来实现一下客服端与服务器通信的功能

    客服端

    建立连接

     try {
    socket
    = new Socket("192.168.1.100", 9999); Log.i("Android", "与服务器建立连接:" + socket); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }

    发送消息

      try {
             // socket.getInputStream()
            DataOutputStream writer = new DataOutputStream(socket.getOutputStream());
            writer.writeUTF("嘿嘿,你好啊,服务器.."); // 写一个UTF-8的信息
            System.out.println("发送消息");
          } catch (IOException e) {
               e.printStackTrace();
          }

    添加权限

     <uses-permission android:name="android.permission.INTERNET"/>

    服务端(在Eclipse建立一个Java项目即可)

    import java.io.DataInputStream;
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class SocketServer {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            
            System.out.println("123456");
            startService();
        }
        
        
        /**  
        * 启动服务监听,等待客户端连接 
        */  
       private static void startService() {  
           try {  
               // 创建ServerSocket  
               ServerSocket serverSocket = new ServerSocket(9999);  
               System.out.println("--开启服务器,监听端口 9999--");  
     
               // 监听端口,等待客户端连接  
               while (true) {  
                   System.out.println("--等待客户端连接--");  
                   Socket socket = serverSocket.accept(); //等待客户端连接  
                   System.out.println("得到客户端连接:" + socket);  
                     
                   startReader(socket);  
               }  
     
           } catch (IOException e) {  
               e.printStackTrace();  
           }  
       }  
     
       /**  
        * 从参数的Socket里获取最新的消息 
        */  
       private static void startReader(final Socket socket) {  
     
           new Thread(){  
               @Override  
               public void run() {  
                   DataInputStream reader;  
                   try {  
                       // 获取读取流  
                       reader = new DataInputStream( socket.getInputStream());  
                       while (true) {  
                           System.out.println("*等待客户端输入*");  
                           // 读取数据  
                           String msg = reader.readUTF();  
                           System.out.println("获取到客户端的信息:" + msg);  
                       }  
                   } catch (IOException e) {  
                       e.printStackTrace();  
                   }  
               }  
           }.start();  
       }  
    
    }

    运行Java项目,得到

    然后在手机端点击发送消息

         

    服务端接收到消息,打印信息

     

    服务端发送消息给客户端

    服务端代码:

    public class TestServer {
    
         public static void main(String[] args) {
            
             try {
                ServerSocket serverSocket = new ServerSocket(30000);
                System.out.println("服务器已连接");
                while(true){
                    System.out.println("123");
                    Socket socket = serverSocket.accept();
                    OutputStream outputStream = socket.getOutputStream();
                    outputStream.write("你好,我是服务器
    ".getBytes("utf-8"));
                    outputStream.close();
                    socket.close();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
             
         }
    }

    客户端代码

    public class Demo2Activity extends AppCompatActivity {
    
        static TextView textView;
        Socket socket;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.demo2);
            initView();
        }
    
    
        private void initView(){
            textView = (TextView) findViewById(R.id.txt_1);
    
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        socket = new Socket("192.168.1.101", 30000);
                        // socket.setSoTimeout(10000);//设置10秒超时
                        Log.i("Android", "与服务器建立连接:" + socket);
                        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                        String line = br.readLine();
                        Log.i("Android", "与服务器建立连接:" + line);
                        Message msg = new Message();
                        msg.what = 1;
                        msg.obj = line;
                        handler.sendMessage(msg);
                    } catch (UnknownHostException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
            }).start();
    
        }
    
        Handler handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if (msg.what == 1){
                    textView.setText("这是来自服务器的数据:"+msg.obj.toString());
                }
            }
        };
    
    }

    先运行服务端,再运行客户端

    效果图:

     

     

    源码包含多个demo,也是参考网上资料而来

    源码地址:https://github.com/DickyQie/android-socket

  • 相关阅读:
    数据对齐
    算法面试题集——从各大博客收集
    软件工程师规划
    链栈,顺序栈,单链队列,循环队列,非循环队列的简单实现
    C,C++文件和目录操作的一些整理
    WPF使用笔记-计时器,多线程更新界面,焦点移动等
    Heap Data Structure and Heap Sort
    YUV420P像素数据编码为JPEG图片
    根据txt文件中指定的文件名进行文件分类
    MFC显示图片和写入文件
  • 原文地址:https://www.cnblogs.com/zhangqie/p/8876059.html
Copyright © 2020-2023  润新知