| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 网络编程TCP/UDP -> 正文阅读 |
|
[网络协议]网络编程TCP/UDP |
1、什么是计算机网络? 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。 2、网络编程三要素 IP地址:能够确定是哪一台主机 端口号:能够确定主机上的某个进程 网络通信协议:制定网络通信、数据交互的规则 IP地址:网络中设备的唯一标识 IPV4:给每个连接在网络上的主机分配一个32bit地址,按照TCP/IP规定,IP地址使用二进制标识,每个地址长32bit,也就是4个字节? 二进制11000000? ?10101000? ?00000001? ?01000010? 转化为十进制存储 192.168.1.66 IPV6:由于互联网的蓬勃发展,P地址的需求量愈来愈大,但是网络地址资源有限,使得P的分配越发紧张。为了扩大地址空间,通过Pv6重新定义地址空间,采用128位地址长度,每16个字节一组,分成8组十六进制数,这样就解决了网络地址资源数量不够的问题 常用命令: ipconfig:查看本机IP地址 ping IP地址:检查网络是否连通 特殊的IP地址:127.0.0.1是回送地址,可以代表本机,一般用于测试 3、InetAddress类的使用 host:IP地址,也可以说是主机名 public static InetAddress getByName(String host) 获取此IP地址的主机名的字符串 public String getHostName() 返回文本显示中的IP地址字符串 public String getHostAddress() //推荐使用这种方式 InetAddress name1= InetAddress.getByName("192.168.43.186"); InetAddress name2 = InetAddress.getByName("DESKTOP-8BARTTR"); String hostIP = name1.getHostAddress(); System.out.println(hostIP); String hostName = name1.getHostName(); System.out.println(hostName); 4、端口与协议 端口:设备上应用程序的唯一标识 端口号:用两个字节表示的数数,它的取值范围是0~65535。其中,0~1023之间的端口号用于些知名的网络服务和应用,普通的应用程序需要使用1024上的端口号。如果端口号被另外个服务或应用所占用,会导致当前程序启动失败。(换端口号) 协议:计算机网络中,连接和通信的规则被称为网络通信协议 TCP协议 完成三次握手,连接建立后,客服端和服务器就可以进行数据传输了,由于这种面向连接的特性,TCP协议保证了传输数据的安全,所以应用十分广泛。例如上传文件、下载文件 、浏览网页等。 5、UDP发送数据(DataGramSocket) //创建发送端socket对象 DatagramSocket ds=new DatagramSocket(); //将要发送的数据打包 byte[]buf="hello,udp".getBytes(); //int length=buf.length; //InetAddress address=InetAddress.getByName("192.168.43.186"); DatagramPacket p=new DatagramPacket (buf,buf.length,InetAddress.getByName("192.168.43.186"),10086); //发送数据 ds.send(p); //关闭发送端 ds.close(); 6、UDP接受数据(DataGramSocket) //创建接受端Socket对象 DatagramSocket ds = new DatagramSocket(10086); //创建接受包裹对象 byte[] bys=new byte[1024]; DatagramPacket dp=new DatagramPacket(bys,bys.length); //接受数据 ds.receive(dp); //byte[] datas= dp.getData();解析数据,返回一个字节数组 //int len = dp.getLength();获取读到数据的长度 //String dataString=new String(dp.getData(),0,dp.getLength());将读到的数据转化为字符串 System.out.println("shujushi:"+new String(dp.getData(),0,dp.getLength())); //关闭接收端 ds.close(); 7、UDP聊天室练习 7.1发送端
//创建发送端Socket对象
DatagramSocket dp=new DatagramSocket();
//手动封装进行键盘录入
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String line;
while((line=br.readLine())!=null){
if("886".equals(line)){
break;
}
//创建数据包,封装数据
byte[] bys = line.getBytes();
DatagramPacket p=new DatagramPacket(bys,bys.length, InetAddress.getByName("192.168.43.186"),12345);
//发送数据
dp.send(p);
}
//关闭接发送端
dp.close();
}
7.2接收端 //创建接收端Socket对象 DatagramSocket ds = new DatagramSocket(12345); //死循环一直接受数据 while(true){ byte[] bys = new byte[1024]; //创建数据包用于接受数据 DatagramPacket dp = new DatagramPacket(bys, bys.length); //接受数据 ds.receive(dp); //解析数据并输出 System.out.println("shujushi:" + new String(dp.getData(), 0, dp.getLength())); } //因为要一直接受数据,所以不需要关闭接收端 //dp.close(); 8、TCP发送数据(Socket) //创建客户端Socket对象 //Socket c=new Socket(InetAddress.getByName("192.168.43.186"),10086); Socket c=new Socket("192.168.43.186",10086); //获取字节输出流写数据 OutputStream OS = c.getOutputStream(); //一次写一个字节数组 OS.write("hello,tcp,wolaile".getBytes()); //关闭发送端 c.close(); 9、TCP接收数据(ServerSocket) //创建接收端ServerSocket对象 ServerSocket serverSocket = new ServerSocket(10086); //监听客户端连接 Socket socket = serverSocket.accept(); //获取字节输入流读数据 InputStream inputStream = socket.getInputStream(); //一次读取一个字节数组,只读一次 byte[] bys=new byte[1024]; int read = inputStream.read(bys); //将接收的字节数组转化为字符串 String data=new String(bys,0,read); //输出接受的数据 System.out.println("data:"+data); //关闭接收端 socket.close(); serverSocket.close(); 10、TCP练习 10.1服务器给出反馈收到信息 (1)客服端 //创建发送端Socket对象 Socket socket = new Socket("192.168.43.186", 10086); //获取字节输出流写数据 OutputStream outputStream = socket.getOutputStream(); //一次写一个字节数组 outputStream.write("hello,tcp".getBytes()); //获取字节输入流,读取数据 InputStream inputStream = socket.getInputStream(); //一次读取一个字节数组,并且只读取了一次 byte[] bys=new byte[1024]; int len = inputStream.read(bys); //将读取到的信息转换为字符串 String data=new String(bys,0,len); //输出读取到的信息 System.out.println("server:"+data); //关闭发送端 socket.close(); (2)服务器 //创建服务器端ServerSocket对象 ServerSocket serverSocket = new ServerSocket(10086); //监听客户端连接,获取Socket对象 Socket socket = serverSocket.accept(); //Socket对象获取字节输入流读取数据 InputStream inputStream = socket.getInputStream(); //一次读取一个字节数组,并且只读一次 byte[] bys =new byte[1024]; int len=inputStream.read(bys); //将读取到的信息转化为字符串 String data=new String(bys,0,len); //输出读取到的信息 System.out.println("data:"+data); //Socket获取字节输出流写数据 OutputStream outputStream = socket.getOutputStream(); //一次写一个字节数组 outputStream.write("数据已经收到".getBytes()); //关闭发送端 serverSocket.close(); 10.2客户端键盘录入发送信息 (1)client //创建客户端Socket对象 Socket socket = new Socket("192.168.43.186", 10086); //自定义封装键盘录入 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //获取字节输出流,写数据,将其封装为BufferedWriter与BufferedReader配套使用 BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //循环输入数据,直至886 String line; while((line=br.readLine())!=null){ if("886".equals(line)){ break; } //一次写一个字符串,换行,刷新 bw.write(line); bw.newLine(); bw.flush(); } //关闭发送端 socket.close(); (2)Server //获取Server端ServerSocket对象 ServerSocket serverSocket = new ServerSocket(10086); //监听客服端连接 Socket socket = serverSocket.accept(); //获取字节输入流读数据,并将其封装为BufferedReader BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream())); //读取数据 String line; while((line=br.readLine())!=null){ System.out.println(line); } //关闭Server端 serverSocket.close(); 10.3客户端键盘录入发送数据,服务器读取数据写入文件 (1)client //创建客户端Socket对象 Socket socket = new Socket("192.168.43.186", 10086); //自定义封装键盘录入 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //获取字节输出流,写数据,将其封装为BufferedWriter与BufferedReader配套使用 BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //循环输入数据,直至886 String line; while((line=br.readLine())!=null){ if("886".equals(line)){ break; } //一次写一个字符串,换行,刷新 bw.write(line); bw.newLine(); bw.flush(); } //关闭发送端 socket.close(); (2)Server //获取Server端ServerSocket对象 ServerSocket serverSocket = new ServerSocket(10086); //监听客服端连接 Socket socket = serverSocket.accept(); //获取字节输入流读数据,并将其封装为BufferedReader BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream())); //封装写入文件的路径 BufferedWriter bw=new BufferedWriter(new FileWriter("D:\\java-Study\\java-study\\java.txt")); //读取数据 String line; while((line=br.readLine())!=null){ bw.write(line); bw.newLine(); bw.flush(); } //关闭Server端 bw.close(); serverSocket.close(); 10.4客户端读取文件数据发送,服务器读取数据写入文件 (1)client //创建发送端Socket对象 Socket socket = new Socket("192.168.43.186", 10086); //将文件路径封装 BufferedReader bw=new BufferedReader(new FileReader("D:\\Java-Study\\java-study\\javac.txt")); //获取字节输出流,写数据 BufferedWriter br=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); String line; //将文本数据写入 while((line=bw.readLine())!=null){ br.write(line); br.newLine(); br.flush(); } //关闭发送端 bw.close(); socket.close(); (2)Server //获取Server端ServerSocket对象 ServerSocket serverSocket = new ServerSocket(10086); //监听客服端连接 Socket socket = serverSocket.accept(); //获取字节输入流读数据,并将其封装为BufferedReader BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream())); //封装写入文件的路径 BufferedWriter bw=new BufferedWriter(new FileWriter("D:\\java-Study\\java-study\\java.txt")); //读取数据 String line; while((line=br.readLine())!=null){ bw.write(line); bw.newLine(); bw.flush(); } //关闭Server端 bw.close(); serverSocket.close(); 10.5客户端从文件读取数据,接收反馈,服务器接收数据写入文件并给出反馈 (1)client //创建发送端Socket对象
Socket socket = new Socket("192.168.43.186", 10086);
//将文件路径封装
BufferedReader bw=new BufferedReader(new FileReader("D:\\Java-Study\\java-study\\javac.txt"));
//获取字节输出流,写数据
BufferedWriter br=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String line;
//将文本数据写入
while((line=bw.readLine())!=null){
br.write(line);
br.newLine();
br.flush();
}
//传输结束标志
socket.shutdownOutput();
//接收反馈
BufferedReader bwClient=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String serverdata = bwClient.readLine();
System.out.println(serverdata);
//关闭发送端
bw.close();
socket.close();
(2)Server //获取Server端ServerSocket对象
ServerSocket serverSocket = new ServerSocket(10086);
//监听客服端连接
Socket socket = serverSocket.accept();
//获取字节输入流读数据,并将其封装为BufferedReader
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//封装写入文件的路径
BufferedWriter bw=new BufferedWriter(new FileWriter("D:\\java-Study\\java-study\\java.txt"));
//读取数据
String line;
while((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
}
//给出反馈
BufferedWriter bwServer=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bwServer.write("文件上传成功");
bwServer.newLine();
bwServer.flush();
//关闭Srver端
bw.close();
serverSocket.close();
10.6多线程实现文件上传(为每个客户端创建线程) (1)client //创建发送端Socket对象
Socket socket = new Socket("192.168.43.186", 10086);
//将文件路径封装
BufferedReader bw=new BufferedReader(new FileReader("D:\\Java-Study\\java-study\\javac.txt"));
//获取字节输出流,写数据
BufferedWriter br=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String line;
//将文本数据写入
while((line=bw.readLine())!=null){
br.write(line);
br.newLine();
br.flush();
}
//传输结束标志
socket.shutdownOutput();
//接收反馈
BufferedReader bwClient=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String serverdata = bwClient.readLine();
System.out.println(serverdata);
//关闭发送端
bw.close();
socket.close();
(2)Server //创建服务器Socket对象 ServerSocket serverSocket = new ServerSocket(10086); //死循环让服务器一直开着监听客户端连接 while(true) { Socket socket = serverSocket.accept(); ????????//为每个客户端连接创建线程 new Thread(new ServerThread(socket)).start(); } //因为一直开着,所以不需要关闭接收端 // serverSocket.close(); (3)ServerThread类 private Socket socket; public ServerThread(Socket socket) { this.socket=socket; } @Override public void run() { try { BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); //BufferedWriter bw=new BufferedWriter(new FileWriter("D:\\Java-Study\\java-study\\copy.txt")); //解决文件名重复问题 int count=0; File file=new File("D:\\Java-Study\\java-study\\["+count+"]copy.txt"); while(file.exists()){ count++; file=new File("D:\\Java-Study\\java-study\\copy["+count+"].txt"); } BufferedWriter bw=new BufferedWriter(new FileWriter(file)); String line; while((line=br.readLine())!=null){ bw.write(line); bw.newLine(); bw.flush(); } BufferedWriter beServer=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); beServer.write("文件上传成功"); beServer.newLine(); beServer.flush(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 17:24:13- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |