完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
主activity布局
布局截图上 二、 mainactivity.java (一)需要用到的相关知识 1、socket 2、handler 3、onClickListener 4、Thread (二)主要代码实现 //日期:2020.2.19 / package com.example.helloworld; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.annotation.SuppressLint; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Switch; import android.widget.TextView; import android.widget.Toast; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; import static java.lang.System.out; public class MainActivity extends AppCompatActivity { volatile Boolean flag_SRX =null; private Handler handler=null; private TextView textView3=null; private volatile Boolean flag=null; private Bundle bundle=null; private Button button=null; private EditText editText1=null; private EditText editText2=null; private Switch switch_led=null; private Boolean flag_swich=null; private Socket socket=null; private BufferedReader bufferedReader=null; private BufferedWriter bufferedWriter=null; @SuppressLint("HandlerLeak") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final boolean loop=true; flag =false; flag_swich=false; flag_SRX =false; bundle=new Bundle(); textView3=findViewById(R.id.textView3); button=(Button) findViewById(R.id.btn_connect); editText1=(EditText)findViewById(R.id.edit_text1); final EditText editText2=(EditText)findViewById(R.id.edit_text2); switch_led=(Switch)findViewById(R.id.switch1); handler=new Handler(){ //测试子线程给主线程传输数据 @Override public void handleMessage(@NonNull Message msg) { super.handleMessage(msg); Log.i("handler","处理函数"); if (msg.what==0x11){ textView3.setText(msg.obj.toString()); }if(msg.what==0x22) button.setText("关闭连接"); } }; switch_led.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(flag) { new Thread(new Runnable() { @Override public void run() { try { if(flag_swich){ bufferedWriter.append("00rn"); flag_swich=false; }else { bufferedWriter.append("11rn"); flag_swich=true; //用来指示开关状态:开为true } } catch (IOException e) { e.printStackTrace(); } finally { if (bufferedWriter != null) { try { bufferedWriter.flush(); } catch (IOException e) { e.printStackTrace(); } } } Log.i("发送数据到", "TCP上"); } }).start(); } else { Toast toast=Toast.makeText(MainActivity.this,"TCP未成功连接",Toast.LENGTH_SHORT); toast.show(); } } }); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(!flag) { new Thread(new Runnable() { @Override public void run() { try { char time=0; socket =new Socket(editText1.getText().toString(), Integer.valueOf(editText2.getText().toString())); bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); bufferedReader= new BufferedReader(new InputStreamReader(socket.getInputStream())); Log.i("开始循环等待!","Warring"); while (socket.isConnected()==false){ try { Thread.sleep(100); time++; if(time==10){ Log.i("等待时间到,退出等待!","Warring"); break; } } catch (InterruptedException e) { e.printStackTrace(); } } flag_SRX=true; flag =true; handler.sendEmptyMessage(0x22); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }).start(); } else { try { bufferedReader.close(); bufferedWriter.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } finally { try { bufferedReader.close(); bufferedWriter.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } flag =false; flag_SRX=false; button.setText("连接网络"); } } }); } @Override protected void onStart() { super.onStart(); Thread thread=new Thread(new Runnable() { @Override public void run() { while (true) { String mstr = ""; try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } Log.i("线程三循环开启","Warring"); while (flag_SRX) { try { mstr = bufferedReader.readLine(); } catch (IOException e) { e.printStackTrace(); } if (null != mstr) { Message message_rx = handler.obtainMessage(); message_rx.what = 0x11; message_rx.obj = mstr; handler.sendMessage(message_rx); } } } } }); thread.start(); } } (三)期间存在问题 1、bufferreader.readline()函数是读一行文本,所以在服务器发送 的时候要加回车换行符,不然会造成阻塞。 2、Message msg=handler.obtainMessage()函数来获取到msg 3、线程要加一定延时,否则程序主进程刷新受影响,Thread.sleep() 4、BufferReader和BufferWriter是获取到socket的输入输出流到缓存区 |
|
|
|
|
只有小组成员才能发言,加入小组>>
3038 浏览 0 评论
800浏览 1评论
1048浏览 0评论
823浏览 0评论
1005浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 05:42 , Processed in 0.694986 second(s), Total 77, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1235
