欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2022-05-18 15:34:27
Socket通信有两种主要方式:TCP协议和UDP协议,两者区别是TCP协议要首先和接收方要建立连接然后发送数据,这样数据能保证送达,但速度较慢;UDP协议首先把数据打包,然后直接发送到接收方,无需建立连接诶,速度快,但容易丢失数据。这里是一个简单的基于TCP协议的通信实例: 直接上代码: 首先是j ......

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;端口号必须与服务器一致,挑选的端口如果显示被占用就换一个,端口的取值就自行百度。

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

运行效果:

客户端+服务器控制台

按钮点击前:

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

 

 

 

 点击后:

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