Android Day19 Socket网络编程

内容

Ⅰ简单介绍

ⅡSocket详解

具体内容

Ⅰ简单介绍

1.网络编程的定义
网络编程是指在两台不同的计算机之间传递数据,在两台不同的计算机之间传递数据

2.客户端:手机app 浏览器 桌面QQ
服务器端:存储/处理数据

3.ip地址:唯一标识某一台电脑
端口号:唯一标识电脑上的某一个进程(程序)

4.网络中的数据传输:Socket实现->套接字
Socket类:客户端
ServerSocket:服务器端

ⅡSocket详解

1.创建Socket

    // 指明和谁通信:ip地址 端口号
    Socket socket = new Socket("10.129.7.161", 8989);

2.Socket发送数据
要通过Socket发送数据,我们需要获取Socket的输出流

  BufferedReader br = new BufferedReader(newInputStreamReader(socket.getInputStream()));
    //向服务器端发送数据
    //socket.getOutputStream();
    String line = null;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }

    //客户向服务器端发送数据
    PrintStream ps = new PrintStream(socket.getOutputStream());
    ps.println("你好啊");

注意调用flush()方法只是将数据写入操作系统缓存中,并不保证数据会立即发送
3.Socket读取数据
要通过Socket读取数据,需要获取Socket的输入流

 InputStream in = socket.getInputStream(); 
 int data = in.read();
 in.close();
 socket.close();

需要注意的是,从Socket的输入流中读取数据并不能读取文件那样,一直调用read()方法直到返回-1为止,因为对Socket而言,只有当服务端关闭连接时,Socket的输入流才会返回-1,而是事实上服务器并不会不停地关闭连接

4.Socket关闭
使用完Socket之后需要把它关闭,断开与服务器的连接
只需要使用close方法即可

   socket.close();

5.具体应用时创建客户端Client和服务器端Server两个类
模拟客户端

class Client {
public static void main(String[] args) throws IOException {
    //1.创建用于通信的socket
    // 指明和谁通信:ip地址 端口号
    Socket socket = new Socket("10.129.7.161", 8989);
    //接收服务器端的数据
    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    //向服务器端发送数据
    //socket.getOutputStream();
    String line = null;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
      }

    //客户向服务器端发送数据
    PrintStream ps = new PrintStream(socket.getOutputStream());
    ps.println("你好啊");
}
}

模拟服务器端

class Server {
public static void main(String[] args) throws IOException {
    //1.创建服务器端的serversocket
    ServerSocket ss = new ServerSocket(8989);


    //2.获取连接的客户端的socket
    Socket clientSocket = ss.accept();

    //3.向客户端发送数据
    //BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
    PrintStream ps = new PrintStream(clientSocket.getOutputStream());
    ps.println("登陆成功");

    clientSocket.shutdownOutput();

    //4.接收客户端发来的数据
    BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    String line = null;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
      }
  }
}

6.创建一个子线程客户端处理服务器端的数据
实现Runnable接口

class ClientThread implements Runnable {
//保存socket对象
private Socket socket;

public ClientThread(Socket socket) {
    this.socket = socket;
}

@Override
public void run() {
    BufferedReader br = null;
    try {
        //获取服务器端的输入流对象
        br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        //读取数据
        String line = null;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
    } catch (IOException e) {
        System.out.println("网络出错 请重新登录");
        System.exit(-1);
    } finally {
        try {

            if (br != null) {
                br.close();
            }
            if (socket != null) {
                socket.close();
            }
        } catch (IOException e) {
        }
     }
  }
}

你可能感兴趣的:(Android Day19 Socket网络编程)