zoukankan      html  css  js  c++  java
  • 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("
    ");
    		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("
    ");
    		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("
    ");
    		scan.useDelimiter("
    ");
    		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、多线程

  • 相关阅读:
    arcgis python 把多个MXD批量导出一个PDF
    arcgis python pdf合并
    arcgis python 列出一个表所有字段
    arcgis python 随机取部分数据
    arcgis python 删除一个数据库所有数据
    python将py文件转换为pyc
    从 10.x 到 ArcGIS Pro 的 Python 迁移
    Entity Framework 6.X实现记录执行的SQL功能
    Entity Framework 5.0系列之EF概览-三种编程方式
    Entity Framework 全面教程详解(转)
  • 原文地址:https://www.cnblogs.com/wangyuyang1016/p/11197099.html
Copyright © 2011-2022 走看看