什么是java的网络编程

Socket 编程套接字使用TCP提供了两台计算机之间的通信机制。 客户端程序创建一个套接字,并尝试连接服务器的套接字。

当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对 Socket 对象的写入和读取来进行通信。

TCP通信:面向连接的通信,客户端和服务器端必须经过3次握手,建立逻辑连接,才能通信(安全)

通信步骤:

  • 服务器端先启动
  • 服务器端不会主动请求客户端
  • 必须使用客户端请求服务器端
  • 客户端和服务器端就会建立一个逻辑连接
  • 而这个连接中包含一个对象,这个对象就是IO对象
  • 客户端和服务器端就可以使用IO对象进行通信

服务器端必须明确两件事情:

1.多个客户端同时和服务器进行交互,服务器必须明确和那个客户端进行交互

  • 在服务器端有一个方法,叫accept客户端获取到请求的客户端对象

2.多个客户端同时和服务器进行交互,就需要使用多个IO流对象

  • 服务器是没有IO流的,服务器可以获取到请求的客户端对象Socket
  • 使用每个客户端Socket中提供的IO流和客户端进行交互
  • 服务器使用客户端的字节输入流读取客户端发送的数据
  • 服务器使用客户端的字节输出流给客户端回写数据

流程图

代码示例

服务器端

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;/*文件上传案例服务器端:读取客户端上传的文件,保存到服务器的硬盘,给客户端回写"上传成功"明确:数据源:客户端上传的文件目的地:服务器的硬盘 d:\\upload\\1.jpg实现步骤:1.创建一个服务器ServerSocket对象,和系统要指定的端口号2.使用ServerSocket对象中的方法accept,获取到请求的客户端Socket对象3.使用Socket对象中的方法getInputStream,获取到网络字节输入流InputStream对象4.判断d:\\upload文件夹是否存在,不存在则创建5.创建一个本地字节输出流FileOutputStream对象,构造方法中绑定要输出的目的地6.使用网络字节输入流InputStream对象中的方法read,读取客户端上传的文件7.使用本地字节输出流FileOutputStream对象中的方法write,把读取到的文件保存到服务器的硬盘上8.使用Socket对象中的方法getOutputStream,获取到网络字节输出流OutputStream对象9.使用网络字节输出流OutputStream对象中的方法write,给客户端回写"上传成功"10.释放资源(FileOutputStream,Socket,ServerSocket)*/
public class TCPServer {public static void main(String[] args) throws IOException {//1.创建一个服务器ServerSocket对象,和系统要指定的端口号ServerSocket server = new ServerSocket(8888);//2.使用ServerSocket对象中的方法accept,获取到请求的客户端Socket对象/*让服务器一直处于监听状态(死循环accept方法)有一个客户端上传文件,就保存一个文件*/while(true){Socket socket = server.accept();/*使用多线程技术,提高程序的效率有一个客户端上传文件,就开启一个线程,完成文件的上传*/new Thread(new Runnable() {//完成文件的上传@Overridepublic void run() {try {//3.使用Socket对象中的方法getInputStream,获取到网络字节输入流InputStream对象InputStream is = socket.getInputStream();//4.判断d:\\upload文件夹是否存在,不存在则创建File file =  new File("d:\\upload");if(!file.exists()){file.mkdirs();}/*自定义一个文件的命名规则:防止同名的文件被覆盖规则:域名+毫秒值+随机数*/String fileName = "itcast"+System.currentTimeMillis()+new Random().nextInt(999999)+".jpg";//5.创建一个本地字节输出流FileOutputStream对象,构造方法中绑定要输出的目的地//FileOutputStream fos = new FileOutputStream(file+"\\1.jpg");FileOutputStream fos = new FileOutputStream(file+"\\"+fileName);//6.使用网络字节输入流InputStream对象中的方法read,读取客户端上传的文件int len =0;byte[] bytes = new byte[1024];while((len = is.read(bytes))!=-1){//7.使用本地字节输出流FileOutputStream对象中的方法write,把读取到的文件保存到服务器的硬盘上fos.write(bytes,0,len);}//8.使用Socket对象中的方法getOutputStream,获取到网络字节输出流OutputStream对象//9.使用网络字节输出流OutputStream对象中的方法write,给客户端回写"上传成功"socket.getOutputStream().write("上传成功".getBytes());//10.释放资源(FileOutputStream,Socket,ServerSocket)fos.close();socket.close();}catch (IOException e){System.out.println(e);}}}).start();}//服务器就不用关闭//server.close();}
}

客户端

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;/*文件上传案例的客户端:读取本地文件,上传到服务器,读取服务器回写的数据明确:数据源:c:\\1.jpg目的地:服务器实现步骤:1.创建一个本地字节输入流FileInputStream对象,构造方法中绑定要读取的数据源2.创建一个客户端Socket对象,构造方法中绑定服务器的IP地址和端口号3.使用Socket中的方法getOutputStream,获取网络字节输出流OutputStream对象4.使用本地字节输入流FileInputStream对象中的方法read,读取本地文件5.使用网络字节输出流OutputStream对象中的方法write,把读取到的文件上传到服务器6.使用Socket中的方法getInputStream,获取网络字节输入流InputStream对象7.使用网络字节输入流InputStream对象中的方法read读取服务回写的数据8.释放资源(FileInputStream,Socket)*/
public class TCPClient {public static void main(String[] args) throws IOException {//1.创建一个本地字节输入流FileInputStream对象,构造方法中绑定要读取的数据源FileInputStream fis = new FileInputStream("c:\\1.jpg");//2.创建一个客户端Socket对象,构造方法中绑定服务器的IP地址和端口号Socket socket = new Socket("127.0.0.1",8888);//3.使用Socket中的方法getOutputStream,获取网络字节输出流OutputStream对象OutputStream os = socket.getOutputStream();//4.使用本地字节输入流FileInputStream对象中的方法read,读取本地文件int len = 0;byte[] bytes = new byte[1024];while((len = fis.read(bytes))!=-1){//5.使用网络字节输出流OutputStream对象中的方法write,把读取到的文件上传到服务器os.write(bytes,0,len);}/*解决:上传完文件,给服务器写一个结束标记void shutdownOutput() 禁用此套接字的输出流。对于 TCP 套接字,任何以前写入的数据都将被发送,并且后跟 TCP 的正常连接终止序列。*/socket.shutdownOutput();//6.使用Socket中的方法getInputStream,获取网络字节输入流InputStream对象InputStream is = socket.getInputStream();//7.使用网络字节输入流InputStream对象中的方法read读取服务回写的数据while((len = is.read(bytes))!=-1){System.out.println(new String(bytes,0,len));}//8.释放资源(FileInputStream,Socket)fis.close();socket.close();}
}

java练气期(3)----java高级(网络编程)相关推荐

  1. java练气期(2)----java高级(File类与IO流)

    什么是File类 即Java文件类以抽象的方式代表文件名和目录路径名.该类主要用于文件和目录的创建.文件的查找和文件的删除等. File类常用方法 delete()删除此抽象路径名表示的文件和目录. ...

  2. java练气期(1)----java高级(JDBC)

    1.什么是JDBC? JDBC: Java Database Connectivity  为多种关系型数据库提供统一访问.即通过Java代码访问和操作数据库 JDBC连接数据库的步骤 //JDBC的工 ...

  3. 西工大java高级网络编程_西工大16春《JAVA高级网络编程》平时作业

    西工大16春<JAVA高级网络编程>平时作业 7 o& [9 w  ^# D  Z一.单选题:[25道,总分:100分]5 z# ?* Z! M% M1 h4 R# n. D+ a ...

  4. 西工大java高级网络编程_奥鹏西工大16春《JAVA高级网络编程》平时作业

    西工大16春<JV高级网络编程>平时作业 一.单选题(共 25 道试题,共 100 分.) 1. 假设以tomt为w服务器,在hllopp应用中有一个hllo.jsp,它的文件路径如下: ...

  5. Java Review(三十八、网络编程)

    文章目录 网络基础 IP地址 端口 域名 网络模型 常用协议 Java 的基本网络支持 使用 InetAddress URL. URLConnection 和 URLPermission 基于TCP协 ...

  6. [练气期]计算机视觉之从矩阵本质修炼图像几何变换秘籍

    [练气期]计算机视觉之从矩阵本质修炼图像几何变换秘籍 练气期,我们需要掌握哪些图像处理知识? 掌握OpenCV和图像处理的基础知识,并进行实践操作,具体包含: 为什么选择OpenCV,OpenCV是什 ...

  7. Java基础学习——第十四章 网络编程

    Java基础学习--第十四章 网络编程 一.网络编程概述 计算机网络: 把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大.功能强的网络系统,从而使众多的计算机可以方便地互相传递信 ...

  8. 重构修练笔记 Refactoring Xiu Lian Notes (1) - 练气期

    笔记纯属虚构,如有雷同,纯属巧合 万物皆有定数,普通人入门练气期一味求快,只满足身体自身需求,对于后面更高层级没有远见,导致后面越修炼越难,极其不便和难受,从而有人直接崩盘而道陨神消.需要一种新的方法 ...

  9. Java学习记录五(多线程、网络编程、Lambda表达式和接口组成更新)

    Java学习记录五(多线程.网络编程.Lambda表达式和接口组成更新) Java 25.多线程 25.1实现多线程 25.1.1进程 25.1.2线程 25.1.3多线程的实现 25.1.4设置和获 ...

最新文章

  1. java代码开发规范
  2. 性能测试的重要意义(一)
  3. linux ipc shmget 例子,Linux IPC之共享内存C 事例(示例代码)
  4. CDays–5 习题二(利用Python科学计算特性,使用常用计算符)及相关内容解析。...
  5. 关于数据持久化的一个简介
  6. ubuntu下vsftpd配置
  7. JavaMail操作的总结(2)
  8. Python:第三方模块phonenumbers 解析全球电话号码
  9. 解决vscode的报错:Java 11 or more recent is required to run the Java extension
  10. 开关电源设计实例之Boost 篇
  11. 弗吉尼亚理工计算机科学排名,弗吉尼亚理工大学计算机科学专业
  12. 老男孩教育67期--day02--操作系统硬件知识
  13. 如何申请Autodesk ReCap 360 photo的云币(Cloud Credit)
  14. 来来来,咱们聊一下 JWT。安全验证的知识 两篇文章就够了
  15. redux 常见问题
  16. 最小化一维曼哈顿距离的简单证明
  17. 使用docker在Centos上做DNS服务器的配置
  18. java的reveserOder_reverse是什么意思_reverse的用法
  19. 大学生生涯职业规划计算机专业,大学生职业生涯规划书计算机专业范文
  20. 6-10 两个字符串穿插 (10分) PTA

热门文章

  1. rocm平台_痛击NV CUDA!AMD ROCm开放计算平台瓜熟蒂落
  2. 为什么说红外热成像测温设备是2020年最火的弱电设备?
  3. 移动端访问mysql_java – (可能)数百个移动客户端访问MySQL数据库的最佳方法是什么?...
  4. 成功解决AttributeError: module ‘tensorflow‘ has no attribute ‘get_variable‘
  5. Python之selenium:selenium库的简介、安装、使用方法之详细攻略
  6. AI开发者大会之AI学习与进阶实践:2020年7月3日《如何转型搞AI?》、《基于AI行业价值的AI学习与进阶路径》、《自动机器学习与前沿AI开源项目》、《使用TensorFlow实现经典模型》
  7. Py之cupy:cupy的简介、安装、使用方法之详细攻略
  8. 成功解决mxnet.base.MXNetError: C:\Jenkins\workspace\mxnet-tag\mxnet\3rdparty\dmlc-core\src\io\local_file
  9. Py之PyAutoGUI:python库之PyAutoGUI的简介、安装、使用方法
  10. java_OA管理系统(一):Servlet总结案例仿网络聊天室