您的位置:首页 > 移动开发 > Android开发

Android Socket编程学习笔记

2016-02-01 21:46 597 查看
通常也称作"套接字",用于描写叙述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,服务端不断监听,一旦有请求就输出一段信息:

<font color="#000"><font face="Arial"><span style="font-family:Comic Sans MS;font-size:18px;">import java.io.BufferedWriter;

import java.io.IOException;

import java.io.OutputStreamWriter;

import java.net.ServerSocket;

import java.net.Socket;

public class Main {

private static final int PORT = 9999;

public static void main(String[] args) {

try {

// 实例化server套接字 设置port号9999

ServerSocket server = new ServerSocket(PORT);

while (true) {

Socket socket = server.accept();

// 获取输出流

BufferedWriter writer = new BufferedWriter(

new OutputStreamWriter(socket.getOutputStream()));

// 写字符串

writer.write("这是一段来自server的问候:Hello沃德!");

writer.flush();

writer.close();

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

</span></font></font>

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

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

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.Socket;

import java.net.UnknownHostException;

import android.annotation.SuppressLint;

import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.TextView;

@SuppressLint("HandlerLeak")

public class SocketDemo extends Activity {

/** Called when the activity is first created. */

private Button btn_receive;

private TextView txt;

private String line;

private static final String HOST = "192.168.1.101";

private static final int PORT = 9999;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initControl();

}

private void initControl() {

btn_receive = (Button) findViewById(R.id.btn_receive);

txt = (TextView) findViewById(R.id.txt);

btn_receive.setOnClickListener(new ReceiverListener());

}

@SuppressLint("HandlerLeak")

class ReceiverListener implements OnClickListener {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

new Thread() {

@Override

public void run() {

// 运行完成后给handler发送一个空消息

try {

// 实例化Socket

Socket socket = new Socket(HOST, PORT);

// 获得输入流

BufferedReader br = new BufferedReader(

new InputStreamReader(socket.getInputStream()));

line = br.readLine();

br.close();

} catch (UnknownHostException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

handler.sendEmptyMessage(0);

}

}.start();

}

}

// 定义Handler对象

private Handler handler = new Handler() {

@Override

// 当有消息发送出来的时候就运行Handler的这种方法

public void handleMessage(Message msg) {

super.handleMessage(msg);

// 处理UI

txt.setText(line);

Log.i("PDA", "----->" + line);

}

};

}

</span></font></font>

复制代码
效果图例如以下:





另外在配置文件里记得加上权限:<uses-permission android:name="android.permission.INTERNET">
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: