ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java 网络编程初探

2019-07-16 20:00:55  阅读:152  来源: 互联网

标签:Java Socket scan 编程 client 初探 接字 public 客户端


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、多线程

标签:Java,Socket,scan,编程,client,初探,接字,public,客户端
来源: https://www.cnblogs.com/wangyuyang1016/p/11197099.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有