当前位置:   article > 正文

Android开发(三):Android手机与Ubuntu系统使用socket无线通信(TCP协议)_ubuntu上建了socket服务器,手机无法访问

ubuntu上建了socket服务器,手机无法访问

一、准备工作

 

Android手机和和Ubuntu系统连接同一台路由器,即它们处在同一个网段下。

Android ip地址为:192.168.3.11

Ubuntu ip地址为:192.168.3.18

二、Ubuntu服务器(server)端

我们将Ubuntu设为服务器端,服务器端Python代码为:

  1. import socket
  2. HOST_IP = "192.168.3.18" # 主机作为AP热点的ip地址
  3. HOST_PORT = 7654 # 端口号
  4. print("Starting socket: TCP...")
  5. socket_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建socket
  6. print("TCP server listen @ %s:%d!" % (HOST_IP, HOST_PORT))
  7. host_addr = (HOST_IP, HOST_PORT)
  8. socket_tcp.bind(host_addr) # 绑定主机的ip地址和端口号
  9. socket_tcp.listen(1) # listen函数的参数是监听客户端的个数,这里只监听一个,即只允许与一个客户端创建连接
  10. while True:
  11. print('waiting for connection...')
  12. socket_con, (client_ip, client_port) = socket_tcp.accept() # 接收客户端的请求
  13. print("Connection accepted from %s." % client_ip)
  14. send_str = "this is string example....wow!!!"
  15. send_byte=send_str.encode()
  16. socket_con.send(send_byte) # 发送数据
  17. while True:
  18. data = socket_con.recv(1024) # 接收数据
  19. if data: # 如果数据不为空,则打印数据,并将数据转发给客户端
  20. print(data)
  21. socket_con.send(data)
  22. socket_tcp.close()

三、Android客户(client)端

1、AndroidManifest.xml中添加权限

  1. <uses-permission android:name="android.permission.INTERNET"/>
  2. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

2、activity_main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:orientation="vertical"
  8. tools:context=".MainActivity">
  9. <TextView
  10. android:layout_width="match_parent"
  11. android:layout_height="wrap_content"
  12. android:text="设备控制"/>
  13. <EditText
  14. android:layout_width="match_parent"
  15. android:layout_height="wrap_content"
  16. android:id="@+id/et_send"/>
  17. <Button
  18. android:layout_width="match_parent"
  19. android:layout_height="wrap_content"
  20. android:text="发送"
  21. android:id="@+id/bt_send"/>
  22. <TextView
  23. android:layout_width="match_parent"
  24. android:layout_height="wrap_content"
  25. android:text="接收到的信息:"/>
  26. <TextView
  27. android:layout_width="match_parent"
  28. android:layout_height="wrap_content"
  29. android:id="@+id/tv_recv"/>
  30. </LinearLayout>

3、MainActivity.java

  1. package com.example.mysocket;
  2. import android.os.Bundle;
  3. import android.os.Handler;
  4. import android.support.v7.app.AppCompatActivity;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. import android.widget.Button;
  8. import android.widget.EditText;
  9. import android.widget.TextView;
  10. import java.io.BufferedReader;
  11. import java.io.BufferedWriter;
  12. import java.io.IOException;
  13. import java.io.InputStream;
  14. import java.io.InputStreamReader;
  15. import java.io.OutputStream;
  16. import java.io.OutputStreamWriter;
  17. import java.io.PrintWriter;
  18. import java.net.Socket;
  19. public class MainActivity extends AppCompatActivity {
  20. private EditText et_send;
  21. private Button bt_send;
  22. private TextView tv_recv;
  23. private String send_buff=null;
  24. private String recv_buff=null;
  25. private Handler handler = null;
  26. Socket socket = null;
  27. @Override
  28. protected void onCreate(Bundle savedInstanceState) {
  29. super.onCreate(savedInstanceState);
  30. setContentView(R.layout.activity_main);
  31. initView();
  32. handler = new Handler();
  33. //单开一个线程来进行socket通信
  34. new Thread(new Runnable() {
  35. @Override
  36. public void run() {
  37. try {
  38. socket = new Socket("192.168.3.18" , 7654);
  39. if (socket!=null) {
  40. System.out.println("###################");
  41. while (true) { //循环进行收发
  42. recv();
  43. send();
  44. }
  45. }
  46. else
  47. System.out.println("socket is null");
  48. } catch (IOException e) {
  49. e.printStackTrace();
  50. }
  51. }
  52. }).start();
  53. send();
  54. }
  55. private void recv() {
  56. //单开一个线程循环接收来自服务器端的消息
  57. InputStream inputStream = null;
  58. try {
  59. inputStream = socket.getInputStream();
  60. } catch (IOException e) {
  61. e.printStackTrace();
  62. }
  63. if (inputStream!=null){
  64. try {
  65. byte[] buffer = new byte[1024];
  66. int count = inputStream.read(buffer);//count是传输的字节数
  67. recv_buff = new String(buffer);//socket通信传输的是byte类型,需要转为String类型
  68. System.out.println(recv_buff);
  69. } catch (IOException e) {
  70. e.printStackTrace();
  71. }
  72. }
  73. //将受到的数据显示在TextView上
  74. if (recv_buff!=null){
  75. handler.post(runnableUi);
  76. }
  77. }
  78. //不能在子线程中刷新UI,应为textView是主线程建立的
  79. Runnable runnableUi = new Runnable() {
  80. @Override
  81. public void run() {
  82. tv_recv.append("\n"+recv_buff);
  83. }
  84. };
  85. private void send() {
  86. bt_send.setOnClickListener(new View.OnClickListener() {
  87. @Override
  88. public void onClick(View v) {
  89. new Thread(new Runnable() {
  90. @Override
  91. public void run() {
  92. send_buff = et_send.getText().toString();
  93. //向服务器端发送消息
  94. System.out.println("------------------------");
  95. OutputStream outputStream=null;
  96. try {
  97. outputStream = socket.getOutputStream();
  98. } catch (IOException e) {
  99. e.printStackTrace();
  100. }
  101. if(outputStream!=null){
  102. try {
  103. outputStream.write(send_buff.getBytes());
  104. System.out.println("1111111111111111111111");
  105. outputStream.flush();
  106. } catch (IOException e) {
  107. e.printStackTrace();
  108. }
  109. }
  110. }
  111. }).start();
  112. }
  113. });
  114. }
  115. private void initView() {
  116. et_send = (EditText) findViewById(R.id.et_send);
  117. bt_send = (Button) findViewById(R.id.bt_send);
  118. tv_recv = (TextView) findViewById(R.id.tv_recv);
  119. }
  120. }

四、测试结果

服务器端:

客户端:

 

五、参考

树莓派与Android客户端进行socket通信

安卓编程WiFi TCP通信错误

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/252201
推荐阅读
相关标签
  

闽ICP备14008679号