Java网络编程

端口号范围:0~65535,建议选择1024以上

UDP:面向无连接,数据不安全,速度快,不区分客户端和服务器(有发送端和接收端)(发短信)

TCP:面向连接(三次握手),数据安全,速度略低,分为客户端和服务器(打电话)

1.UDP

package day26;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Dk1UdpSend {

	//UDP发送端
	public static void main(String[] args) throws IOException {
		//basic();
		advanced();
	}
	
	public static void basic() throws SocketException, UnknownHostException, IOException {
		//1.创建DatagramSocket,随机端口号
		DatagramSocket socket = new DatagramSocket();
		//2.创建DatagramPacket,指定数据,长度,地址,端口
		String str = "红鲤鱼绿鲤鱼与驴";
		DatagramPacket packet = new DatagramPacket(str.getBytes(), str.getBytes().length,InetAddress.getByName("127.0.0.1"),12345);
		//3.使用DatagramSocket发送DatagramPacket
		socket.send(packet);
		//4.关闭DatagramSocket
		socket.close();      //底层是IO流所以要关
	}
	
	public static void advanced() throws SocketException, UnknownHostException, IOException {
		//1.创建DatagramSocket,随机端口号
		DatagramSocket socket = new DatagramSocket();
		Scanner sc = new Scanner(System.in);
		while (true) {
			//2.创建DatagramPacket,指定数据,长度,地址,端口
			String str = sc.nextLine();
			if ("quit".equals(str)) {
				break;
			}
			DatagramPacket packet = new DatagramPacket(str.getBytes(), str.getBytes().length,InetAddress.getByName("127.0.0.1"),12345);
			//3.使用DatagramSocket发送DatagramPacket
			socket.send(packet);
		}

		//4.关闭DatagramSocket
		socket.close();      //底层是IO流所以要关
	}



}

package day26;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class Dk2UdpReceive {

	//UDP接收端
	public static void main(String[] args) throws IOException {
		//basic();
		advanced();
	}

	public static void basic() throws SocketException, IOException {
		//1.创建DatagramSocket(码头),指定端口号
		DatagramSocket socket = new DatagramSocket(12345);
		//2.创建DatagramPacket(集装箱),指定数组,长度
		DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
		//3.使用DatagramSocket接收DatagramPacket
		socket.receive(packet);
		//4.从DatagramPacket获取数据
		byte[] arr = packet.getData();
		int len = packet.getLength();        //获取发过来的有效字节个数
		System.out.println(new String(arr,0,len));   //转换len个字节为字符串
		//5.关闭DatagramSocket
		socket.close();
	}
	
	public static void advanced() throws SocketException, IOException {
		//1.创建DatagramSocket(码头),指定端口号
		DatagramSocket socket = new DatagramSocket(12345);
		//2.创建DatagramPacket(集装箱),指定数组,长度
		DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
		
		while (true) {
			//3.使用DatagramSocket接收DatagramPacket
			socket.receive(packet);
			//4.从DatagramPacket获取数据
			byte[] arr = packet.getData();
			int len = packet.getLength();        //获取发过来的有效字节个数
			String ip = packet.getAddress().getHostAddress();     //获取发送端IP
			int port = packet.getPort();                          //获取发送端端口号
			System.out.println(ip + ":"+ port + ":"+new String(arr,0,len));   //转换len个字节为字符串
		}
	}

}

package day26;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Dk3UdpMoreThread {

	//多线程
	public static void main(String[] args) throws InterruptedException {
		new UdpReceive().start();
		Thread.sleep(10);        //让接收端先启动
		new UdpSend().start();
	}
}

class UdpReceive extends Thread{
	public void run() {  //异常不能直接抛,用try
		try {
			//1.创建DatagramSocket(码头),指定端口号
			DatagramSocket socket = new DatagramSocket(12345);
			//2.创建DatagramPacket(集装箱),指定数组,长度
			DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
			
			while (true) {
				//3.使用DatagramSocket接收DatagramPacket
				socket.receive(packet);
				//4.从DatagramPacket获取数据
				byte[] arr = packet.getData();
				int len = packet.getLength();        //获取发过来的有效字节个数
				String ip = packet.getAddress().getHostAddress();     //获取发送端IP
				int port = packet.getPort();                          //获取发送端端口号
				System.out.println(ip + ":"+ port + ":"+new String(arr,0,len));   //转换len个字节为字符串
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

class UdpSend extends Thread{
	public void run() {
		try {
			//1.创建DatagramSocket,随机端口号
			DatagramSocket socket = new DatagramSocket();
			Scanner sc = new Scanner(System.in);
			while (true) {
				//2.创建DatagramPacket,指定数据,长度,地址,端口
				String str = sc.nextLine();
				if ("quit".equals(str)) {
					break;
				}
				DatagramPacket packet = new DatagramPacket(str.getBytes(), str.getBytes().length,InetAddress.getByName("127.0.0.1"),12345);
				//3.使用DatagramSocket发送DatagramPacket
				socket.send(packet);
			}

			//4.关闭DatagramSocket
			socket.close();      //底层是IO流所以要关
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
//输出
你好
127.0.0.1:57978:你好
你好
127.0.0.1:57978:你好
明天好
127.0.0.1:57978:明天好

2.TCP

package day26;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Dk4TcpServer {

	//TCP服务端
	public static void main(String[] args) throws IOException {
		//basic();
		//advanced();
		moreThread();
	}

	public static void basic() throws IOException {
		//1.创建ServerSocket(需要指定端口号)
		ServerSocket server = new ServerSocket(9999);
		//2.调用ServerSocket的accept()方法接收一个客户端请求,得到一个socket
		Socket socket = server.accept();
		//3.调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
		InputStream is = socket.getInputStream();
		OutputStream os = socket.getOutputStream();
		//输出流可以写出数据到客户端的输入流
		os.write("百度一下,你就知道".getBytes());
		//输入流可以读取客户端输出流写出的数据
		byte[] arr = new byte[1024];
		int len = is.read(arr);
		System.out.println(new String(arr,0,len));
		
		//关闭套接字
		socket.close();
	}
	
	public static void advanced() throws IOException {
		//1.创建ServerSocket(需要指定端口号)
		ServerSocket server = new ServerSocket(9999);
		//2.调用ServerSocket的accept()方法接收一个客户端请求,得到一个socket
		Socket socket = server.accept();
		
		BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		PrintStream ps = new PrintStream(socket.getOutputStream());
		
		ps.println("欢迎咨询"); //写给客户端
		System.out.println(br.readLine());//读客户端
	}	
	
	public static void moreThread() throws IOException {
		//1.创建ServerSocket(需要指定端口号)
		final ServerSocket server = new ServerSocket(9999);
		
		while (true) {
			//2.调用ServerSocket的accept()方法接收一个客户端请求,得到一个socket
			Socket socket = server.accept();
			new Thread() {
				public void run() {
					try {
						BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
						PrintStream ps = new PrintStream(socket.getOutputStream());
						
						ps.println("欢迎咨询"); //写给客户端
						System.out.println(br.readLine());//读客户端
						socket.close();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}.start();
		}
	}
}

package day26;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class Dk5TcpClient {

	//TCP客户端
	public static void main(String[] args) throws IOException {
		//basic();
		advanced();
	}
	
	public static void basic() throws UnknownHostException, IOException {
		//1.创建Socket连接客户端(指定IP地址和端口号),通过IP地址找对应的服务器
		Socket socket = new Socket("127.0.0.1",9999);
		//2.调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
		InputStream is = socket.getInputStream();
		OutputStream os = socket.getOutputStream();
		//输入流可以读取服务端输出流写出的数据
		byte[] arr = new byte[1024];
		int len = is.read(arr);
		System.out.println(new String(arr,0,len));
		//输出流可以写出数据到服务端的输入流
		os.write("学习挖掘机哪家强".getBytes());
		
		//关闭套接字
		socket.close();
	}
	
	public static void advanced() throws UnknownHostException, IOException {
		//1.创建Socket连接客户端(指定IP地址和端口号),通过IP地址找对应的服务器
		Socket socket = new Socket("127.0.0.1",9999);
		
		BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		PrintStream ps = new PrintStream(socket.getOutputStream());
		
		System.out.println(br.readLine());      //读服务器
		ps.println("学Java");      //写给服务器
		
		socket.close();
	}
}

package day26;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;

public class Dk7UploadClient {

	//客户端向服务器上传文件
	public static void main(String[] args) throws IOException{
		//1.提示输入上传的文件路径,验证路径是否存在以及是否是文件夹
		File file = getFile();
		//2.发送文件名到服务端
		Socket socket = new Socket("127.0.0.1",12345);
		BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		PrintStream ps = new PrintStream(socket.getOutputStream());
		
		ps.println(file.getName());
		//6.接收结果,如果存在给予提示,程序直接退出
		String result = br.readLine();       //结果为"存在"或"不存在"
		if ("存在".equals(result)) {
			System.out.println("您上传的文件已经存在");
			socket.close();
			return;
		}
		//7.如果不存在,定义FileInputStream读取文件,写出到网络
		FileInputStream fis = new FileInputStream(file);
		byte[] arr = new byte[8192];
		int len;
		while((len = fis.read(arr)) != -1) {
			ps.write(arr,0,len);
		}
		fis.close();
		socket.close();
	}
	
	//1.上传文件路径
	public static File getFile() {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入文件路径:");
		
		while (true) {
			String line = sc.nextLine();
			File file = new File(line);
			
			if (!file.exists()) {
				System.out.println("重输:");
			}else if (file.isDirectory()) {
				System.out.println("重输:");
			}else {
				return file;
			}
		}
	}

}

package day26;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Dk6UploadServer {

	//上传文件到服务端
	public static void main(String[] args) throws IOException {
		//3.建立多线程的服务器
		ServerSocket server = new ServerSocket(12345);
		System.out.println("服务器启动");
		while (true) {
			final Socket socket = server.accept();
			new Thread() {
				public void run() {
					try {
						//4.读取文件名
						InputStream is = socket.getInputStream();   //读文件
						BufferedReader br = new BufferedReader(new InputStreamReader(is)); //读文件名
						PrintStream ps = new PrintStream(socket.getOutputStream());
						String fileName = br.readLine();
						
						File dir = new File("Upload");
						dir.mkdir();            //创建文件夹
						File file = new File(dir,fileName);   //将文件名包装成file对象才可以进行判断
						//5.判断文件是否存在,将结果发回客户端
						if (file.exists()) {
							ps.println("存在");
							socket.close();
							return;
						}else {
							ps.println("不存在");
						}
						//8.定义FileOutputStream,从网络读取数据存储到本地
						FileOutputStream fos = new FileOutputStream(file);
						byte[] arr = new byte[8192];
						int len;
						while((len = is.read(arr)) != -1) {
							fos.write(arr,0,len);
						}
						fos.close();
						socket.close();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}.start();
		}
	}

}

热门文章

暂无图片
编程学习 ·

Paddle_程序员必备的数学知识_转发

程序员——必备数学知识!!!Attention 本博客转发至百度aistudio的<深度学习7日入门-cv疫情检测>,课程非常棒!本人力推! 博客转发地址:https://aistudio.baidu.com/aistudio/projectdetail/604807 课程报名地址:https://aistudio.baidu.com/aistudio/education/group/i…
暂无图片
编程学习 ·

Java内存管理-初始JVM和JVM启动流程(二)

上一篇分享了什么是程序,以及Java程序运行的三个阶段。也顺便提到了Java中比较重要的一个东西就是JVM(JAVA 虚拟机),那么今天在先了解一下JVM和JVM的启动流程。知识地图:1、什么是虚拟机虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全…
暂无图片
编程学习 ·

ASP.NET Core2.0项目实战-003

Views布局(Layouts)视图组件(ViewComponents)分部视图(PartialViews)HTML助手(HtmlHelpers) 页面标签的辅助类Tag助手(TagHelpers)配置全部视图(Global view configutation)视图找的时候如果home里面没有还会找shared文件夹里面的using System; using System.Colle…
暂无图片
编程学习 ·

开挂的印度裔00后:7岁“出道”教编程,12岁成为IBM荣誉顾问

9年教学经验,400万播放量,还出了3本编程教学书。解锁如此成就的,正是在油管(Youtube)爆火的一位up主,印度裔加拿大籍程序员——Tanmay Bakshi。他的课程覆盖主流操作系统、编程语言,以及基础科学。其深入浅出、通俗易懂的讲解方式,大获网友们的好评。有中国网友,还将他与…
暂无图片
编程学习 ·

Leetcode 题解 - 栈和队列

用栈实现队列 232. Implement Queue using Stacks (Easy) 栈的顺序为后进先出,而队列的顺序为先进先出。使用两个栈实现队列,一个元素需要经过两个栈才能出队列,在经过第一个栈时元素顺序被反转,经过第二个栈时再次被反转,此时就是先进先出顺序。 class MyQueue {private …
暂无图片
编程学习 ·

【C++】引用

引用的定义引用是给另外一个变量起别名,所以引用不会分配内存空间。引用的声明方法:类型标识符 &引用名=目标变量名;(如int &ptr = num;)引用和指针的区别1、指针是一个实体,需要分配内存空间。引用只是变量的别名,不需要分配内存空间。 2、引用在定义的时候必须…
暂无图片
编程学习 ·

Plotly+Cufflinks,交互式图表神器,一行代码GET!

前言本文将介绍如何使用Plotly+Cufflinks更简便地制作出更好的图表。 这是Github上一个大神发布的资料,本人学习之后觉得非常实用,所以和大家分享。需要查看代码的童鞋指路Github:https://github.com/WillKoehrsen/Data-Analysis 本文中的所有代码都是使用Jupyter notebook完…
暂无图片
编程学习 ·

大学的生活给你的现在带来了什么?

《你的大学四年为现在的你提供什么优势了》初入大学的时候,我们每个人心里都存着渴望、好奇,有多少人在报完志愿的那一刻,心中的大学还是那些偶像剧中的样子。收到通知书的我们,都在彼此炫耀,终于走进了大学,可以自己做主的生活,没有家人约束的日子。走进大学的校门,多…
暂无图片
编程学习 ·

设计模式-工厂模式

关注公众号 JavaStorm 获取更多精彩工厂模式定义 工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化…
暂无图片
编程学习 ·

springboot整合poi导入excel案例

1.在pom.xml中添加poi依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.13</version></dependency><dependency><groupId>org.apache.poi</groupId><artifac…
暂无图片
编程学习 ·

CMMI 2.0 和 1.3

CMMI2.0与1.3在组织形式区别很大,很多PA和之前的不太一样了,而且PA在2.0中叫实践域,1.3中叫过程域。不过其实核心内容没有大的变化,只是相关内容的位置进行了调整,部分描述进行了优化。目前是过渡阶段,2.0和1.3都可以评估,但截止日期之后就只适用2.0了。1.3评估的截止日…
暂无图片
编程学习 ·

设计模式学习——单例模式

一、单例模式的概念1.1 概念单例模式是指 确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。单例模式的特点是隐藏其所有的构造方法。属于创建型模式。1.2 单例模式的适用场景确保任何情况下都绝对只有一个实例。例如ServletContext、ServletConfig、Applicat…
暂无图片
编程学习 ·

mmdetection训练出现:IndexError: list index out of range 错误

mmdetection训练出现:IndexError: list index out of range 错误文章目录:1 问题分析1.1 尝试解决错误:第一次1.2 尝试解决错误:第二次2 我的问题解决方式我的环境:Ubuntu18.04 TorchVision: 0.6.0 OpenCV: 4.2.0 MMCV: 0.5.5 MMDetection: 2.0.0+d9c8f14 MMDetection Com…
暂无图片
编程学习 ·

关于HIVE增量同步的思考

方案一、如果业务库没有删除操作,并且更新时间完整,使用更新时间做增量同步,sqoop只同步更新时间变化的数据,合并到ODS层表 方案二、如果业务库有删除操作,可以先解析数据库操作日志,存到hdfs,T+1同步数据后,对增删改做一次merge操作即可,可能需要代码实现。
暂无图片
编程学习 ·

iOS开发笔记之八十——单例的使用总结笔记

******阅读完此文,大概需要10分钟******一、单例的创建#import "MDInstanceManager.h"@implementation MDInstanceManagerstatic MDInstanceManager *shareInstance = nil; static dispatch_once_t onceToken;+ (instancetype)shareInstance {dispatch_once(&on…
暂无图片
编程学习 ·

哈夫曼编码

哈夫曼编码 输入一个字符串文本 #include <stdio.h> #include <stdlib.h> #include <string.h>#define cmax 0x3f3f3f3f // 宏定义一个较大的数,作为比较数据 #define cmaxsize 10000 // 宏定义数组的长度 // ---构建哈夫曼树 // ---定义哈夫曼…
暂无图片
编程学习 ·

react中使用scss全局变量做留海屏幕适配

最近我的react工程需要做留海屏幕适配,用了公司的框架mtl(支持友空间),我们都知道现在大多数做留海适配都是在顶部设置25px的高度,那为什么做适配会用到scss全局变量呢? 答案就是方便!配置了全局变量后我们可以在想要的任何地方使用,设置使用css的calc动态计算一些宽度…
暂无图片
编程学习 ·

linux监控网卡抓包

/usr/sbin/tcpdump -n -e -i eth0 tcp port 8090tcpdump 的抓包保存到文件的命令参数是-w xxx.cap 抓eth1的包 tcpdump -i eth1 -w /tmp/xxx.cap 抓 192.168.1.123的包 tcpdump -i eth1 host 192.168.1.123 -w /tmp/xxx.cap 抓192.168.1.123的80端口的包 tcpdump -i eth1 host …