网络编程(Tcp/Udp实现聊天、文件上传)
网络编程
1.1 概述
计算机网络是指将位置不同的多台[计算机 通过通信线路连接起来,实现资源共享和信息传递的计算机系统
1.2 网络通信的要素
- ip和端口
- 网络通信协议(tcp/udp)
1.3 Ip地址(Internet Protocol)
定位唯一一台计算机
127.0.0.0:本机 localhost
ip地址的分类(ip4/ip6)
ip4 四个字节组成 2011年用尽
Ip6 通常写成8组,每组为四个十六进制数的形式 非常多,基本用不完
CDCD:910A:2222:5498:8475:1111:3900:2020 1030::C9B4:FF12:48AA:1A2B 2000:0:0:0:0:0:0:1
公网(互联网)/私网(局域网)
- 192.168.xx.xx 这种类型的代表的就是私网
- 其它类型 a.b.c.d 代表公网
域名:ip不方便记忆 不能显示地址组织的名称和性质,人们设计出了域名,通过DNS将域名和Ip关联,方便访问
1.4 端口(port)
端口:计算机与外界通讯交流的出口
- 代表计算机上的某一个程序的进程
- 不同的进程有不同的端口,代表不同的程序
- 被规定0-65535中间
- TCP UDP,单个协议下,端口互不冲突
- 端口分类
- 公有端口 从0到1023
- http:8080
- ftp:21
- https:443
- 程序注册端口1024~49151,分配给用户或程序
- tomcat:8080
- Mysql:3306
- Oracle:1521
- 动态和/或私有端口 49152~65535
- 公有端口 从0到1023
1.5 通信协议
通信协议:双方必须遵循的规则和约定。 确保网络中数据顺利地传送到确定的地方。
常见协议:
tcp/ip协议:传输控制协议/Internet协议,TCP/IP是由一组具有专业用途的多个子协议组合而成的,这些子协议包括TCP、IP、UDP、ARP、ICMP等
tcp协议:打电话
一种面向连接的、可靠的、基于字节流的传输层通信协议
连接稳定(一定会发送成功)
- 连接 三次握手
- 断开 四次挥手
分客户端、服务端
传输完成,断开连接,效率低
接收消息代码
public static void main(String[] args) {try {//等待 接收消息ServerSocket serverSocket = new ServerSocket(1025);//等待服务连接Socket socket = serverSocket.accept();InputStream inputStream = socket.getInputStream();Scanner scanner = new Scanner(inputStream);while (scanner.hasNext()){System.out.print(scanner.next());}inputStream.close();socket.close();serverSocket.close();} catch (IOException e) {e.printStackTrace();}}
发送消息必须是服务端开启才能发送,否则
java.net.ConnectException: Connection refused: connectat java.net.DualStackPlainSocketImpl.connect0(Native Method)at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)at java.net.Socket.connect(Socket.java:589)at java.net.Socket.connect(Socket.java:538)at java.net.Socket.<init>(Socket.java:434)at java.net.Socket.<init>(Socket.java:244)at tcpDemo.TcpClientDemo1.main(TcpClientDemo1.java:12)Process finished with exit code 0
- 发送消息代码
public static void main(String[] args) {try {//发送消息InetAddress inetAddress = InetAddress.getByName("localhost");Socket socket = new Socket(inetAddress, 1025);OutputStream outputStream = socket.getOutputStream();outputStream.write("helloTcp".getBytes());} catch (Exception e) {e.printStackTrace();}}
使用FTP实现文件上传
- 服务器代码(开启服务 等待上传)
public static void main(String[] args) throws Exception {//创建服务ServerSocket serverSocket = new ServerSocket(1026);//监听客户端连接Socket socket = serverSocket.accept();//获取输入流InputStream is = socket.getInputStream();//输出文件FileOutputStream fos = new FileOutputStream(new File("2.jpg"));byte[] buffer = new byte[1024];int len ;while ((len=is.read(buffer))!=-1){fos.write(buffer,0,len);}//告诉客户端接收到了文件OutputStream os = socket.getOutputStream();os.write("服务端收到了文件".getBytes());//关闭资源os.close();fos.close();is.close();socket.close();serverSocket.close();}
-客户端代码(上传文件,服务开启时才能上传成功)
public static void main(String[] args) throws Exception {//创建连接Socket socket = new Socket("localhost",1026);//获取输出流OutputStream outputStream = socket.getOutputStream();//读取文件FileInputStream fis=new FileInputStream(new File("1.jpg"));byte[] buffer =new byte[1024];int len;while ((len=fis.read(buffer))!=-1){outputStream.write(buffer,0,len);}//通知服务器 已经传输完毕socket.shutdownOutput();//文件发送完毕,接收服务端返回消息InputStream is = socket.getInputStream();ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer2 = new byte[1024] ;int len2;while ((len2=is.read(buffer2))!=-1){baos.write(buffer2,0,len2);}System.out.println("客户端: "+baos.toString());//关闭资源fis.close();outputStream.close();socket.close();}
UDP协议:发短信
不连接 不稳定(消息可能发送失败)
客户端 服务端 不明确
UDP实现消息发送
- 发送方代码(无论是否有人接收,都能发送成功)
public static void main(String[] args) throws Exception{DatagramSocket socket = new DatagramSocket(2222);while (true){BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));String readLine = reader.readLine();DatagramPacket packet = new DatagramPacket(readLine.getBytes(),0,readLine.getBytes().length,new InetSocketAddress("localhost",2233));socket.send(packet);if(readLine.equals("bye")){break;}}socket.close();}
- 接收方代码
public static void main(String[] args) throws Exception{DatagramSocket socket = new DatagramSocket(2233);while (true){byte[] buffer = new byte[1024];DatagramPacket datagramPacket = new DatagramPacket(buffer, 0, buffer.length);socket.receive(datagramPacket);byte[] data = datagramPacket.getData();String receiveStr = new String(data,0,data.length).trim();System.out.println(receiveStr);if(receiveStr.equals("bye")){break;}}socket.close();}
实现聊天
- 接收方
package udpDemo;import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException;public class TaskReveive implements Runnable{private int reveivePort;private DatagramSocket socket;public TaskReveive(int reveivePort) {this.reveivePort = reveivePort;try {socket = new DatagramSocket(reveivePort);} catch (SocketException e) {e.printStackTrace();}}@Overridepublic void run() {while (true){try {byte[] buffer = new byte[1024];DatagramPacket datagramPacket = new DatagramPacket(buffer, 0, buffer.length);socket.receive(datagramPacket);byte[] data = datagramPacket.getData();String receiveStr = new String(data,0,data.length).trim();System.out.println(receiveStr);if(receiveStr.equals("bye")){break;}}catch (Exception e){e.printStackTrace();}}socket.close();} }
- 发送方
package udpDemo;import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress;public class TaskSender implements Runnable{private int sendPort;private String sendIp;private int myPort;private String myIP;public TaskSender(int sendPort, String sendIp, int myPort, String myIP) {this.sendPort = sendPort;this.sendIp = sendIp;this.myPort = myPort;this.myIP = myIP;}@Overridepublic void run(){try {DatagramSocket socket = new DatagramSocket(myPort);while (true){BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));String readLine = reader.readLine();InetSocketAddress inetSocketAddress = new InetSocketAddress(sendIp, sendPort);DatagramPacket packet = new DatagramPacket(readLine.getBytes(),0,readLine.getBytes().length,inetSocketAddress);socket.send(packet);if(readLine.equals("bye")){break;}}socket.close();}catch (Exception e){e.printStackTrace();}} }
- 每人一个接收消息 一个发送消息 实现通信
package udpDemo;public class TaskStudent {public static void main(String[] args) {new Thread(new TaskSender(2233, "localhost", 2244, "localhost")).start();new Thread(new TaskReveive(3322)).start();} }
package udpDemo;public class TestTeacher {public static void main(String[] args) {new Thread(new TaskSender(3322, "localhost", 3323,"localhost")).start();new Thread(new TaskReveive(2233)).start();} }
1.6 面试题
说一下HTTP协议
HTTP协议:超文本传输协议,属于应用层协议,规定了客户端与服务端传输数据的格式;它是无状态的,对于前面传送过的信息没有记录;请求方式有GET,POST,HEAD,PUT,DELETE等等。
最主要的get,post方法;
get请求:数据会以URL的形式传输,对数据大小有一定的限制,安全性比较低 ,用于传输一些比较小,安全性要求低的数据;
post请求:数据是通过数据包的形式传输,比较安全,用于传输比较大的,对于安全性要求较高的数据;
HTTP转态码: 状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
1xx:指示信息--表示请求已接收,继续处理2xx:成功--表示请求已被成功接收、理解、接受200 OK //客户端请求成功3xx:重定向--要完成请求必须进行更进一步的操作4xx:客户端错误--请求有语法错误或请求无法实现400 Bad Request //客户端请求有语法错误,不能被服务器所理解401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 403 Forbidden //服务器收到请求,但是拒绝提供服务404 Not Found //请求资源不存在,eg:输入了错误的URL5xx:服务器端错误--服务器未能实现合法的请求500 Internal Server Error //服务器发生不可预期的错误503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
Tcp/Udp的区别
- 基于连接与无连接
- TCP要求系统资源较多,UDP较少; (原因是tcp需要保持连接,udp不需要)
- UDP程序结构较简单
- 流模式(TCP)与数据报模式(UDP);
- TCP保证数据正确性,UDP可能丢包 (原因是tcp连接时发送 ,udp无连接,接收方无连接时可能会丢包)
- TCP保证数据顺序,UDP不保证
- tcp建立连接和断开连接
建立连接(三次握手) 双方都确认准备完毕开始发送
- 主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”这是第一次对话
- 主机B向主机A发送同意连接和要求同步:可以,你什么时候发?”
- 主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”
三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。
断开连接(四次挥手)
- 关闭方(可以是客户端也可以是服务端)发送一个包,表示自己没有要发送的数据了,这个时候开始等待被关闭方返回的消息
被关闭方接收到了关闭方发送的报文以后,也会发送数据包,告诉关闭方,他收到了关闭方发送的关闭连接的请求,但是这个时候,服务端可能还有没有发送的数据,这个时候可以发送数据。
- 被关闭方告诉关闭方,它数据发送完成,它也要关闭了
关闭方,告诉被关闭方,它知道了。
为什么要4次挥手?
确保数据能够完整传输。
当被动方收到主动方的FIN报文通知时,它仅仅表示主动方没有数据再发送给被动方了。
但未必被动方所有的数据都完整的发送给了主动方,所以被动方不会马上关闭SOCKET,它可能还需要发送一些数据给主动方后,
再发送FIN报文给主动方,告诉主动方同意关闭连接,所以这里的ACK报文和FIN报文多数情况下都是分开发送的。
网络编程(Tcp/Udp实现聊天、文件上传)相关推荐
- Java网络编程练习把本地的文件上传到服务器保存
1)文件上传到客户端步骤: 1.创建客户端socket对象,指定要连接的服务器的ip地址和端口号 2.客户端socket对象调用getOutputStream方法,获取客户端的字节输出流对象 3.创建 ...
- 网络编程 UDP通信的过程 TCP通信过程 多线程文件上传
网络概述 协议 在网络之间传出数据时需要按照指定的标准来传输,标准中规定了数据的格式.大小.传输的方式.传输速率.形成统一规范->按照规范开发的代码->协议(应用层.传输层.网络层.链路层 ...
- TCP文件上传Java_Java 理解TCP通信案例:文件上传案例
文件上传分析图解 [客户端]输入流,从硬盘读取文件数据到程序中. [客户端]输出流,写出文件数据到服务端. [服务端]输入流,读取文件数据到服务端程序. [服务端]输出流,写出文件数据到服务器硬盘中. ...
- 【Java编程系列】Minio实现文件上传下载
热门系列: [Java编程系列]Amazon S3实现文件上传下载 目录 热门系列: 1.前言 2.Minio实战代码 2.1 Minio环境部署 2.2 Minio的Sdk对接实现 2.2.1 Mi ...
- 网络编程应用:基于TCP协议【实现文件上传】--练习
要求: 基于TCP协议实现一个向服务器端上传文件的功能 客户端代码: package Homework2;import java.io.File; import java.io.FileInputSt ...
- 【Java】网络编程——TCP/UDP网络对讲机
目录 前言 OSI概述 传输层 端口 Socket InetAddress类 UDP协议间的通信 UDP协议相关类 UDP 发送端 UDP 接收端 + 发送端 UDP 聊天 + 全局广播 UDP发送大 ...
- [windows网络编程]tcp/udp编程初步详解-转
#pragma comment (lib,"ws2_32.lib") #include <Winsock2.h> #include <stdio.h> 如你 ...
- 网络编程---TCP/UDP套接字编程原理
本篇介绍的是Linux下的网络编程,故有些接口是不适用于Windows的,但是具体概念和实现方法是大体一致的 本篇重在讲解原理,具体实现请戳这里->UDP套接字编程实现 介绍 网络编程套接字(s ...
- 网络编程-tcp/udp
Java网络编程 计算机网络就是通过传输介质.通信设施和网络协议,把分散在不同地点的计算设备互连起来,实现资 源共享和数据传输的系统. TCP/IP协议簇 TCP/IP协议栈是一系列网络协议的总和,是 ...
最新文章
- 嵌入式自学多久可以找工作?应届生找嵌入式工作难吗?
- FreeBSD portupgrade升级你的FreeBSD软件[zt]
- 【Leetcode】大神总结的所有TopK问题模板(基于快速排序)
- 游戏服务器的架构演进
- C语言试题八十三之输出左下三角形九九乘法表
- Root Pane Container(三)
- InteCAD启动后提示:访问加密锁错误 如何解决?(附AutoCAD InteCAD安装教程)
- 如何做项目竞标的PPT?
- 韦根w34是多少位_韦根协议格式
- 美文听力:别错过机会
- 计算MMMM年WW周是YYYY年MM月DD日(周一)到YYYY年MM月DD日(周日)(以JS为例)
- 计算机毕业设计参考文献
- 泛微OA流程表单提交JS验证
- zencart php5.6环境,BlueHost主机一键安装ZenCart图文教程
- 单模光纤与多模光纤的区别
- hongyi lee hw02-03
- 云日记结构bug心得
- compressSlice函数代码跟踪
- GeekOS操作系统Project4
- 高考数学中含有导函数与原函数方程的题目
热门文章
- 程序员用学位证吗_如何成为没有学位的程序员?
- 阿里云SLB负载均衡理论与操作
- python offset函数_Python Pandas tseries.offsets.BusinessHour.copy用法及代码示例
- Python3中True、False、None等含义详解
- 如何获取淘宝/天猫店铺的所有商品 API数据
- 公交IC卡读写器设计指南
- 司空见惯 - 神奇的数字7
- 1美元从零开始训练Bert,手把手教你优雅地薅谷歌云TPU羊毛
- Flash Socket 的基本通讯协议流程例子
- Uni-app中几种常用的提示框