TCP网络编程

这里我们通过一个例子来了解什么是TCP网络编程:

eg: 问题: —> 从客户端发送文件到服务端,服务端将接受到的客户端发来的文件存储到本地之后并返回一个发送成功给客户端,并关闭相应的连接

  • 首先我们先给出服务端的程序

package 网络编程.TCP网络编程;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;public class Server2 {/*这里我们实际编程中应该是要使用try --- catch --- finally来解决异常,但是我们这里为了思路清晰就使用了throws + 异常对象的方式将异常对象进行了抛出*/public static void main(String[] args) throws IOException{/*创建ServerSocket类的对象,客户端是创建Socket,而服务器端是创建ServerSocket对象注意 : 创建ServerSocket对象也会抛出IOException*/ServerSocket ss = new ServerSocket(9090);/*使用ServerSocket类的对象调用accept()方法获取客户端传输的Socket对象*/Socket socket = ss.accept();/*获得客户端Socket对象对应的输入流*/InputStream is = socket.getInputStream();/*创建一个字节输出流,将客户端传输过来的文件写出到异常中*/FileOutputStream fos = new FileOutputStream(new File("hi.png"));/*创建一个缓冲数组*/byte [] buffer = new byte[1024];/*创建一个临时变量 -- 用于存储read()方法的返回值*/int len = 0;/*使用客户端传输过来的Socket对应的输入流将数据读入内存之后又使用字节输出流将内存中的文件写出到硬盘中*/while((len = is.read(buffer))!= -1){fos.write(buffer,0,len);}/*服务器端给客户端给出提示*/OutputStream os2 = socket.getOutputStream();os2.write("发送成功".getBytes());/*流资源的关闭*/fos.close();is.close();socket.close();ss.close();os2.close();}
}
  • 其次这里我们再给出客户端的程序
package 网络编程.TCP网络编程;import java.io.*;
import java.net.InetAddress;
import java.net.Socket;public class Client2 {//注意: 实际编程中我们应该是使用try --- catch --- finally将异常处理掉,但是这里我们为了思路的清晰使用了throws + 异常对象将异常抛出了public static void main(String[] args) throws IOException{//创建Socket对象,Socket对象作为网络传输的节点,我们要给客户端的Socket中封装有目标的IP地址+端口号/*注意: 我们创建Socket对象的时候会抛出IOException不管我们使用Socket类的构造器或者是使用ServerSocket类对象调用accept()方法得到Socket对象都会有IOException*/Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9090);/*获取对应Socket对象的输出流,用于将文件发送给服务器端*/OutputStream os = socket.getOutputStream();/*创建一个字节输入流,将我们的图片文件"abc.png"读取到内存中来,后面再使用Socket对象的输出流将文件传输给服务器端*/FileInputStream fis = new FileInputStream(new File("abc.png"));/*创建缓冲数组*/byte [] bytes = new byte[1024];/*创建临时变量存储read()方法的返回值*/int len = 0;/*使用字节输入流对象将文件从硬盘中读取到内存中,然后使用Socket对象对应的输出流将文件输出*/while((len = fis.read(bytes))!=-1){os.write(bytes,0,len);}/*由于我们的read()方法时阻断式的方法,一次一个输入流对象只能有一个read()方法在进行并且这个时候我们的Socket对应的输出流写出文件没有一个具体的停止的时机,这个时候我们的服务端中的Socket对应的输入流的read()就会一直执行,一直在等待这个输出流写出数据,这个时候就一直卡到这个read()方法处后面的客户端中的Socket对应的read()方法也不会执行,因为同时一个输入流对象只可以有一个read()方法在执行那么这个时候我们就要想办法让我们的输入流停下来,这个时候我们又两种办法,一种是让前面的Socket对应的输出流停止输出还有一种就是让这个read()停止输入,但是让read()注意: 这个时候就要视情况而定了,我们一般都是让关闭前面Socket对应的输出流 -- 也就是在这里调用shutdownOutput()方法;*/socket.shutdownOutput();/*获取socket对象对应的输入流对象*/InputStream is2 = socket.getInputStream();/*创建一个ByteArrayOutputStream类的对象 , 防止出现byte[]数据转换为String时出现乱码*/ByteArrayOutputStream boas = new ByteArrayOutputStream();/*创建一个缓冲数组*/byte [] buffer = new byte[1024];/*创建一个临时变量,用于存储read()方法的返回值*/int len2 = 0;while((len2 = is2.read(buffer))!=-1){/*使用了ByteArrayOutputStream类的write()方法,会讲要输出的byte[]类型的数据先整体存储到一个恨大的数组中,然后一次性输出*/boas.write(buffer,0,len2);}//调用ByteArrayOutputStream类的toString()方法进行输出System.out.println(boas);/*流资源的关闭*/os.close();fis.close();socket.close();}
}

补充:

  1. 输入流的read()方法是一个阻断式的方法

    • 一个输入流对象同时只能有一个read()方法在执行
  2. 我们可以通过调用Socket类中的shutdownOutput()方法来显示的,明确的关闭某个Socket类的对象对应的输出流

    • 当然调用shutdownInput()方法同样可以关闭输入流

TCP网络编程 [Java]相关推荐

  1. 迈入JavaWeb第一步,Java网络编程基础,TCP网络编程URL网络编程等

    文章目录 网络编程概述 网络通信要素 要素一IP和端口号 要素二网络协议 TCP网络编程 UDP网络编程 URL网络编程 Java网络编程基础 网络编程概述 Java是Internet上的语言,它从语 ...

  2. java获取主机信息大全,网络编程:Java获取网络主机信息

    java.net.InetAddress类表示互联网协议 (IP) 地址. 有两个子类:Inet4Address, Inet6Address 通过 InetAddress可以方便获取一个域名下的IP, ...

  3. TCP网络编程的基本流程

    TCP网络编程的基本流程 对于服务端,通常为以下流程: 调用socket函数创建socket 调用bind函数将socket绑定到某个IP和端口上 调用listen开始监听 当有客户端请求连接上来时, ...

  4. 网络编程--JAVA之多线程下载后续:断点续存

    这篇博客就是接在我上篇博客网络编程–JAVA之多线程下载的基础上来实现的. 首先,我来说一下断点续存能解决啥问题: 假如当我们在进行MP4下载时,如果突然出现人为的中断或者意外的中断,那么当我们再次点 ...

  5. 【计算机网络】Linux环境中的TCP网络编程

    文章目录 前言 一.TCP Socket API 1. socket 2. bind 3. listen 4. accept 5. connect 二.封装TCPSocket 三.服务端的实现 1. ...

  6. muduo学习笔记:net部分之实现TCP网络编程库-Buffer

    文章目录 为什么采用non-blocking网络编程中应用层buffer是必需的? Buffer 设计 Buffer::readFd() 线程安全 Muduo Buffer 的数据结构 Muduo B ...

  7. 套接字编程-TCP网络编程

    文章目录 套接字地址结构 通用套接字地址数据结构 以太网协议的套接字地址数据结构 Netlink协议套接字地址结构 TCP网络编程 套接字初始化socket() domain type protoco ...

  8. 粤嵌GEC6818板子TCP网络编程发送命令控制音视频

    TCP网络编程 (1)gec6818网络编程前期准备工作 (1).开发板和Ubuntu系统都处于教室局域网内 1.开发板和电脑(Ubuntu)都需要连接上教室的网线 2.开发板设置ip地址 在开发板终 ...

  9. tcp网络编程客户端和服务端及listen和tcp允许最大连接数

    tcp网络编程 tcp网络编程步骤: 由于tcp传输特点是可靠有连接,那么就有 1.客户端向服务端发送连接请求(SYN), 2.服务端接受请求并向客户端发送(SYN+ACK); 3.客户端向服务端回复 ...

最新文章

  1. unity, shader, Tags的位置
  2. 高人对libsvm的经典总结(全面至极)
  3. 【算法竞赛学习】数字中国创新大赛智慧海洋建设-Task1地理数据分析常用工具
  4. 定时器取数据时实时进来的数据_Redis-数据淘汰策略amp;持久化方式(RDB/AOF)amp;Redis与Memcached区别...
  5. 那些与 IE 相伴的日子
  6. 任晶磊:如何看待程序员在 GitHub 发起抗议互联网公司实行 996 工作制网站?
  7. vector自动扩容如何实现_全自动拉伸膜真空包装机是如何实现全自动化生产的?...
  8. OpenAI升级Codex,直接将书面语言转为计算机代码;区块链网站被黑客偷走6亿美元加密货币|极客头条...
  9. 软件构建中的设计(一)
  10. Cartopy 中的地图投影
  11. ArcGIS创建拓扑
  12. 初识Tracepro及基本操作说明
  13. spring boot在整合mybatis的时候报错Mapper method'...'has an unsupported return type'...'
  14. PowerDNS Authoritative Server 3.3 发布
  15. mediawiki java api_MediaWiki API 帮助
  16. 局部连接层(Locally-Connected Layer)
  17. Kali 开机启动慢解决方案(用时56秒)
  18. 2路2U机架服务器,如何理解
  19. 五分钟上手Premiere——小白的视频剪辑笔记
  20. 计算机组成原理——TEC-2储存器实验

热门文章

  1. 解压文件密码是html格式,解压密码
  2. Oracle ltrim() rtrim() 函数详细用法
  3. 航天中认软测/测试实习生
  4. 读透《华为数字化转型之道-方法篇》 by 傅一平
  5. 温湿度系统(花葵、库房检测)
  6. AT91SAM926x开发全流程
  7. hive介绍及其原理
  8. 互融云借条APP系统开发 六大系统优势全面保障
  9. Appium常用操作及H5页面元素定位
  10. Halcon模板匹配定位跟随找圆