前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 网络编程初探

Java 网络编程初探

作者头像
Mirror王宇阳
发布2020-11-10 23:09:00
4260
发布2020-11-10 23:09:00
举报

Java 网络编程

网络编程

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

B/S结构:

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

C/S结构:

  • 客户端/服务器模式(Client / Server)
    • 需要编写两套程序:
      • 客户端程序代码
      • 服务器程序代码
    • C/S的开发非常的繁琐,因为开发人员需要维护两套程序。(运维哭)
    • 优点:安全性能高;使用的是自己的连接端口、通信协议
TCP程序:
  • 面向连接的可靠性传输
UDP程序:
  • 面向无连接的不可靠的传输

C/S_ 网络程序

核心开发类:

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

ServerSocket:服务器端

代码语言:javascript
复制
public class ServerSocket
extends Object
implements Closeable
  • 构造方法:
代码语言:javascript
复制
public ServerSocket(int port) throws IOException;

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

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

Socket:客户端

代码语言:javascript
复制
public class Socket
extends Object
implements Closeable
  • 构造方法
代码语言:javascript
复制
public Socket(String host , int port);

连接主机的IP或域名(本机:localhost/127.0.0.1),并定义通信端口号port 套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。

  • 得到输入数据(套接字的输入流)
代码语言:javascript
复制
public InputStream getInputStream();
  • 设置输出数据(Socket类定义的方法;套接字的输出流)
代码语言:javascript
复制
public OutputStream getOutputStream() throws IOException;

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

开发实例

  • 服务器端:Server
代码语言:javascript
复制
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
代码语言:javascript
复制
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” 标记后返回。

  • 服务端
代码语言:javascript
复制
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();
	}
}
  • 客户端
代码语言:javascript
复制
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、多线程

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-07-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Java 网络编程
    • 网络编程
      • B/S结构:
      • C/S结构:
    • C/S_ 网络程序
      • 核心开发类:
      • ServerSocket:服务器端
      • Socket:客户端
      • 开发实例
    • Echo 程序开发模型(经典案例)
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
    http://www.vxiaotou.com