Socket通常称为套接字,是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。应用程序通常通过套接字向网络发出请求或者应答网络请求。
★★★★★★Socket的基本操作:
连接远程服务器、发送数据、接收数据、关闭连接、绑定端口、监听到达数据、在绑定端口上接受远程机器的连接。
服务器要和客户端通信,两者都要实例化一个Socket。服务器和客户端的Socket是不一样的,客户端可以实现连接远程机器、发送数据、接收数据、关闭连接等,服务器还需要实现绑定端口、监听到达的数据、接受来自远程机器的连接。Android在包java.net里面提供了两个类:ServerSocket和Socket,前者用于实例化服务器的Socket,后者用于实例化客户端的Socket。在连接成功后,应用程序两端都会产生一个Socket实例,操作这个实例完成客户端到服务器所需的会话。
★★★★★★Socket的构造函数代码举例:
package com.study.socket;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
/**
* @author 晓康 TCP客户端工作的主要步骤: ★调用Socket()创建一个流套接字,并连接到服务器端。
* ★★调用Socket类的getOutputStream()和getInputStream()方法获取输出和输入流,开始网络数据的发送和接收。
* ★★★关闭通信套接字。
*/
// 0~1023端口为系统保留,用户设定的端口号应该大于1023
private static final int TCP_SERVE_PORT = 50001;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
// 初始化Socket,TCP_SERVE_PORT为指定的端口,int类型
Socket socket = new Socket("localhost", TCP_SERVE_PORT);
// 获取输入流
BufferedReader in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
// 生成输出流
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream()));
// 生成输出内容
String outMsg = "Tcp connecting to" + TCP_SERVE_PORT
+ System.getProperty("line.separator");
// 写入
out.write(outMsg);
// 刷新,发送
out.flush();
// 获取输入流
String inMsg = in.readLine() + System.getProperty("line.separator");
Log.i("TcpClient", "received:" + inMsg);
// 关闭连接
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
★★★★★★ServerSocket的构造函数代码举例:
package com.study.serversocket;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class serversocket {
/**
* @author 晓康
* TCP服务器端工作的主要步骤 ★调用ServerSocket(int,port)创建一个ServerSocket,并绑定到指定端口上。
* ★★调用accept(),监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字。
* ★★★调用Socket类的getOutputStream()和getInputStream()获取输出和输入流,
* 开始网络数据的 发送和接收。
*/
private static final int TCP_SERVER_PORT = 51001;
public static void main(String[] args) {
ServerSocket serverSocket = null;
try {
// TCP_SERVER_PORT为指定的绑定端口,为int类型
serverSocket = new ServerSocket(TCP_SERVER_PORT);
// 监听连接请求
Socket socket = serverSocket.accept();
// 写入读Buffer中
BufferedReader in = new BufferedReader(new
// 获取输入流
InputStreamReader(socket.getInputStream()));
// 放到写Buffer中
BufferedWriter out = new BufferedWriter(new
// 获取输出流
OutputStreamWriter(socket.getOutputStream()));
// 读取接收信息,转换成字符串
String incomingMsg = in.readLine() + System.getProperty("line.separator");
// 生成发送字符串
String outgoingMsg = "goodbye from port " + TCP_SERVER_PORT + System.getProperty("line.separator");
// 将发送字符串写入上面定义的BufferedWriter中
out.write(outgoingMsg);
// 刷新,发送
out.flush();
// 关闭
socket.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 判定是否初始化ServerSocket对象,如果初始化则关闭serversocket
if (serverSocket != null) {
try {
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
★★★★★★★★无论是客户端还是服务端,都要在Android配置文件中添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>