• Android基于TCP协议的Socket通信简单实例


    Socket通信有两种主要方式:TCP协议和UDP协议,两者区别是TCP协议要首先和接收方要建立连接然后发送数据,这样数据能保证送达,但速度较慢;UDP协议首先把数据打包,然后直接发送到接收方,无需建立连接诶,速度快,但容易丢失数据。这里是一个简单的基于TCP协议的通信实例:

    直接上代码:

    首先是java服务器的编写:

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    
    
    public class netserver {
    
        public static void main(String[] args) throws IOException {
            
            
            
            ServerSocket server=new ServerSocket(9090);//9090是端口号,由自己设置
            System.out.println("服务器已启动");
            Socket client=server.accept();//接收客户端请求
    //        PrintStream out=new PrintStream(client.getOutputStream());
            PrintWriter out=new PrintWriter(new OutputStreamWriter(client.getOutputStream(),"UTF-8"),true);
            BufferedReader msg=new BufferedReader(new InputStreamReader(client.getInputStream(),"UTF-8"));//对缓冲区数据读取
        StringBuffer info=new StringBuffer();//接收客户端发来的消息
        
        info.append("I'm fine.你好! ");//回应的数据
        info.append(msg.readLine());//接收的数据
        System.out.println(info);//控制台输出将要发出的信息
        out.print(info);//发送到客户端
        out.close();
        msg.close();
        client.close();
        server.close();
        
        }
    
    }

    接下来是安卓客户端的代码:

    package com.example.scoket;
    import androidx.appcompat.app.AppCompatActivity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    import java.net.Socket;
    public class MainActivity extends AppCompatActivity {
    private Button send=null;
    private TextView info=null;
    private Handler handler=null;
    private String s="";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            send=(Button)findViewById(R.id.send);
            info=(TextView) findViewById(R.id.info);
            send.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    new Thread()
                    {
                        public void run(){
                            try {
                                Socket client=new
    Socket("10.0.2.2",9090);//括号内为(服务器,端口号)
                               
                                PrintStream out=new PrintStream(client.getOutputStream());                
                                BufferedReader msgget=new BufferedReader(new InputStreamReader(client.getInputStream(),"UTF-8"));//读取返回的数据
                                out.println("已连接服务器");
                                s=msgget.readLine();
                                out.close();
                                msgget.close();
                                client.close();
                            }
                            catch (Exception e)
                            {
                                e.printStackTrace();
                            }
                            handler.sendEmptyMessage(0);}}.start();
                    handler =new Handler() {
    
                        //当有消息发来的时候就执行Handler方法
                    public void handleMessage(Message msg)
                    {
                        super.handleMessage(msg);
                        info.setText(s);
                    }
    
                    };
                }
            });    
        }
    }

    服务器就填服务器的ip地址,如果服务器是在自己电脑上的,客户端在虚拟机上,那么服务器就填10.0.2.2,若是局域网连接的,就用在win+r >cmd>config查询一下电脑的ip;端口号必须与服务器一致,挑选的端口如果显示被占用就换一个,端口的取值就自行百度。

    运行时先启动服务器,在运行客户端

    运行效果:

    客户端+服务器控制台

    按钮点击前:

     点击后:

  • 相关阅读:
    git如何将一个远程仓库的某个分支拉取到当前分支?
    linux下如何检查内核补丁是否符合社区代码规范?
    javascript快速入门20--Cookie
    javascript快速入门19--定位
    javascript快速入门18--样式
    javascript快速入门17--事件
    javascript快速入门16--表格
    javascript快速入门15--表单
    javascript快速入门15--节点
    javascript快速入门14--DOM基础
  • 原文地址:https://www.cnblogs.com/liuleliu/p/12397407.html
Copyright © 2020-2023  润新知