JAVA网络编程

(一)网络编程

  • 概念:在两台不同的计算机之间传递数据
  • 客户端::手机app 浏览器 桌面qq等应用程序
  • 服务器端:存储/处理数据

(二)URL

  • 什么是URL:统一的资源定位
    示列:http://www.baidu.com/search?code=android&type = 1
  • http/https:传输协议
  • www.baidu.com:域名表示一台网络中的电脑
  • ipv4 ipv6地址:唯一标识一台网络中的计算机
  • DNS服务器:域名解析 将www.baidu.com解析为对应的ip地址
  • search:对应的后台程序文件
  • ?:表示运行这个程序需要传递的参数
  • code=android code是服务器端规定的字段 如果有多个参数使用&符号链接
  • ip地址:唯一标识某一台电脑
  • 端口号:唯一标识电脑上的某一个进程

(三)网络中数据传输

  • 数据传输:TCP/IP协议
  • TCP:面向连接的 安全的
  • UDP:面向无连接的 不安全 但是快
  • 编程方法:
    Socket:客户端
    ServerSocket:服务器端

(四)模拟客户端

//1.创建用于通信的Socket
//指明和谁通信:ip地址 端口号

        Socket socket = new Socket("10.128.132.39",7171);

//接收服务器端的数据

        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("你好啊");
        socket.shutdownOutput();

(五)模拟服务器

//1.创建服务器端的serversocket

        ServerSocket ss =new ServerSocket(7171);

//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);
        }

(六)小结:

在创建客户端和服务端时,都需要使用main函数才能有一个进行的端口,这是与普通类不同的。搞清楚是进行数据的输入还是输出,数据都是靠流进行传输的,服务器端需要获取客户端的socket才能实现数据交互。同时传输的数据可以是图片、音频等。

(七)使用多线程实现客户端和服务器端相互的数据传输

客户端与服务器端的主线程实现功能都与之前大致相同

  • 客户端子线程:处理客户端接收服务器端数据

1.创建一个Runnable的接口,获取客户端的socket

class ClientThread implements Runnable{
    private Socket socket;
    public ClientThread(Socket socket){
        this.socket = socket;
    }

2.重写run方法,接收从服务器端的数据

    @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) {
                    e.printStackTrace();
                }
        }
    }
}
  • 服务器端子线程:处理服务器端接收客户端的数据

1.创建一个类继承于Thread

class ServerThread extends Thread{
    private Socket socket;
    public ServerThread(Socket socket){
        this.socket = socket;
    }

2.重写run方法,实现接收客户端的数据

    @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) {
            e.printStackTrace();
        }
    }
 }
}

(八)今日小结:

哇,今天真的是挺迷茫的一天,感觉就手能跟上节奏了,脑子完全转不过来了,写出来的东西也有很多无法实现,是说话今天真的很迷,只不过下来靠着一步步的看代码,大概了解每一步为什么该这样做了,但是让我单独写肯定是写出不出来了。看来修行之路还很漫长。

你可能感兴趣的:(JAVA网络编程)