zoukankan      html  css  js  c++  java
  • Android Socket编程学习笔记

    通常也称作"套接字",用于描写叙述IP地址和port,是一个通信链的句柄。在Internet上的主机一般执行了多个服务软件,同一时候提供几种服务。

    每种服务都打开一个Socket。并绑定到一个port上,不同的port相应于不同的服务。

           网络上的两个程序通过一个双向的通讯连接实现数据的交换。这个双向链路的一端称为一个Socket。

    Socket通经常使用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个port号唯一确定。

           在java中。Socket和ServerSocket类库位于java .net包中。ServerSocket用于server端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例。操作这个实例。完毕所需的会话。

           以下通过一个极为简单的client和服务端的连接样例演示下最主要的android socket通信:

           服务端的代码,在服务端特定的port9999监听client请求,一旦有请求。便会运行,而后继续监听。

    使用accept()这个堵塞函数,就是该方法被调用后一直等待client的请求。直到有请求且连接到同一个port,accept()返回一个相应于client的Socket。本例中非常easy,服务端不断监听,一旦有请求就输出一段信息:

    1. <font color="#000"><font face="Arial"><span style="font-family:Comic Sans MS;font-size:18px;">import java.io.BufferedWriter;
    2. import java.io.IOException;
    3. import java.io.OutputStreamWriter;
    4. import java.net.ServerSocket;
    5. import java.net.Socket;

    6. public class Main {
    7.         private static final int PORT = 9999;
    8.         public static void main(String[] args) {

    9.                 try {
    10.                         // 实例化server套接字 设置port号9999
    11.                         ServerSocket server = new ServerSocket(PORT);
    12.                         while (true) {
    13.                                 Socket socket = server.accept();
    14.                                 // 获取输出流
    15.                                 BufferedWriter writer = new BufferedWriter(
    16.                                                 new OutputStreamWriter(socket.getOutputStream()));
    17.                                 // 写字符串
    18.                                 writer.write("这是一段来自server的问候:Hello沃德!");
    19.                                 writer.flush();
    20.                                 writer.close();
    21.                         }
    22.                 } catch (IOException e) {
    23.                         // TODO Auto-generated catch block
    24.                         e.printStackTrace();
    25.                 }

    26.         }

    27. }

    28. </span></font></font>
    复制代码
    以下是androidclient的相关内容,界面有一个button。点击后请求服务端的制定port,然后显示服务端的内容,值得注意的是在android4.0以上的系统中。是不同意在主线程里面去运行网络相关的请求。否则会报错:NetworkOnMainThreadException,所以本例中新开辟一个线程初始化socket的内容:

    1. <font color="#000"><font face="Arial"><span style="font-family:Comic Sans MS;font-size:18px;">package com.example.socketdemo;

    2. import java.io.BufferedReader;
    3. import java.io.IOException;
    4. import java.io.InputStreamReader;
    5. import java.net.Socket;
    6. import java.net.UnknownHostException;
    7. import android.annotation.SuppressLint;
    8. import android.app.Activity;
    9. import android.os.Bundle;
    10. import android.os.Handler;
    11. import android.os.Message;
    12. import android.util.Log;
    13. import android.view.View;
    14. import android.view.View.OnClickListener;
    15. import android.widget.Button;
    16. import android.widget.TextView;

    17. @SuppressLint("HandlerLeak")
    18. public class SocketDemo extends Activity {
    19.         /** Called when the activity is first created. */
    20.         private Button btn_receive;
    21.         private TextView txt;
    22.         private String line;
    23.         
    24.         private static final String HOST = "192.168.1.101";  
    25.         private static final int PORT = 9999;  


    26.         @Override
    27.         public void onCreate(Bundle savedInstanceState) {
    28.                 super.onCreate(savedInstanceState);
    29.                 setContentView(R.layout.activity_main);
    30.                 initControl();
    31.         }

    32.         private void initControl() {
    33.                 btn_receive = (Button) findViewById(R.id.btn_receive);
    34.                 txt = (TextView) findViewById(R.id.txt);
    35.                 btn_receive.setOnClickListener(new ReceiverListener());
    36.         }

    37.         
    38.         @SuppressLint("HandlerLeak")
    39.         class ReceiverListener implements OnClickListener {

    40.                 @Override
    41.                 public void onClick(View v) {
    42.                         // TODO Auto-generated method stub
    43.                         new Thread() {
    44.                                 @Override
    45.                                 public void run() {
    46.                                         // 运行完成后给handler发送一个空消息
    47.                                         try {
    48.                                                 // 实例化Socket
    49.                                                 Socket socket = new Socket(HOST, PORT);
    50.                                                 // 获得输入流
    51.                                                 BufferedReader br = new BufferedReader(
    52.                                                                 new InputStreamReader(socket.getInputStream()));
    53.                                                 line = br.readLine();
    54.                                                 br.close();
    55.                                         } catch (UnknownHostException e) {
    56.                                                 // TODO Auto-generated catch block
    57.                                                 e.printStackTrace();
    58.                                         } catch (IOException e) {
    59.                                                 // TODO Auto-generated catch block
    60.                                                 e.printStackTrace();
    61.                                         }
    62.                                         handler.sendEmptyMessage(0);
    63.                                 }
    64.                         }.start();
    65.                 }

    66.         }

    67.         // 定义Handler对象
    68.         private Handler handler = new Handler() {
    69.                 @Override
    70.                 // 当有消息发送出来的时候就运行Handler的这种方法
    71.                 public void handleMessage(Message msg) {
    72.                         super.handleMessage(msg);
    73.                         // 处理UI
    74.                         txt.setText(line);
    75.                         Log.i("PDA", "----->" + line);
    76.                 }
    77.         };

    78. }

    79. </span></font></font>
    复制代码
    效果图例如以下:

                                              
    另外在配置文件里记得加上权限:<uses-permission android:name="android.permission.INTERNET">
  • 相关阅读:
    从PowerDesigner概念设计模型(CDM)中的3种实体关系说起
    详细整数分区的问题解释
    JavaWeb显示器
    mysql中国的内容php网页乱码问题
    Linux开发环境的搭建和使用——Linux本必备软件SSH
    【Android UI设计和开发】动画(Animation)详细说明(一)
    应该是什么在预新手发“外链”(4)最终的外链的方法
    选择29部分有用jQuery应用程序插件(免费点数下载)
    设计模式--装饰图案
    Webserver管理系列:3、Windows Update
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5176389.html
Copyright © 2011-2022 走看看