折纸的不归路(24)

一.网络:java网络编程

网络中的基本概念

计算机

网络

ip地址:每一台计算机在网络中拥有唯一的网络地址
32位的二进制 8位一部分 0-255
192.168.1.1
确保连接在同一网络下,连接同一个热点,可以通过ping命令测试是否能够连接到另外一台计算机

端口号

当前计算机通过防火墙对外暴露的服务

URI:统一资源标识符

URL:统一资源定位符 映射的路径

通过一串字符串定位到一个具体的资源(文件,视频,音频…)

协议

数据传输所制定的规则

ISO,OSI七层协议

物理层–>应用层

传输层协议:
TCP:可靠的安全的高成本的

三次握手
想打电话一样,确保服务器能够接收到数据

UDP:不可靠的不安全的低成本的

负责发送一个数据包
像写信一样

当前软件的架构
B/S:浏览器服务器 Broswer/Server

不需要下载客户端
服务器的资源压力要大

C/S:客户端服务器 Client/Server

需要下载客户端
客户端会时刻要求更新
客户端可以分担一部分服务器的资源压力

客户端和服务器

服务器

任何一台提供资源分享的计算机都可以被称为服务器

客户端

在网络中寻求资源的一台计算机

网络传递过程,客户端和服务器互相发生送数据的过程
比如客户端对服务器说:我想要一张图片–>请求
服务器会发回一张图片给客户端–>响应
一次会话

Java中如何实现网络编程

Socket 套接字,可以看成是一个管道
实际上客户端和服务器之间传递的就是Socket对象

使用java代码实现TCP协议传输

1.一个客户端的程序和一个服务器端的程序
2.服务器新建一个ServerSocket对象,构造器提供要开放的端口port
3.服务器要启动并监听访问的客户端
ss.accept();
4.客户端新建一个Socket对象,构造器提供IP地址和端口号
5.使用同一个Socket来作为媒介,使用它的输入流和输出流传递数据
6.如果服务器端要使用多线程处理客户端传过来的socket,需要用一个线程来处理socket,对监听的方法进行死循环包装,每当接收到一个socket的时候,就开起一条线程来处理逻辑
相关代码实现:
建立一个TCP客户端程序和TCP服务器程序

import java.io.*;
import java.net.Socket;
/**
 * TCP客户端程序
 * 
 * @author Acer
 *
 */
public class TCPClient {
	public static void main(String[] args) {
		// 1.准备Socket对象
		// 如果访问本地的主机
		// ip地址:127.0.0.1或者localhost(127.0.0.1是字迹访问自己)
		try {
			Socket socket = new Socket("127.0.0.1", 2333);
			System.out.println(socket);
			System.out.println("连接成功,正在发送数据...");
			// 想要传递数据
			OutputStream os = socket.getOutputStream();
			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
			bw.write("我想要一个当前的时间");
			bw.flush();
			//解决方式
			socket.shutdownOutput();//关闭客户端socket的输出流,方便下一次接收
			//客户端需要接受
			BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			String s = "";
			while((s=br.readLine())!=null) {
				System.out.println("服务器的反馈"+s);
			}
			br.close();
			bw.close();
			socket.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
/**
 * TCP服务器端程序
 * 
 * @author Acer
 *
 */
public class TCPServer {
	public static void main(String[] args) {
		// 1.在服务器端使用的是ServerSocket
		// 提供一个端口号,端口号取值范围0-65535
		// 0-1023 系统服务
		// 1024-45000左右 自定义的端口(可用)
		// 45000-最后 随机端口
		try {
			ServerSocket ss = new ServerSocket(2333);
			//需要开启服务器来监听客户端的访问
			System.out.println("服务器开始监听...");
			//如果需要多线程,则监听的代码需要在死循环里
			Socket socket = ss.accept();
			System.out.println(socket);
			System.out.println("连接成功,服务器开始接收数据...");
			//使用输入流来读取Socket里面的信息
			BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			String data = "";
			while((data = br.readLine())!=null) {
				System.out.println("本次收到的数据为"+data);
			}
			//向客户端发送一个响应
			PrintWriter pw = new PrintWriter(socket.getOutputStream());
			pw.println("当前的时间"+new Date());
			//后开的先关
			pw.flush();
			pw.close();
			br.close();
			socket.close();
			ss.accept();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

使用java代码实现UDP协议传输

1.一个客户端程序和服务器端程序
2.服务器端需要DatagramSocket
相关代码实现:

建立UDP协议的客户端和服务器

/**
 * UDP协议的客户端
 */
import java.net.*;
public class UDPClient {
	public static void main(String[] args) throws Exception {
		DatagramSocket ds = new DatagramSocket();
		// 包装数据用的数据包
		byte[] buff = new byte[1024];// 数据包的声明
		buff = "马上改吃饭了".getBytes();// 数据包的添加
		// 高速数据包的地址
		InetAddress ia = InetAddress.getByName("127.0.0.1");
		DatagramPacket dp = new DatagramPacket(buff, buff.length, ia, 2333);
		// 发送数据包
		ds.send(dp);
	}
}
import java.net.*;
/**
 * UDP协议的服务器
 * @author Acer
 *
 */
public class UDPServer {
	public static void main(String[] args) throws Exception {
		System.out.println("UDP服务器开启...");
		DatagramSocket ds = new DatagramSocket(2333);
		byte[] buff = new byte[1024];
		DatagramPacket dp = new DatagramPacket(buff, buff.length);
		ds.receive(dp);
		buff = dp.getData();
		System.out.println(new String(buff));
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值