一、什么是Socket
Socket是基于不同的协议的网络通信的接口。Socket的英文原意是“插座”,所谓socket通常也被称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过Socket向网络发出请求或者应答网络请求。
二、Socket基本通信模型
三、使用基于TCP协议的Socket
例子程序,此例子需要两个项目,一个是Android项目作为服务器端,一个可以是Java项目作为客户端。运行时需要先在真机上面运行服务端,开启服务,然后在eclipse中运行客户端。
SocketActivity.java
- package com.android.activity;
- import java.io.InputStream;
- import java.net.DatagramPacket;
- import java.net.DatagramSocket;
- import java.net.ServerSocket;
- import java.net.Socket;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- public class SocketActivity extends Activity {
- private Button startTCPButton = null;
- private Button startUDPButton = null;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- startTCPButton = (Button)findViewById(R.id.startTCPButton);
- startTCPButton.setOnClickListener(new StartTCPButtonListener());
- startUDPButton = (Button)findViewById(R.id.startUDPButton);
- startUDPButton.setOnClickListener(new StartUDPButtonListener());
- }
- class StartTCPButtonListener implements OnClickListener{
- public void onClick(View v) {
- Thread thread = new Thread(new TCPServerThread());
- thread.start();
- }
- }
- class StartUDPButtonListener implements OnClickListener{
- public void onClick(View v) {
- Thread thread = new Thread(new UDPServerThread());
- thread.start();
- }
- }
- class TCPServerThread implements Runnable{
- //TCP的服务器端
- public void run() {
- //声明一个ServerSocket对象
- ServerSocket serverSocket = null;
- try{
- //创建一个ServerScoket对象,并让其监听点卡9999
- serverSocket = new ServerSocket(9999);
- //accept是一个阻塞的方法,只有有数据过来才执行,
- //没有接收到则不向下执行
- Socket socket = serverSocket.accept();
- //从socket对象中得到InputStream对象
- InputStream inputStream = socket.getInputStream();
- byte buffer[] = new byte[1024*4];
- int temp = 0;
- //从InputStream当中读取客户端所发生的数据
- while((temp = inputStream.read(buffer)) != -1){
- System.out.println(new String(buffer,0,temp));
- }
- }catch(Exception e){
- e.printStackTrace();
- }finally{
- try{
- serverSocket.close();
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- }
- }
- class UDPServerThread implements Runnable{
- //UDP服务器端口
- public void run(){
- try{
- //创建一个DatagramSocket对象,并制定监听的端口
- DatagramSocket socket = new DatagramSocket(9998);
- byte data[] = new byte[1024];
- //使用UDP所发送的数据包,创建一个空的DatagramPacket对象,
- //用来接收从客户端发送过来的数据
- DatagramPacket packet = new DatagramPacket(data,data.length);
- //使用receive方法接收数据
- socket.receive(packet);
- //data长度定位1024,如果传输的数据不足1024就会在后面出现乱码
- String result = new String(packet.getData(),packet.getOffset(),packet.getLength());
- System.out.println("resutl --> " + result);
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- }
- }
TCPClient.java
- package com.android.client;
- import java.io.FileInputStream;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.Socket;
- public class TCPClient {
- public static void main(String [] args){
- try{
- //创建一个Socket对象,指定服务器端口的IP和端口号
- Socket socket = new Socket("122.158.93.206",9999);
- InputStream inputStream = new FileInputStream("./txt/panghuang.txt");
- OutputStream outputStream = socket.getOutputStream();
- byte buffer[] = new byte[1024*4];
- int temp = 0;
- while((temp = inputStream.read(buffer)) != -1){
- outputStream.write(buffer,0,temp);
- }
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- }
四、使用基于UDP协议的Socket
UDPClient.java
- package com.android.client;
- import java.net.DatagramPacket;
- import java.net.DatagramSocket;
- import java.net.InetAddress;
- public class UDPClient {
- public static void main(String[] args) {
- try{
- //创建一个DatagramSocket对象
- DatagramSocket socket = new DatagramSocket(9998);
- //创建一个InetAddree
- InetAddress serverAddress = InetAddress.getByName("122.158.93.206");
- String s = "Hello Android";
- byte data[] = s.getBytes();
- DatagramPacket packet = new DatagramPacket(data,data.length,serverAddress,9998);
- socket.send(packet);
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- }