2020-11-07

网络编程

网络编程的实质就是已经建立好的计算机网络的基础之上,通过使用程序控制的特定方式,让两个(或多个)设备(例如计算机)之间进行数据传输。

java中的网络编程并不要求我们之前对计算机网络的知识有那么深入的研究,只需对网络的概念有基本的认识,并了解IP地址、端口号、URL等内容,这样就能够学习并使用JDK中提供的网络编程的API

java中和网络编写相关的API都在java.net包下面
C/S架构的全称是Client/Server,即客户端服务器端架构,客户端包含一个或多个在用户的电脑上运行的程序,而服务器端可以使用Socket来实现,服务器端的程序通过Socket与客户端的程序通信。

C/S 架构也可以看做是胖客户端架构,因为客户端需要实现很多的业务逻辑和界面展示功能。这种架构中,作为客户端的部分需要承受很大的压力,因为显示逻辑和事务处理都包含在其中。
优点:
	C/S架构的界面和操作可以很丰富。
	安全性能可以很容易保证。
	响应速度较快。

缺点:
	适用面窄,通常用于局域网中。
	用户群固定,由于程序需要安装才可使用,因此不适合面向一些不可知的用户。
	维护成本高,软件进行一次升级,则所有客户端的程序都需要改变。

测试客户端与服务器端通信
Server:

package com.work;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server1 {
	public static void main(String[] args) {

		ServerSocket server = null;
		Socket sock = null;
		try {
			server = new ServerSocket(7777);
			System.out.println("服务器已经启动");
			while (true) {
				sock = server.accept();
				System.out.println("ip地址是:" + sock.getInetAddress());
				System.out.println("端口号是:" + sock.getPort());
				Thread t1 = new MyThread(sock);
				t1.start();
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

class MyThread extends Thread {
	public Socket sock;

	public MyThread(Socket sock) {
		this.sock = sock;
	}

	public synchronized void run() {
		BufferedReader in = null;
		PrintWriter out = null;
		try {
			in = new BufferedReader(new InputStreamReader(sock.getInputStream(), "gbk"));
			out = new PrintWriter(new OutputStreamWriter(sock.getOutputStream(), "gbk"));
			String line = null;
			while (!"bye".equals(line = in.readLine())) {
				out.println(Thread.currentThread().getName() + ",你好" + line);
				out.flush();
				System.out.println("客户端发送的" + Thread.currentThread().getName() + ":" + line);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				in.close();
				out.close();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
	}
}

Client

package com.work;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class client1 {
	@SuppressWarnings("resource")
	public static void main(String[] args) {
		PrintWriter out = null;
		BufferedReader in = null;
		try {
			Socket sock = new Socket("127.0.0.1", 7777);
			out = new PrintWriter(new OutputStreamWriter(sock.getOutputStream(), "gbk"));
			in = new BufferedReader(new InputStreamReader(sock.getInputStream(), "gbk"));

			while (true) {
				Scanner scan = new Scanner(System.in);
				System.out.println("请输入要发送给服务器的话:");
				String str = scan.nextLine();
				out.println(str);
				out.flush();
				String line = in.readLine();
				System.out.println("接收到服务器的:" + line);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				in.close();
				out.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
	}
}

结果分析:
1、 用Telnet测试:
(1)先开启服务器
在这里插入图片描述Telnet远程访问:

在这里插入图片描述
在这里插入图片描述再次启动一个客户端
在这里插入图片描述在这里插入图片描述输入bye结束通信:
在这里插入图片描述运用client通信:
在这里插入图片描述在这里插入图片描述下期再见!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
可以使用 Java 中的 LocalDateTime 类来处理时间。 首先,我们需要将给定的时间段转换为 LocalDateTime 对象: ```java LocalDateTime start = LocalDateTime.of(2020, 11, 20, 0, 0, 0); LocalDateTime end = LocalDateTime.of(2021, 10, 9, 23, 59, 59); ``` 这里将结束时间设置为 23:59:59 是因为我们想要包含该日期的所有时间。 接下来,我们可以使用一个循环来遍历时间段中的每一天,并获取该天的开始时间和结束时间: ```java LocalDateTime current = start; while (!current.isAfter(end)) { LocalDateTime dayStart = current.withHour(0).withMinute(0).withSecond(0).withNano(0); LocalDateTime dayEnd = current.withHour(23).withMinute(59).withSecond(59).withNano(999999999); System.out.println("Day " + current.toLocalDate() + " starts at " + dayStart + " and ends at " + dayEnd); current = current.plusDays(1); } ``` 这里,我们使用 `withHour`、`withMinute`、`withSecond` 和 `withNano` 方法来设置每天的开始时间和结束时间。然后,我们可以使用 `plusDays` 方法来增加 `current` 对象的日期,以便遍历整个时间段。 完整代码如下: ```java import java.time.LocalDateTime; public class Main { public static void main(String[] args) { LocalDateTime start = LocalDateTime.of(2020, 11, 20, 0, 0, 0); LocalDateTime end = LocalDateTime.of(2021, 10, 9, 23, 59, 59); LocalDateTime current = start; while (!current.isAfter(end)) { LocalDateTime dayStart = current.withHour(0).withMinute(0).withSecond(0).withNano(0); LocalDateTime dayEnd = current.withHour(23).withMinute(59).withSecond(59).withNano(999999999); System.out.println("Day " + current.toLocalDate() + " starts at " + dayStart + " and ends at " + dayEnd); current = current.plusDays(1); } } } ``` 输出结果如下: ``` Day 2020-11-20 starts at 2020-11-20T00:00 and ends at 2020-11-20T23:59:59.999999999 Day 2020-11-21 starts at 2020-11-21T00:00 and ends at 2020-11-21T23:59:59.999999999 Day 2020-11-22 starts at 2020-11-22T00:00 and ends at 2020-11-22T23:59:59.999999999 ... Day 2021-10-07 starts at 2021-10-07T00:00 and ends at 2021-10-07T23:59:59.999999999 Day 2021-10-08 starts at 2021-10-08T00:00 and ends at 2021-10-08T23:59:59.999999999 Day 2021-10-09 starts at 2021-10-09T00:00 and ends at 2021-10-09T23:59:59.999999999 ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值