网络编程

网络编程

计算机的基础知识

1.网络模型 5层模型和七层模型

2.网络编程的三要素 ip 端口 协议

3.Tcp连接过程 三次握手和四次挥手

网络模型:https://blog.youkuaiyun.com/qq_22238021/article/details/80279001

Tcp连接过程 三次握手和四次挥手:https://baijiahao.baidu.com/s?id=1596016296668694374&wfr=spider&for=pc

IP地址

网络中针对计算机的唯一表示,类似于一个人的身份证,每个计算机都有自己的ip地址,计算机中是用点分十进制来表示的: 192.168.5.109,ip的存储是使用二进制存储

如:11000000.10101000.00000010.01101101

端口

1.端口的范围: 0~65535是可以使用端口的范围

2.0~1024一般是系统进程端口,不建议使用,建议我们不要和系统进程或者和已经打开的程序端口重复,否则会出现端口被占用的问题

协议

HTTP: 超文本传输协议

FTP: 文件传输协议

TCP: 传输控制协议

UDP: 用户数据报协议

UDP:

1.对数据打包传输

2.数据传输的数量有限制

3.速度快

4.面向无连接

5.不安全不可靠

TCP

1.数据传输没有限制

2.面向连接的协议

3.速度慢

4.可靠安全

InetAddress

它是一种低级协议,UDP 和 TCP 协议都是在它的基础上构建的

byte[] getAddress() 返回此 InetAddress 对象的原始 IP 地址。

static InetAddress[] getAllByName(String host) 在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。
static InetAddress getByAddress(byte[] addr) 在给定原始 IP 地址的情况下,返回 InetAddress 对象。

static InetAddress getByAddress(String host, byte[] addr) 根据提供的主机名和 IP 地址创建 InetAddress。

static InetAddress getByName(String host) 在给定主机名的情况下确定主机的 IP 地址。

String getCanonicalHostName() 获取此 IP 地址的完全限定域名。

String getHostAddress() 返回 IP 地址字符串。

String getHostName() 获取此 IP 地址的主机名。

public class NetDemo01 {
	public static void main(String[] args) throws UnknownHostException {
		byte[] bys = {(byte) 192,(byte) 168,1,112};
		InetAddress ip = InetAddress.getByAddress(bys);
		System.out.println(ip);
		System.out.println(InetAddress.getByName("192.168.1.120"));
		System.out.println(InetAddress.getByName("www.baidu.com"));
		System.out.println(InetAddress.getLocalHost());
		System.out.println(InetAddress.getLoopbackAddress());
		
		InetAddress address = InetAddress.getByName("localhost");
		System.out.println(address.getHostAddress());
		System.out.println(address.getHostName());
		System.out.println(address.isLoopbackAddress());
		System.out.println(ip.getHostName());
		System.out.println(ip.getHostAddress());
	}
}

UDP协议

/*	UDP协议发送数据步骤
 * 	1.创建Socket对象
 *  2.创建数据
 *  3.创建一个数据包将数据打包
 *  4.调用Scock的send方法发送数据
 *  5.释放资源
 */
public class SendDemo {
	public static void main(String[] args) throws IOException {
		System.out.println("我是发送端");
		// 1.创建Socket对象
		DatagramSocket ds = new DatagramSocket(10001);
		// 2.创建数据,将数据打包
		byte[] bys = "我给你发消息了".getBytes();
		InetAddress ip = InetAddress.getByName("192.168.1.124");
		// 3.创建一个数据包
		DatagramPacket dp = new DatagramPacket(bys, bys.length, ip, 10086);
		// 4.调用Scock的send方法发送数据
		ds.send(dp);
		ds.close();
		
	}
}

/*	
 *	UDP协议接收端
 * 1.创建服务器端对应的Socket对象 (DatagramSocket)
 * 2.创建空包裹来接受发送过来的数据包
 * 3.调用Socket的接收数据包的方法
 * 4.解析数据包,输出对应的数据
 * 5.释放资源
 */
public class ReceiveDemo {
	public static void main(String[] args) throws IOException {
		// 1.创建服务器端对应的Socket对象 (DatagramSocket)
		DatagramSocket ds = new DatagramSocket(10086, InetAddress.getByName("127.0.0.1"));
		System.out.println("服务器端启动了...");
		// 2.创建空包裹来接受发送过来的数据包
		byte[] bys = new byte[100];
		DatagramPacket dp = new DatagramPacket(bys, bys.length);
		// 3.调用Socket的接收数据包的方法
		System.out.println("等待客户端发送数据...");
		ds.receive(dp); // 该方法还是一个阻塞方法
		// 4.解析数据包,输出对应的数据
		bys = dp.getData();
		int len = dp.getLength();
		String ip = dp.getAddress().getHostAddress();
		String data = new String(bys, 0, len);
		System.out.println("收到了来自" + ip + ",端口为" + dp.getPort() + "的数据: " + data);
		// 5.释放资源
		ds.close();
	}
}

TCP协议

/*
 *	发送数据
 *  1.创建Socket对象
 *  2.通过Socket对象获取输出流
 *  3.输出数据
 *  4.释放资源
 *      注意:必须先开启服务器端,如果先开启的是客户端会报错
 * 	
 */
public class Client {
	public static void main(String[] args) throws UnknownHostException, IOException {
		// 1.创建Socket对象
		Socket s = new Socket("192.168.1.124", 10086);
		// 2.通过Socket对象获取输出流
		OutputStream os = s.getOutputStream();
		// 3.输出数据
		os.write("我发消息了".getBytes());
		// 4.释放资源
		os.close();
		s.close();
		
	}
}


/*
 * TCP协议接收数据
 * 	1.创建服务器端的ServerSocket
 *	2.监听客户端的连接,返回与客户端匹配的Socket
 *	3.读取或者写入数据
 *	4.释放资源(这里不需要释放服务器的资源)
 */
public class Server {
	public static void main(String[] args) throws IOException {
		
		// 1.创建服务器端的ServerSocket
		ServerSocket ss = new ServerSocket(10086);
		
		// 2.监听客户端的连接,返回与客户端匹配的Socket
		Socket s = ss.accept(); // 这是一个阻塞方法,等待用户的Socket连接
		
		// 3.读取或者写入数据
		InputStream is = s.getInputStream();
		
		byte[] bys = new byte[1024];
		int len = is.read(bys);
		
		String data = new String(bys, 0, len);
		
		System.out.println("数据:" + data);
		
	}
}


TCP协议实现文件上传
//客户端
public class FileUpload {
	public static void main(String[] args) throws Exception {
		System.out.println("我是客户端");
		Socket s = new Socket("192.168.1.116", 10086);
		
		BufferedReader br = new BufferedReader(new FileReader("D:\\haha.txt"));
		OutputStream os = s.getOutputStream();
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
		
		String line = null;
		while ((line = br.readLine())!=null) {
			bw.write(line);
			bw.newLine();
			bw.flush();
		}
		//通过socket.shutdownOutput()关闭输出流,但仍然是连接状态,连接并未关闭如果直接关闭输入或者输出流,即:in.close()或者out.close(),会直接关闭socket
		
		s.shutdownOutput();
		
		InputStream is = s.getInputStream();
		byte[] bys = new byte[1024];
        // 读取服务器的响应数据
		int len = is.read(bys);
		
		String data = new String(bys, 0, len);
		System.out.println(data);
		
		br.close();
		s.close();
	}
}



//服务端
public class FileUploadService {
	public static void main(String[] args) throws IOException {
		
		System.out.println("我是服务器");
		ServerSocket ss = new ServerSocket(10086);
		
		while (true) {
			
			Socket s = ss.accept();
			
			InputStream inputStream = s.getInputStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
			BufferedWriter bw = new BufferedWriter(new FileWriter("download" +System.currentTimeMillis()+ "txt" ));
			
			String line = null;
			while ((line = br.readLine())!=null) {
				bw.write(line);
				bw.newLine();
				bw.flush();
			}
			
			s.shutdownInput();
			
			OutputStream is = s.getOutputStream();
			is.write("文件上传成功!!!".getBytes());
			
			bw.close();
			s.close();
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值