zoukankan      html  css  js  c++  java
  • Android|局域网下Android与scoket通信的实现

    因为最近实验室项目要求实现在局域网下将android app数据发送到winsock中进行保存,所以对此进行了简单学习。pc端因为是另一个同学做的,所以不做说明。

    在android端,首先添加权限:

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

     之后对app界面进行简单设计——main.xml:

        <LinearLayout  
                android:orientation="horizontal"  
                android:layout_width="match_parent"  
                android:layout_height="wrap_content">  
                <!-- 定义一个文本框,它用于接收用户的输入 -->  
                <EditText  
                    android:id="@+id/input"  
                    android:layout_width="280dp"  
                    android:layout_height="wrap_content" android:inputType=""/>  
                <Button  
                    android:id="@+id/send"  
                    android:layout_width="match_parent"  
                    android:layout_height="wrap_content"  
                    android:paddingStart="8dp"  
                    android:text="@string/send"/>  
            </LinearLayout>  
            <!-- 定义一个文本框,它用于显示来自服务器的信息 -->  
            <TextView  
                android:id="@+id/show"  
                android:layout_width="match_parent"  
                android:layout_height="match_parent"  
                android:gravity="top"  
                android:background="#ffff"  
                android:textSize="14sp"  
                android:textColor="#f000"/>  
    

     界面如下:

    创建ClientThread.java用于实现局域网下数据的传输:

    public class ClientThread implements Runnable
    {
    	private Socket s;
    	// 定义向UI线程发送消息的Handler对象
    	private Handler handler;
    	// 定义接收UI线程的消息的Handler对象
    	public Handler revHandler;
    	// 该线程所处理的Socket所对应的输入流
    	BufferedReader br = null;
    	OutputStream os = null;
    	public ClientThread(Handler handler)
    	{
    		this.handler = handler;
    	}
    	public void run()
    	{
    		try
    		{
    			s = new Socket("192.168.1.133", 8040);
    			br = new BufferedReader(new InputStreamReader(
    					s.getInputStream()));
    			os = s.getOutputStream();
    			// 启动一条子线程来读取服务器响应的数据
    			new Thread()
    			{
    				@Override
    				public void run()
    				{
    					String content = null;
    					// 不断读取Socket输入流中的内容
    					try
    					{
    						while ((content = br.readLine()) != null)
    						{
    							// 每当读到来自服务器的数据之后,发送消息通知程序
    							// 界面显示该数据
    							Message msg = new Message();
    							msg.what = 0x123;
    							msg.obj = content.toString();
    							handler.sendMessage(msg);
    						}
    					}
    					catch (IOException e)
    					{
    						e.printStackTrace();
    					}
    				}
    			}.start();
    			// 为当前线程初始化Looper
    			Looper.prepare();
    			// 创建revHandler对象
    			revHandler = new Handler()
    			{
    				@Override
    				public void handleMessage(Message msg)
    				{
    					// 接收到UI线程中用户输入的数据
    					if (msg.what == 0x345)
    					{
    						// 将用户在文本框内输入的内容写入网络
    						try
    						{
    							os.write((msg.obj.toString() + "
    ")
    									.getBytes("utf-8"));
    						}
    						catch (Exception e)
    						{
    							e.printStackTrace();
    						}
    					}
    				}
    			};
    			// 启动Looper
    			Looper.loop();
    		}
    		catch (SocketTimeoutException e1)
    		{
    			System.out.println("网络连接超时!!");
    		}
    		catch (Exception e)
    		{
    			e.printStackTrace();
    		}
    	}
    }
    

     最后创建MainActivity.java实现app中发送内容的获取等功能:

    public class MainActivity extends Activity
    {
    	// 定义界面上的两个文本框
    	EditText input;
    	TextView show;
    	// 定义界面上的一个按钮
    	Button send;
    	Handler handler;
    	// 定义与服务器通信的子线程
    	ClientThread clientThread;
    	@Override
    	public void onCreate(Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    		input = (EditText) findViewById(R.id.input);
    		send = (Button) findViewById(R.id.send);
    		show = (TextView) findViewById(R.id.show);
    		handler = new Handler() // ②
    		{
    			@Override
    			public void handleMessage(Message msg)
    			{
    				// 如果消息来自于子线程
    				if (msg.what == 0x123)
    				{
    					// 将读取的内容追加显示在文本框中
    					show.append("
    " + msg.obj.toString());
    				}
    			}
    		};
    		clientThread = new ClientThread(handler);
    		// 客户端启动ClientThread线程创建网络连接、读取来自服务器的数据
    		new Thread(clientThread).start(); // ①
    		send.setOnClickListener(new OnClickListener()
    		{
    			@Override
    			public void onClick(View v)
    			{
    				try
    				{
    					// 当用户按下发送按钮后,将用户输入的数据封装成Message
    					// 然后发送给子线程的Handler
    					Message msg = new Message();
    					msg.what = 0x345;
    					msg.obj = input.getText().toString();
    					clientThread.revHandler.sendMessage(msg);
    					// 清空input文本框
    					input.setText("");
    				}
    				catch (Exception e)
    				{
    					e.printStackTrace();
    				}
    			}
    		});
    	}
    }
    

     这样,就实现了我们想要的传输数据到pc中的功能了。

  • 相关阅读:
    oc73--NSArray使用
    oc72--NSArray排序
    oc71--NSArray2
    oc70--NSArray1
    oc69--NSMutableString
    oc68--NSString
    oc67--NSString1
    驱动人生病毒处理的简单方法(20191207)
    CentOS 安装libgdi的方法
    局域网Linux机器中病毒简单处理 .aliyun.sh 挖矿病毒 ---不彻底
  • 原文地址:https://www.cnblogs.com/jlutiger/p/8974711.html
Copyright © 2011-2022 走看看