Java 网络编程初探

2019-08-16 10:28:03来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

Java 网络编程初探

Java 网络编程

网络编程

  • 网络编程:进行服务器端与客户端编程的开发操作实现。

  • java.net:网络操作包

B/S结构:

  • 浏览器/服务器模式(Browser/Server)
    • 不在开发客户端代码
      • 开发一套服务器端的程序代码
      • 客户端利用浏览器进行访问
    • 维护方便,安全性能低(使用公共的HTTP协议和80端口)

C/S结构:

  • 客户端/服务器模式(Client / Server)

    • 需要编写两套程序:
      • 客户端程序代码
      • 服务器程序代码
    • C/S的开发非常的繁琐,因为开发人员需要维护两套程序。(运维哭)

    • 优点:安全性能高;使用的是自己的连接端口、通信协议

TCP程序:

  • 面向连接的可靠性传输

UDP程序:

  • 面向无连接的不可靠的传输

C/S_ 网络程序

核心开发类:

  • 服务端类:ServerSocket
    • 工作在服务器端,用于接收用户的请求
  • 客户端类:Socket
    • 每一个连接到服务器端上的用户都通过Socket表示

ServerSocket:服务器端

public class ServerSocket
extends Object
implements Closeable
  • 构造方法:
public ServerSocket(int port) throws IOException;

参数:port ==> 设置监听信息包的端口号

  • 接收连接(来自客户端的连接)(Socket类定义的方法)
public Socket accept() throws IOException;
  • 设置输出数据(Socket类定义的方法;套接字的输出流)
public OutputStream getOutputStream() throws IOException;

Socket:客户端

public class Socket
extends Object
implements Closeable
  • 构造方法
public Socket(String host , int port);

连接主机的IP或域名(本机:localhost/127.0.0.1),并定义通信端口号port

套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。

  • 得到输入数据(套接字的输入流)
public InputStream getInputStream();
  • 设置输出数据(Socket类定义的方法;套接字的输出流)
public OutputStream getOutputStream() throws IOException;

套接字的输入输出流:在客户端套接字的输入流获取服务端的套接字的输出流

开发实例

  • 服务器端:Server
import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
    
// c/s ==> 服务端

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(1024);// 端口号 port
        // 连接客户端
        System.out.println(">>> 等待客户端连接 ... <<<");
        Socket client = server.accept();//等待客户端发来连接请求
        PrintStream out = new PrintStream(client.getOutputStream());
        // 利用打印流完成输出,向客户端输出信息;
        // client.getOutputStream()返回的是输出流的对象
        out.println("Hello,World!");
        out.close();
        client.close();
        server.close();
    }
}
  • 客户端:Client
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

// c/s ==> 客户端 
public class Client {
    public static void main(String[] args) throws UnknownHostException, IOException {
        Socket client = new Socket("localhost",1024); // 连接服务端
        // 取得客户端的输入数据流对象 ==> 接收来自服务器端的输出信息(流)
        Scanner scan = new Scanner(client.getInputStream());
        // client.getInputStream()返回的是输入流的对象
        scan.useDelimiter("\n");
        if (scan.hasNext()) {
            System.out.println(scan.next());
        }
        scan.close();
        client.close();
    }
}

Echo 程序开发模型(经典案例)

客户端随意的向服务器端输送信息,服务端接收信息后,在信息前面加上 “ECHO” 标记后返回。

  • 服务端
public class EchoServer {
    public static void main(String [] args) throws Exception{
        ServerSocket server = new ServerSocket(512);
        Socket client = server.accept();//接收客户端的连接  
        Scanner scan = new Scanner(client.getInputStream());//接收套接字输入流(对象)
        PrintStream out = new PrintStream(client.getOutputStream());//设置套接字输出流(对象)
        scan.useDelimiter("\n");
        System.out.println(">>> 连接准备 <<<");
        boolean flag = true ; //控制连接的结束
        while (flag) {
            if (scan.hasNext()) {
                String str = scan.next() ; //客户端发送的内容
                if (str.equalsIgnoreCase("bye")) {
                    flag = false;
                    out.println("bye!");
                } else {
                    out.println("ECHO:" + str);
                }
            }
        }
        client.close();
        out.close();
        server.close();
        scan.close();
    }
}
  • 客户端
public class EchoClient {
    public static void main(String[] args) throws UnknownHostException, IOException {
        Socket client = new Socket("localhost",512);
        Scanner scan = new Scanner(client.getInputStream());
        PrintStream out = new PrintStream(client.getOutputStream());
        Scanner in = new Scanner(System.in);// 利用扫描流从键盘输入
        in.useDelimiter("\n");
        scan.useDelimiter("\n");
        boolean flag = true;
        while (flag) {
            if (in.hasNext()) {
                String str = in.next();//获取数据(输入数据)
                out.println(str);
                if(str.equalsIgnoreCase("bye")) {
                    flag = false ;
                }
                if(scan.hasNext()) {
                    System.out.println(scan.next());
                }
            }
        }
        client.close();
        scan.close();
        out.close();
        in.close();
    }
}

服务开发的基础要素:网络支持类、IO、多线程


原文链接:https://www.cnblogs.com/wangyuyang1016/p/11197099.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:java反射

下一篇:spring boot入门,看这篇文章就够了