基于 TCP/IP 协议的网络编程

在说明基于 TCP/IP 协议的网络编程之前,先来了解一下 Socket(网络套接字):

  • 利用套接字(Socket)开发网络应用程序早已被广泛的采用,以至于成为事实上的标准
  • 通信的两端都要有 Socket,是两台机器间通信的端点(API 原话)
  • 网络通信其实就是 Socket 间的通信
  • Socket 允许程序把网络连接当成一个,数据在两个 Socket 间通过 IO 传输
  • 一般主动发起通信的应用程序属客户端,等待通信请求的为服务端

网络编程某种程度上可以称作“Socket 编程”


TCP/IP 编程,简单模拟客户端与服务端之间的交互(先开 Server 再开 Client):

  1. public class TestTCP {
  2. @Test
  3. public void client() {
  4. Socket socket = null;
  5. OutputStream os = null;
  6. try {
  7. // 创建 Socket 对象以指明目标 Server 的 IP 和端口
  8. socket = new Socket("127.0.0.1", 9876);
  9. // 调用该套接字对象的 getOutputStream()方法返回 OutputStream 对象以写出数据
  10. os = socket.getOutputStream();
  11. // 后面实际就是 IO 流的应用
  12. os.write("This is the message sent by client".getBytes());
  13. } catch (UnknownHostException e) {
  14. e.printStackTrace();
  15. } catch (IOException e) {
  16. e.printStackTrace();
  17. } finally {
  18. if (os != null) {
  19. try {
  20. os.close();
  21. } catch (IOException e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. // socket 也是稀有资源,记得及时关闭
  26. if (socket != null) {
  27. try {
  28. socket.close();
  29. } catch (IOException e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. }
  34. }
  35. @Test
  36. public void server() {
  37. ServerSocket ss = null;
  38. Socket socket = null;
  39. InputStream is = null;
  40. try {
  41. // 创建 ServerSocket 对象指明开放那个端口作为传输端口
  42. ss = new ServerSocket(9876);
  43. // 调用 accept()方法,返回一个 Socket 对象,监听 ServerSocket 对应的端口并且接受对该端口的连接
  44. socket = ss.accept();
  45. // 调用该套接字对象的 getInputStream()方法返回 InputStream 对象以写入从 client 接收到的数据
  46. is = socket.getInputStream();
  47. // 后面实际就是 IO 流的应用
  48. byte[] b = new byte[10];
  49. int len;
  50. while ((len = is.read(b)) != -1) {
  51. // 打印字节流
  52. System.out.print(new String(b, 0, len));
  53. }
  54. } catch (IOException e) {
  55. e.printStackTrace();
  56. } finally {
  57. if (is != null) {
  58. try {
  59. is.close();
  60. } catch (IOException e) {
  61. e.printStackTrace();
  62. }
  63. }
  64. if (socket != null) {
  65. try {
  66. socket.close();
  67. } catch (IOException e) {
  68. e.printStackTrace();
  69. }
  70. }
  71. if (ss != null) {
  72. try {
  73. ss.close();
  74. } catch (IOException e) {
  75. e.printStackTrace();
  76. }
  77. }
  78. }
  79. }
  80. }

若要实现多步交互,注意 Socket 方法的阻塞性问题,如果一直监听端口,就不能执行后续代码,故记得调用相关 shutdown 方法以关闭监听,以下例子修改自上例,实现在 Server 端收到字节流后,返回给 Client 一条反馈信息:

  1. public class TestTCP {
  2. @Test
  3. public void client() {
  4. Socket socket = null;
  5. OutputStream os = null;
  6. InputStream is = null;
  7. try {
  8. // 创建 Socket 对象以指明目标 Server 的 IP 和端口
  9. socket = new Socket("127.0.0.1", 9876);
  10. // 调用该套接字对象的 getOutputStream()方法返回 OutputStream 对象以写出数据
  11. os = socket.getOutputStream();
  12. // 后面实际就是 IO 流的应用
  13. os.write("This is the message sent by client".getBytes());
  14. // ----------update----------
  15. // 显式的禁用此套接字的输出流
  16. socket.shutdownOutput();
  17. // 接受反馈
  18. is = socket.getInputStream();
  19. byte[] b = new byte[10];
  20. int len;
  21. while ((len = is.read(b)) != -1) {
  22. System.out.print(new String(b, 0, len));
  23. }
  24. // ----------update----------
  25. } catch (UnknownHostException e) {
  26. e.printStackTrace();
  27. } catch (IOException e) {
  28. e.printStackTrace();
  29. } finally {
  30. if (os != null) {
  31. try {
  32. os.close();
  33. } catch (IOException e) {
  34. e.printStackTrace();
  35. }
  36. }
  37. // socket 也是稀有资源,记得及时关闭
  38. if (socket != null) {
  39. try {
  40. socket.close();
  41. } catch (IOException e) {
  42. e.printStackTrace();
  43. }
  44. }
  45. }
  46. }
  47. @Test
  48. public void server() {
  49. ServerSocket ss = null;
  50. Socket socket = null;
  51. InputStream is = null;
  52. OutputStream os = null;
  53. try {
  54. // 创建 ServerSocket 对象指明开放那个端口作为传输端口
  55. ss = new ServerSocket(9876);
  56. // 调用 accept()方法,返回一个 Socket 对象,监听 ServerSocket 对应的端口并且接受对该端口的连接
  57. socket = ss.accept();
  58. // 调用该套接字对象的 getInputStream()方法返回 InputStream 对象以写入从 client 接收到的数据
  59. is = socket.getInputStream();
  60. // 后面实际就是 IO 流的应用
  61. byte[] b = new byte[10];
  62. int len;
  63. while ((len = is.read(b)) != -1) {
  64. // 打印字节流
  65. System.out.print(new String(b, 0, len));
  66. }
  67. // ----------update----------
  68. // 反馈一条消息给 Client
  69. os = socket.getOutputStream();
  70. os.write("I have received your message".getBytes());
  71. // ----------update----------
  72. } catch (IOException e) {
  73. e.printStackTrace();
  74. } finally {
  75. if (os != null) {
  76. try {
  77. os.close();
  78. } catch (IOException e) {
  79. e.printStackTrace();
  80. }
  81. }
  82. if (is != null) {
  83. try {
  84. is.close();
  85. } catch (IOException e) {
  86. e.printStackTrace();
  87. }
  88. }
  89. if (socket != null) {
  90. try {
  91. socket.close();
  92. } catch (IOException e) {
  93. e.printStackTrace();
  94. }
  95. }
  96. if (ss != null) {
  97. try {
  98. ss.close();
  99. } catch (IOException e) {
  100. e.printStackTrace();
  101. }
  102. }
  103. }
  104. }
  105. }
时间: 2024-10-10 08:00:30

基于 TCP/IP 协议的网络编程的相关文章

java socket 基于TCP/IP 协议

Java socket 基于TCP/IP 协议应用 多线程服务器原理: 1.          服务器端创建serversocket并绑定要监听的端口号 ,循环调用serversoket 的accept()方法,等待客户端的连接请求 2.          客户端创建一个socket绑定服务器端的IP地址和服务器监听的端口号并请求和服务器端连接 3.          服务器端接收到客户端的请求后,创建一个socket与客户端建立专线连接 4.          建立连接的两个socket在一个

TCP/IP的经典网络编程

                                                                         TCP/IP网络编程之四书五经                                                                                                                             孟岩 TCP/IP协议是眼下广域网和局域网通用的网络协议.因此.基于TCP

linux视频学习3(linux安装,shell,tcp/ip协议,网络配置)

linux系统的安装: 1.linux系统的安装方式三种: 1.独立安装linux系统. 2.虚拟机安装linux系统. a.安装虚拟机,基本是一路点下去. b.安装linux. c.linux 安装的时候,分区是关键. /boot 分区 100M. /swap 交换分区.一般是物理内存的2倍,不超过256M. /root 根分区.尽可能的大. 3.双系统安装. 2 linux下的shell 3.TCP/IP 协议 4.samba服务器.主要是linux和window的交互.

网络通信-在浏览器输入url,基于TCP/IP协议的解释

知识点1: 网络模型 TCP/IP四层 和ISO七层模型 (统一省略后面层字.比如传输代表传输层) 知识点2: 在应用层中TCP建立连接,经历的三次握手协议 首先:,TCP协议是什么? 为什么要三次握手? 答:TCP协议是面向连接的,而且是点对点的可靠(无差错.不丢失.不重复.按顺序)数据传输服务,他的一些特点,字节流.连接建立后随时传输数据, 其次,握手的目的是在通知对方自己的初始化序号(Initial Sequence Number),简称ISN,保证数据不混乱. 然后: 三次握手的过程是什

UDP/IP协议的网络编程

//127.0.0.1是本机IP地址 package lianxi1; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import org.junit.Test; public class TestUDP1 { @Test public void send(){ DatagramSocket ds = null; try { ds = new Datagra

网络编程的基本概念,TCP/IP协议简介

8.1.1 网络基础知识 计算机网络形式多样,内容繁杂.网络上的计算机要互相通信,必须遵循一定的协议.目前使用最广泛的网络协议是Internet上所使用的TCP/IP协议. 网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯.网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输.在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机.而TCP层则提供面向应

【网络编程】TCP/IP协议

Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议.Internet国际互联网络的基 础,由网络层的IP协议和传输层的TCP协议组成.TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准.协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求.通 俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,

TCP/IP协议与HTTP协议区别SOCKET接口详解

网络由下往上分为:      物理层--                       数据链路层-- 网络层--                       IP协议 传输层--                       TCP协议 会话层-- 表示层和应用层--           HTTP协议   socket则是对TCP/IP协议的封装和应用(程序员层面上).也可以说,TPC/IP协议是传输层协议,主要解决数据 如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据.关于TCP/

二:熟悉 TCP/IP 协议

一篇文章带你熟悉 TCP/IP 协议(网络协议篇二) 同样的,本文篇幅也比较长,先来一张思维导图,带大家过一遍. 一图看完本文 一. 计算机网络体系结构分层 计算机网络体系结构分层计算机网络体系结构分层不难看出,TCP/IP 与 OSI 在分层模块上稍有区别.OSI 参考模型注重“通信协议必要的功能是什么”,而 TCP/IP 则更强调“在计算机上实现协议应该开发哪种程序”. 二. TCP/IP 基础 1. TCP/IP 的具体含义 从字面意义上讲,有人可能会认为 TCP/IP 是指 TCP 和