庚茗溪澈 發表於 2020-3-22 05:42:00

Android 开发: 通信篇-TCP客户端

<p>&nbsp;</p>
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/LearnAndroid" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3><span style="font-size: 18pt">说明</span></h3>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">这节教给大家用Android写一个TCP客户端程序</span></p>
<p><span style="font-size: 18pt">官方文档</span></p>
<p><span style="font-size: 18pt">https://www.android-doc.com/reference/java/net/Socket.html</span></p>
<p>&nbsp;</p>
<h3><span style="font-size: 18pt">页面</span></h3>
<p><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322040304382-967606975.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3><span style="font-size: 18pt">编写连接程序</span></h3>
<p><span style="font-size: 18pt">1.获取控件</span></p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322040752872-1171636405.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre>    EditText editTextIPAddress,editTextPort;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">输入IP地址,端口号</span>
    Button buttonConnect;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">连接按钮</span>
<span style="color: rgba(0, 0, 0, 1)">
    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      buttonConnect </span>=<span style="color: rgba(0, 0, 0, 1)"> findViewById(R.id.buttonConnect);
      editTextIPAddress </span>=<span style="color: rgba(0, 0, 0, 1)"> findViewById(R.id.editTextIPAddress);
      editTextPort </span>=<span style="color: rgba(0, 0, 0, 1)"> findViewById(R.id.editTextPort);


    }</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">2.添加网络权限</span></p>
<div class="cnblogs_code">
<pre>&lt;uses-permission android:name=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">android.permission.INTERNET</span><span style="color: rgba(128, 0, 0, 1)">"</span> /&gt;</pre>
</div>
<p>&nbsp;</p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322041021991-1623561253.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">3.定义一个socket</span></p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322042034398-2010536886.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre>Socket socket;</pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">4.编写按钮点击连接/断开程序</span></p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322044646915-1577081546.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre>MyHandler myHandler;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">使用Handler更新控件</span>
<span style="color: rgba(0, 0, 0, 1)">
myHandler </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> MyHandler();</pre>
</div>
<p>&nbsp;</p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322044746324-417983655.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre>      buttonConnect.setOnClickListener(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> View.OnClickListener() {
            @Override
            </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onClick(View view) {
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (buttonConnect.getText()==<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">连接</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">){
                  </span><span style="color: rgba(0, 0, 255, 1)">new</span> Thread(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Runnable() {
                        @Override
                        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> run() {
                            Message msg </span>= myHandler.obtainMessage();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">从消息队列拉取个消息变量</span>
                            <span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">{
                              socket </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Socket(editTextIPAddress.getText().toString(),Integer.valueOf(editTextPort.getText().toString()));
                              </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(socket.isConnected()){
                                    msg.what </span>= <span style="color: rgba(128, 0, 128, 1)">1</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置消息变量的 what 变量值 为1</span>
<span style="color: rgba(0, 0, 0, 1)">                              }
                            }</span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e){
                              msg.what </span>= <span style="color: rgba(128, 0, 128, 1)">0</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置消息变量的 what 变量值 为0</span>
<span style="color: rgba(0, 0, 0, 1)">                            }
                            myHandler.sendMessage(msg);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">插入消息队列</span>
<span style="color: rgba(0, 0, 0, 1)">                        }
                  }).start();
                }
                </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
                  </span><span style="color: rgba(0, 0, 255, 1)">try</span>{ socket.close(); }<span style="color: rgba(0, 0, 255, 1)">catch</span> (Exception e){} <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">关闭连接</span>
                  buttonConnect.setText(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">连接</span><span style="color: rgba(128, 0, 0, 1)">"</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">按钮显示连接</span>
<span style="color: rgba(0, 0, 0, 1)">                }
            }
      });</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322044818727-738164935.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Handler</span>
    <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> MyHandler extends Handler {
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> handleMessage(Message msg) {
            super.handleMessage(msg);
            </span><span style="color: rgba(0, 0, 255, 1)">switch</span><span style="color: rgba(0, 0, 0, 1)"> (msg.what){
                </span><span style="color: rgba(0, 0, 255, 1)">case</span> <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">:
                  Toast.makeText(MainActivity.</span><span style="color: rgba(0, 0, 255, 1)">this</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">连接出错</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,Toast.LENGTH_SHORT).show();
                  </span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
                </span><span style="color: rgba(0, 0, 255, 1)">case</span> <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">:
                  buttonConnect.setText(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">断开</span><span style="color: rgba(128, 0, 0, 1)">"</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">按钮显示断开</span>
                  <span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
                </span><span style="color: rgba(0, 0, 255, 1)">default</span>: <span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
            }
      }
    }</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">提示:获取IP地址和端口号,执行连接</span></p>
<div class="cnblogs_code">
<pre>socket = <span style="color: rgba(0, 0, 255, 1)">new</span> Socket(editTextIPAddress.getText().toString(),Integer.valueOf(editTextPort.getText().toString()));</pre>
</div>
<p>&nbsp;</p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322044946058-1337063344.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">当前程序</span></p>
<div class="cnblogs_code">
<pre>    EditText editTextIPAddress,editTextPort;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">输入IP地址,端口号</span>
    Button buttonConnect;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">连接按钮</span>
<span style="color: rgba(0, 0, 0, 1)">    Socket socket;

    MyHandler myHandler;</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">使用Handler更新控件</span>
<span style="color: rgba(0, 0, 0, 1)">    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      myHandler </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MyHandler();
      buttonConnect </span>=<span style="color: rgba(0, 0, 0, 1)"> findViewById(R.id.buttonConnect);
      buttonConnect.setText(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">连接</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
      editTextIPAddress </span>=<span style="color: rgba(0, 0, 0, 1)"> findViewById(R.id.editTextIPAddress);
      editTextPort </span>=<span style="color: rgba(0, 0, 0, 1)"> findViewById(R.id.editTextPort);

      buttonConnect.setOnClickListener(</span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> View.OnClickListener() {
            @Override
            </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onClick(View view) {
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (buttonConnect.getText()==<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">连接</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">){
                  </span><span style="color: rgba(0, 0, 255, 1)">new</span> Thread(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Runnable() {
                        @Override
                        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> run() {
                            Message msg </span>= myHandler.obtainMessage();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">从消息队列拉取个消息变量</span>
                            <span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">{
                              socket </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Socket(editTextIPAddress.getText().toString(),Integer.valueOf(editTextPort.getText().toString()));
                              </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(socket.isConnected()){
                                    msg.what </span>= <span style="color: rgba(128, 0, 128, 1)">1</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置消息变量的 what 变量值 为1</span>
<span style="color: rgba(0, 0, 0, 1)">                              }
                            }</span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e){
                              msg.what </span>= <span style="color: rgba(128, 0, 128, 1)">0</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置消息变量的 what 变量值 为0</span>
<span style="color: rgba(0, 0, 0, 1)">                            }
                            myHandler.sendMessage(msg);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">插入消息队列</span>
<span style="color: rgba(0, 0, 0, 1)">                        }
                  }).start();
                }
                </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
                  </span><span style="color: rgba(0, 0, 255, 1)">try</span>{ socket.close(); }<span style="color: rgba(0, 0, 255, 1)">catch</span> (Exception e){} <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">关闭连接</span>
                  buttonConnect.setText(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">连接</span><span style="color: rgba(128, 0, 0, 1)">"</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">按钮显示连接</span>
<span style="color: rgba(0, 0, 0, 1)">                }
            }
      });
    }

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Handler</span>
    <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> MyHandler extends Handler {
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> handleMessage(Message msg) {
            super.handleMessage(msg);
            </span><span style="color: rgba(0, 0, 255, 1)">switch</span><span style="color: rgba(0, 0, 0, 1)"> (msg.what){
                </span><span style="color: rgba(0, 0, 255, 1)">case</span> <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">:
                  Toast.makeText(MainActivity.</span><span style="color: rgba(0, 0, 255, 1)">this</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">连接出错</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,Toast.LENGTH_SHORT).show();
                  </span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
                </span><span style="color: rgba(0, 0, 255, 1)">case</span> <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">:
                  buttonConnect.setText(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">断开</span><span style="color: rgba(128, 0, 0, 1)">"</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">按钮显示断开</span>
                  <span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
                </span><span style="color: rgba(0, 0, 255, 1)">default</span>: <span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
            }
      }
    }</span></pre>
</div>
<p>&nbsp;</p>
<h3><span style="font-size: 18pt">接收数据</span></h3>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322051606907-1678345387.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">1.定义&nbsp;</span><span style="font-size: 18pt">InputStream 用于获取数据输入流,定义一个数组用于缓存数据</span></p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322051634128-1468265552.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre>    InputStream inputStream;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取输入流</span>
    <span style="color: rgba(0, 0, 255, 1)">byte</span>[] RevBuff = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">byte</span>[<span style="color: rgba(128, 0, 128, 1)">1460</span>];<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">缓存数据</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">2.定义一个函数,里面放一个任务,用于不停的接收数据</span></p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322051800655-1179317483.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3>&nbsp;</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> Recv(){
      </span><span style="color: rgba(0, 0, 255, 1)">new</span> Thread(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Runnable() {
            @Override
            </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> run() {
                </span><span style="color: rgba(0, 0, 255, 1)">while</span> (socket!= <span style="color: rgba(0, 0, 255, 1)">null</span> &amp;&amp;<span style="color: rgba(0, 0, 0, 1)"> socket.isConnected()){
                  </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">{
                        </span><span style="color: rgba(0, 0, 255, 1)">int</span> Len = inputStream.read(RevBuff);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取数据</span>
                        <span style="color: rgba(0, 0, 255, 1)">if</span>(Len!=-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">){
                            Message msg </span>= myHandler.obtainMessage();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">从消息队列拉取个消息变量</span>
                            msg.what = <span style="color: rgba(128, 0, 128, 1)">3</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置消息变量的 what 变量值 为3</span>
                            msg.arg1 = Len;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">接收的数据个数</span>
                            msg.obj = RevBuff;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">传递数据</span>
                            myHandler.sendMessage(msg);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">插入消息队列</span>
<span style="color: rgba(0, 0, 0, 1)">                        }
                        </span><span style="color: rgba(0, 0, 255, 1)">else</span>{<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">连接异常断开</span>
                            Message msg = myHandler.obtainMessage();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">从消息队列拉取个消息变量</span>
                            msg.what = <span style="color: rgba(128, 0, 128, 1)">0</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置消息变量的 what 变量值 为0</span>
                            myHandler.sendMessage(msg);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">插入消息队列</span>
                            <span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
                        }
                  }</span><span style="color: rgba(0, 0, 255, 1)">catch</span> (Exception e){<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">连接异常断开</span>
                        Message msg = myHandler.obtainMessage();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">从消息队列拉取个消息变量</span>
                        msg.what = <span style="color: rgba(128, 0, 128, 1)">0</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置消息变量的 what 变量值 为0</span>
                        myHandler.sendMessage(msg);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">插入消息队列</span>
                        <span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
                  }
                }
            }
      }).start();
    }</span></pre>
</div>
<h3>&nbsp;</h3>
<p>&nbsp;</p>
<h3><span style="font-size: 18pt">&nbsp;</span></h3>
<p><span style="font-size: 18pt">3.调用接收函数</span></p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322051945260-731470136.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">4.在Handle中处理数据,把数据显示在页面</span></p>
<p><span style="font-size: 18pt">4.1.获取控件</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322053849624-910945998.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">4.2.把接收的消息追加到Textview显示</span></p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322054129509-1108320109.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3><span style="font-size: 18pt">测试</span></h3>
<p><span style="font-size: 18pt">1.电脑端开启TCP服务器</span></p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322054518483-732178824.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">2.保证手机和电脑在一个局域网内</span></p>
<p><span style="font-size: 18pt">查看自己的电脑IP</span></p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322054611480-1149677138.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">3.手机连接</span></p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322054737793-233969183.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322054703458-601532226.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322054810274-95273342.png" alt=""></span></p>
<p>&nbsp;</p>
<h3><span style="font-size: 18pt">接收显示16进制数据</span></h3>
<p><span style="font-size: 18pt">1.关于16进制显示和前面的串口上位机显示16进制数据是一样的道理</span></p>
<p><span style="font-size: 18pt">https://www.cnblogs.com/yangfengwu/p/12382103.html</span></p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322055837738-1611402745.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">2.JAVA和C#提供的函数不一样,java的转换程序如下:</span></p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre>    <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 16进制byte转16进制String--用空格隔开
   * @param bytes
   * @return
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> String byteToHexStr(<span style="color: rgba(0, 0, 255, 1)">byte</span><span style="color: rgba(0, 0, 0, 1)">[] bytes)
    {   
      String str_msg </span>= <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> i = <span style="color: rgba(128, 0, 128, 1)">0</span>; i &lt; bytes.length; i++<span style="color: rgba(0, 0, 0, 1)">){   
            str_msg </span>= str_msg + String.format(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">%02X</span><span style="color: rgba(128, 0, 0, 1)">"</span>,bytes)+<span style="color: rgba(128, 0, 0, 1)">"</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
      }   
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> str_msg;   
    }</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">3.获取16进制选择控件</span></p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322060203630-1430211584.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">4.编写处理函数</span></p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322060548881-1261854594.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">&nbsp;</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3><span style="font-size: 18pt">测试</span></h3>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322060710261-1208986066.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322060737489-1698921623.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3><span style="font-size: 18pt">清除接收</span></h3>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322061007410-601808526.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3><span style="font-size: 18pt">发送数据</span></h3>
<p><span style="font-size: 18pt">1.获取控件,定义输出流变量</span></p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322063033078-1594887434.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">2.获取输出流</span></p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322063120226-1181283303.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">3.点击发送按钮发送发送文本框里面的数据</span></p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322063218463-874936040.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">4.测试</span></p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322063255304-1847797071.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322063327189-247329433.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3><span style="font-size: 18pt">发送16进制数据</span></h3>
<p><span style="font-size: 18pt">1.文本框里面输入的是字符串</span></p>
<p><span style="font-size: 18pt">假设输入的是 55FD</span></p>
<p><span style="font-size: 18pt">那么获取的是 "55FD"</span></p>
<p><span style="font-size: 18pt">需要转换为 0x55&nbsp; 0xFD</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">获取第一个字符 5&nbsp; &nbsp;&nbsp;</span><span style="font-size: 18pt">hexString.charAt(0)</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">转换为 16进制形式&nbsp;&nbsp;</span><span style="font-size: 18pt">Character.digit(hexString.charAt(0), 16)</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">获取第二个字符5&nbsp; &nbsp; &nbsp;hexString.charAt(1)</span></p>
<p><span style="font-size: 18pt">转换为 16进制形式&nbsp;&nbsp;Character.digit(hexString.charAt(1), 16)</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">然后组合成一个16进制</span></p>
<p><span style="font-size: 18pt">byte data =&nbsp; (byte) ((Character.digit(hexString.charAt(0), 16) &lt;&lt; 4) + Character</span><em id="__mceDel"><span style="font-size: 18pt">.digit(hexString.charAt(1), 16))</span></em></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">2.完整的程序如下</span></p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">**
   *"2B44EFD9" --&gt; byte[]{0x2B, 0x44, 0xEF,0xD9}
   * @param hexString
   * @return
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">byte</span><span style="color: rgba(0, 0, 0, 1)">[] hexStringToByteArray(String hexString) {
      StringBuilder sb </span>= <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
      hexString </span>= hexString.replaceAll(<span style="color: rgba(128, 0, 0, 1)">"</span> <span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">);

      </span><span style="color: rgba(0, 0, 255, 1)">if</span> ((hexString.length()%<span style="color: rgba(128, 0, 128, 1)">2</span>)!=<span style="color: rgba(128, 0, 128, 1)">0</span>) {<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">数据不是偶数</span>
            sb = <span style="color: rgba(0, 0, 255, 1)">new</span> StringBuilder(hexString);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">构造一个StringBuilder对象</span>
            sb.insert(hexString.length()-<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">0</span><span style="color: rgba(128, 0, 0, 1)">"</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">插入指定的字符串</span>
            hexString =<span style="color: rgba(0, 0, 0, 1)"> sb.toString();
      }

      </span><span style="color: rgba(0, 0, 255, 1)">int</span> len =<span style="color: rgba(0, 0, 0, 1)"> hexString.length();
      </span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] bytes = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">byte</span>;
      </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> i = <span style="color: rgba(128, 0, 128, 1)">0</span>; i &lt; len; i += <span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> ((
                  (hexString.charAt(i)</span>&gt;=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0</span><span style="color: rgba(128, 0, 0, 1)">'</span> &amp;&amp; hexString.charAt(i)&lt;=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">9</span><span style="color: rgba(128, 0, 0, 1)">'</span>) ||<span style="color: rgba(0, 0, 0, 1)">
                  (hexString.charAt(i)</span>&gt;=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">A</span><span style="color: rgba(128, 0, 0, 1)">'</span> &amp;&amp; hexString.charAt(i)&lt;=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">F</span><span style="color: rgba(128, 0, 0, 1)">'</span>) ||<span style="color: rgba(0, 0, 0, 1)">
                  (hexString.charAt(i)</span>&gt;=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(128, 0, 0, 1)">'</span> &amp;&amp; hexString.charAt(i)&lt;=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">f</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
             )</span>&amp;&amp;<span style="color: rgba(0, 0, 0, 1)">
                  (hexString.charAt(i</span>+<span style="color: rgba(128, 0, 128, 1)">1</span>)&gt;=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0</span><span style="color: rgba(128, 0, 0, 1)">'</span> &amp;&amp; hexString.charAt(i+<span style="color: rgba(128, 0, 128, 1)">1</span>)&lt;=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">9</span><span style="color: rgba(128, 0, 0, 1)">'</span>) ||<span style="color: rgba(0, 0, 0, 1)">
                  (hexString.charAt(i</span>+<span style="color: rgba(128, 0, 128, 1)">1</span>)&gt;=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">A</span><span style="color: rgba(128, 0, 0, 1)">'</span> &amp;&amp; hexString.charAt(i+<span style="color: rgba(128, 0, 128, 1)">1</span>)&lt;=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">F</span><span style="color: rgba(128, 0, 0, 1)">'</span>) ||<span style="color: rgba(0, 0, 0, 1)">
                  (hexString.charAt(i</span>+<span style="color: rgba(128, 0, 128, 1)">1</span>)&gt;=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(128, 0, 0, 1)">'</span> &amp;&amp; hexString.charAt(i+<span style="color: rgba(128, 0, 128, 1)">1</span>)&lt;=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">f</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)){
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 两位一组,表示一个字节,把这样表示的16进制字符串,还原成一个字节</span>
                bytes = (<span style="color: rgba(0, 0, 255, 1)">byte</span>) ((Character.digit(hexString.charAt(i), <span style="color: rgba(128, 0, 128, 1)">16</span>) &lt;&lt; <span style="color: rgba(128, 0, 128, 1)">4</span>) +<span style="color: rgba(0, 0, 0, 1)"> Character
                        .digit(hexString.charAt(i</span>+<span style="color: rgba(128, 0, 128, 1)">1</span>), <span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">));
            }
            </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> bytes;
    }</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">3.获取控件</span></p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322152443697-1402015732.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">4.编写处理程序</span></p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322153208692-1670797015.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">5.测试</span></p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322153419172-721437922.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322153439068-921067012.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3><span style="font-size: 18pt">补充</span></h3>
<p><span style="font-size: 18pt">让输入的内容默认显示在左上角</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322153629902-1135668290.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322153646400-1025654118.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre>android:gravity=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">top</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/yangfengwu/p/12543923.html
頁: [1]
查看完整版本: Android 开发: 通信篇-TCP客户端