美文网首页
Java中的网络编程

Java中的网络编程

作者: 黑铁选手 | 来源:发表于2019-08-21 19:31 被阅读0次

    目的

    1、熟练掌握Java语言的网络编程
    2、学会代码实现客户端与服务器端、客户端与客户端、两台不同计算机之间的数据传递
    3、了解相关基础知识

    相关技术、及其使用

    1、网络相关知识:
    (1)客户端: 用户使用的端口
    (2)服务器端:存储和处理数据的地方
    (3)URL:统一的资源定位
    (4)域名: 类似于:www.baidu.com
    (5)IP地址:唯一标识某一台电脑的地址,32位:分成四个部分,每个部分8个字节
    (6)端口号:唯一标识某台电脑上的某一进程(程序)
    (7)http://www.baidu.com/search?code =android:HTTP和HTTPS协议、域名、search(对应的后台程序)、?(表示运行这个程序需要传递的参数)、code =android code是服务器端规定的字段、&如果有多个参数使用&符号链接
    (8)数据传输协议:TCP/IP协议
    TCP:面向连接的 安全的
    UDP:面向无连接的,不安全的,但是快速的
    (9)数据传输:Socket实现 -> 套接字
    Socket类:客户端
    ServerSocket:服务器端(两者不能单独使用)
    (10)读取数据:
    读取数据:服务器读取 客户端读取 BufferedReader->inputStreamReader ->socket.getInputStream
    终端读取:BufferedReader->inputStreamReader ->System.in
    输出:客户端输出 服务器端输出
    BufferedWriter -> OutputStreamWriter -> socket.getOutputStream
    PrintStream -> socket.getOutputStream

    2、具体使用
    首先,模拟客户端
    (1)创建用于通讯的socket对象,指明IP地址和端口号

     /*1、创建用于通讯的socket
            指明和谁通讯:IP地址 端口号
          */
         Socket socket = new Socket("127.0.0.1",8989);
    

    (2)接收服务器端的数据

    //接收服务器端的数据
         //InputStream inputStream = socket.getInputStream();
         BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    

    (3)客户端打印从服务器端获取的数据

    String line = null;
         while((line = br.readLine()) != null){
             System.out.println(line);
            }
    
    

    (4)客户端向服务器端发送数据

     PrintStream ps = new PrintStream(socket.getOutputStream());
         ps.println("你好");
         socket.shutdownOutput();
    

    其次,创建服务器端
    (1)创建服务器端的ServerSocket对象

            // 1、创建服务器端的ServerSocket
            ServerSocket ss = new ServerSocket(8989);
    
    

    (2)获取连接的客户端的socket

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

    (3)服务器端向客户端发送数据

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

    相关延伸:
    (1)客户端输入相关数据与服务器端进行交互时:
    相关代码大致相同,但是,客户端在打印相应数据时,可能会出现IO异常,那么,出现这种异常就需要手动处理,不能抛出给外部处理:

    try {
           socket = new Socket("127.0.0.1",8888);
    
                 //接受服务器端信息
                //从键盘输入数据 发送给服务器端
                BufferedReader 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("网络出错,请重新登录");
            }finally {
                //出现错误就关闭连接
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    

    而服务器端也需要手动处理IO异常。另外,
    服务器端是从终端接收用户输入的数据(因为用户输入数据上传到终端)

    //从终端接收数据
                BufferedReader keyin = new BufferedReader(new InputStreamReader(System.in));
    
    

    (2)客户端上传文件到服务器端
    首先,在上面客户端与服务器端交互的代码基础上实现两者之间的交互。
    然后,客户端里面需要先想服务器端写入内存:
    1.将文件写入内存:

    //1、将文件写入内存
            String path = "C:/Users/asus/Desktop/1.jpg";
            FileInputStream fis = new FileInputStream(path);
    
    

    注意:文件的路径要保证正确
    2.创建字节流的OutputStream

     //2、创建字节流的outputStream
            BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
            byte[] buf = new byte[1024];
            int len = -1;
            while ((len = fis.read(buf)) != -1){
                bos.write(buf, 0,len);
            }
            socket.shutdownOutput();
    

    注意:这个地方我们是发送的图片,所以用字节流发送和打印
    服务器端:
    1.设置正确的文件写入的路径

    String path = "D:/Andriod/day85/java5/src/main/java/day13/day13media/1.jpg";
            FileOutputStream fos = new FileOutputStream(path);
            byte [] buf = new byte[1024];
            int len = -1;
            while ((len = bis.read(buf)) != -1){
                fos.write(buf,0,len);
            }
    

    (3)多个客户端之间进行互相通讯
    对聊:
    客户端:
    主线程:用于接收终端输入同时将终端的输入发送给终端服务器
    子线程:接收终端服务器发过来的数据
    服务器端:
    主线程:接收终端输入同时将终端输入发送给客户端
    子线程:接收客户端发来的数据
    实现对聊和上面的主要区别在于:
    需要创建客户端和服务器端的子线程处理对应端口接收的数据
    群聊:
    群聊和对聊实现的主要区别在于:需要创建多个客户端的子线程分别接收从服务器端传来的数据。

    感想

    学习的Java语言中的网络方面的知识,感觉并不是很难,都是死点子,比如说:接收数据和输出数据时,客户端和服务器端都是相同的操作。同时,特别注意一点就是从客户端上传文件到服务器端时,一定要保证文件路径一定要正确和找的到,同时,在处理时,还需要自己处理IO异常。

    相关文章

      网友评论

          本文标题:Java中的网络编程

          本文链接:https://www.haomeiwen.com/subject/qkgisctx.html