Android基于TCP协议的Socket通信简单实例
奔跑的男人 · 313浏览 · 发布于2020-03-03
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下vulkan与opengles纹理互通
talkchan · 1158浏览 · 2020-11-23 10:37:39
Android 使用RecyclerView实现轮播图
奔跑的男人 · 2166浏览 · 2019-05-09 17:11:13
微软发布新命令行工具 Windows Terminal
吴振华 · 860浏览 · 2019-05-09 17:15:04
在华为写了十几年代码,我为什么还没有被拿去“祭天”
追忆似水年华 · 1193浏览 · 2019-05-09 17:22:20
android 通过修改图片像素实现CircleImageView
吴振华 · 1118浏览 · 2019-05-09 22:26:56
分类专栏
最新发布
最热排行
0评论