Android 基于TCP协议的Socket通信

TCP/IP协议是一种可靠的网络协议,它在通信的两端各建立一个socket,从而在通信的两端形成网络虚拟链路。两端的程序就可以通过虚拟链路通信。java使用socket对象来代表两端的通信接口。并通过socket产生I/O流来进行网络通信
IP协议是Internet上使用的一个关键协议,通过使用IP协议,使Internet成为一个允许连接不同类型的计算机和不同操作系统的网络
TCP协议被称为一种端对端协议,提供可靠并且无差错的通讯服务。当一台计算机需要与另一台远程计算机连接时,TCP协议会让它们建立一个连接:用于发送和接受数据的虚拟链路

  • 使用ServerSocket创建TCP服务器端
    首先在eclipse上建一个java工程,里面一个类和一个线程,如下
package test;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

import thread.ServerThread;


public class MainClass {


//  public static ArrayList sockets = new ArrayList();

    public static void main(String[] args){
    try {
        //创建一个serverSocket用于监听客户端socket的连接请求
        ServerSocket ss = new ServerSocket(30000);
        //采用循环不断接受来自客户端的请求
        while(true){
        //每当接收到客户端的socket请求,服务端也对应产生一个socket,此行代码会堵塞,将一直等待别人的连接
            Socket socket  = ss.accept();
//          sockets.add(socket);
            //每当客户端连接成功后,启动一条线程为该客户端服务
            new Thread(new ServerThread(socket)).start();
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


    }
}
package thread;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.ServerSocket;
import java.net.Socket;

import test.MainClass;

public class ServerThread implements Runnable {

    Socket s = null;//定义当前线程所处理的socket
    BufferedReader br = null;//该线程所处理的socket所对应的输入流

    public ServerThread(Socket s) {
        this.s = s;
        //初始化该socket对应的输入流
        try {
            br = new BufferedReader(new InputStreamReader(s.getInputStream(),"utf-8"));
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }


    public void run() {
        // TODO Auto-generated method stub
        String content = null;
        //采用循环不断从socket中读取客户端发送过来的数据
        while((content=readFromClient())!=null){
                OutputStream ops = null;
                System.out.print(content);
                try {
                    ops = s.getOutputStream();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                try {
                     if("测试成功".equals(content)){
                            ops.write(("恭喜你!!!"+"\n").getBytes("utf-8"));
                        }

                } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
        }
    }

    private String readFromClient (){
        try {
            return br.readLine();
        } catch (IOException e) {
            // TODO Auto-generated catch block
        }
        return null;
    }

}

代码中详细说明了过程
1.创建一个serverSocket用于监听客户端socket的连接请求
ServerSocket ss = new ServerSocket(30000);
2.每当接收到客户端的socket请求,服务端也对应产生一个socket,此行代码会堵塞,将一直等待别人的连接
Socket socket = ss.accept();
3.每当客户端连接成功后,启动一条线程为该客户端服务
new Thread(new ServerThread(socket)).start();
4.采用循环,不断从socket中读取客户端发送过来的数据
while((content=readFromClient())!=null){
5.如果客户端发送的信息是“测试成功“,就返回它一条信息”恭喜你!!!“
if(“测试成功”.equals(content)){
ops.write((“恭喜你!!!”+”\n”).getBytes(“utf-8”));
}

  • TCP客户端
    1. 建议连接到远程服务器的socket,192.168.1.102是远程服务器端的ip
      socket = new Socket(“192.168.1.102”, 30000);
    2. //启动一个线程处理服务器响应的数据
 new Thread() {
                        @Override
                        public void run() {
                            String content = "";
                            try {
                                //采用循环,不断从socket中读取服务端发送过来的数据
                                while ((content = br.readLine()) != null) {
                                    sendMsg(content, 0);
                                }
                            } catch (IOException e) {
                                e.printStackTrace();
                            }

                        }
                    }.start();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

3.采用循环,不断从socket中读取服务端发送过来的数据
while ((content = br.readLine()) != null) {
4.读取到服务端发送过来的数据后显示
mDisplayContent.setText(obj0);

向服务端发送数据

``
if (ops != null) {
try {
ops.write((obj + "\r\n").getBytes("utf-8"));
} catch (Exception e) {
e.printStackTrace();
}
}

测试的时候先将服务器端的java程序运行,再开启软件,将测试信息”测试成功“发送到服务端,查看是否显示服务端的回执”恭喜你!!!“
最后,注意别忘记加internet权限。
客户端的代码提交到github:https://github.com/DevelopTogether/SocketTest.git

你可能感兴趣的:(android)