Android基于TCP协议的Socket通信简单实例
程序员文章站
2022-11-21 18:19:01
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;端口号必须与服务器一致,挑选的端口如果显示被占用就换一个,端口的取值就自行百度。
运行时先启动服务器,在运行客户端
运行效果:
客户端+服务器控制台
按钮点击前:
点击后:
上一篇: layui 轮播图动态数据不显示问题
下一篇: 二次惊吓