【JavaSE】Java基础语法(四十一):TCP通信程序

简介: 1. TCP发送数据Java中的TCP通信Java对基于TCP协议的的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信。Java为客户端提供了Socket类,为服务器端提供了ServerSocket类

1. TCP发送数据

  • Java对基于TCP协议的的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信。
  • Java为客户端提供了Socket类,为服务器端提供了ServerSocket类

构造方法

ab66bd537e58482188832fb39bf9fcfa.png相关方法

be32e43d27a04943b0960ef1fb46571d.png

  • 示例代码
 public class ClientDemo {
  public static void main(String[] args) throws IOException {
    //创建客户端的Socket对象(Socket)
    //Socket(String host, int port) 创建流套接字并将其连接到指定主机上的指定端口号
    Socket s = new Socket("127.0.0.1",10000);
    //获取输出流,写数据
    //OutputStream getOutputStream() 返回此套接字的输出流
    OutputStream os = s.getOutputStream();
    os.write("hello,tcp,我来了".getBytes());
    //释放资源
    s.close();
  }
}

2. TCP接收数据【应用】

  • 构造方法: 创建绑定到指定端口的服务器套接字
ServletSocket(int port)
  • 相关方法:监听要连接到此的套接字并接受它
Socket accept() 

注意事项

  1. accept方法是阻塞的,作用就是等待客户端连接
  2. 客户端创建对象并连接服务器,此时是通过三次握手协议,保证跟服务器之间的连接
  3. 针对客户端来讲,是往外写的,所以是输出流
    针对服务器来讲,是往里读的,所以是输入流
  1. read方法也是阻塞的
  2. 客户端在关流的时候,还多了一个往服务器写结束标记的动作
  3. 最后一步断开连接,通过四次挥手协议保证连接终止

  • 三次握手
  • 四次挥手

3. TCP程序练习

案例需求

客户端:发送数据,接受服务器反馈

服务器:收到消息后给出反馈

案例分析

客户端创建对象,使用输出流输出数据

服务端创建对象,使用输入流接受数据

服务端使用输出流给出反馈数据

客户端使用输入流接受反馈数据代码实现

// 客户端
public class ClientDemo {
  public static void main(String[] args) throws IOException {
    Socket socket = new Socket("127.0.0.1",10000);
    OutputStream os = socket.getOutputStream();
    os.write("hello".getBytes());
    // os.close();如果在这里关流,会导致整个socket都无法使用
    socket.shutdownOutput();//仅仅关闭输出流.并写一个结束标记,对socket没有任何
    影响
    BufferedReader br = new BufferedReader(new
    InputStreamReader(socket.getInputStream()));
    String line;
    while((line = br.readLine())!=null){
      System.out.println(line);
    }
    br.close();
    os.close();
    socket.close();
  }
}
// 服务器
public class ServerDemo {
  public static void main(String[] args) throws IOException {
    ServerSocket ss = new ServerSocket(10000);
    Socket accept = ss.accept();
    InputStream is = accept.getInputStream();
    int b;
    while((b = is.read())!=-1){
      System.out.println((char) b);
    }
    System.out.println("看看我执行了吗?");
    BufferedWriter bw = new BufferedWriter(new
    OutputStreamWriter(accept.getOutputStream()));
    bw.write("你谁啊?");
    bw.newLine();
    bw.flush();
    bw.close();
    is.close();
    accept.close();
    ss.close();
  }
}

4. TCP程序文件上传练习【应用】

案例需求

客户端:数据来自于本地文件,接收服务器反馈

服务器:接收到的数据写入本地文件,给出反馈

案例分析

- 创建客户端对象,创建输入流对象指向文件,每读一次数据就给服务器输出一次数据,输出

结束后使用shutdownOutput()方法告知服务端传输结束

创建服务器对象,创建输出流对象指向文件,每接受一次数据就使用输出流输出到文件中,

传输结束后。使用输出流给客户端反馈信息

- 客户端接受服务端的回馈信息

相关方法

6bf3938a584c4896b1ec46e65e9a6e60.png代码实现

 // 客户端
public class ClientDemo {
  public static void main(String[] args) throws IOException {
    Socket socket = new Socket("127.0.0.1",10000);
    //是本地的流,用来读取本地文件的.
    BufferedInputStream bis = new BufferedInputStream(new
    FileInputStream("socketmodule\\ClientDir\\1.jpg"));
    //写到服务器 --- 网络中的流
    OutputStream os = socket.getOutputStream();
    BufferedOutputStream bos = new BufferedOutputStream(os);
    int b;
    while((b = bis.read())!=-1){
      bos.write(b);//通过网络写到服务器中
    }
    bos.flush();
    //给服务器一个结束标记,告诉服务器文件已经传输完毕
    socket.shutdownOutput();
    BufferedReader br = new BufferedReader(new
    InputStreamReader(socket.getInputStream()));
    String line;
    while((line = br.readLine()) !=null){
      System.out.println(line);
    }
    bis.close();
    socket.close();
  }
}
// 服务器
public class ServerDemo {
  public static void main(String[] args) throws IOException {
    ServerSocket ss = new ServerSocket(10000);
    Socket accept = ss.accept();
    //网络中的流,从客户端读取数据的
    BufferedInputStream bis = new
    BufferedInputStream(accept.getInputStream());
    //本地的IO流,把数据写到本地中,实现永久化存储
    BufferedOutputStream bos = new BufferedOutputStream(new
    FileOutputStream("socketmodule\\ServerDir\\copy.jpg"));
    int b;
    while((b = bis.read()) !=-1){
      bos.write(b);
    }
    BufferedWriter bw = new BufferedWriter(new
    OutputStreamWriter(accept.getOutputStream()));
    bw.write("上传成功");
    bw.newLine();
    bw.flush();
    bos.close();
    accept.close();
    ss.close();
  }
}

相关文章
|
7天前
|
XML 存储 JSON
Java程序部署
Java程序部署
|
8天前
|
消息中间件 分布式计算 Java
Linux环境下 java程序提交spark任务到Yarn报错
Linux环境下 java程序提交spark任务到Yarn报错
18 5
|
10天前
|
Java 数据安全/隐私保护
java之基本语法
java之基本语法
17 6
|
9天前
|
Java 编译器 数据库连接
探索Java中的异常处理:提升程序的鲁棒性
【9月更文挑战第25天】在Java的世界里,异常是那些不请自来、令人头疼的“客人”。它们悄无声息地潜入我们的代码,一旦出现,便可能导致程序崩溃或行为异常。但是,如果能够妥善管理这些异常,我们就能将潜在的灾难转变为增强程序鲁棒性和用户体验的机会。本文将通过深入浅出的方式,带领读者理解Java异常处理的重要性,并提供实用的策略来优雅地处理这些意外情况。让我们一起学习如何在Java中捕捉、处理和预防异常,确保我们的程序即使在面对不可预见的错误时也能保持稳健运行。
|
15天前
|
监控 Java 数据库
Java程序如何进行不停机更新?
Java程序如何进行不停机更新?
17 1
|
28天前
|
存储 Java 容器
Java 基础语法
Java是一种面向对象的编程语言,其基础语法包括类和对象、方法、变量、控制流语句、继承和多态以及异常处理。代码需写在类中,`main()`方法是程序入口,变量用于存储数据,控制流语句控制程序执行流程,继承和多态增强代码灵活性,异常处理保证程序稳定性。掌握这些知识可帮助您编写简单的Java程序。
|
9天前
|
传感器 网络协议 Java
三大硬核方式揭秘:Java如何与底层硬件和工业设备轻松通信!
大家好,我是V哥。最近与一位从事工业互联网项目的学员交流,启发我分享Java如何与底层硬件和工业设备通信。本文将介绍三种方法:1)使用`jLibModbus`库通过Modbus协议读取设备寄存器数据;2)使用JNI(Java Native Interface)直接访问硬件;3)使用`JSerialComm`库通过串口通信读取数据。每种方法都有详细步骤和示例代码,帮助你轻松实现与硬件设备的通信。无论是工业自动化还是物联网应用,这些方法都能派上用场。欢迎关注和支持!
|
6天前
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
21 2
|
10天前
|
存储 缓存 Java
java线程内存模型底层实现原理
java线程内存模型底层实现原理
java线程内存模型底层实现原理
|
15天前
|
缓存 Java 应用服务中间件
Java虚拟线程探究与性能解析
本文主要介绍了阿里云在Java-虚拟-线程任务中的新进展和技术细节。
下一篇
无影云桌面