【JavaEE】网络编程——TCP

在这里插入图片描述
🤡🤡🤡个人主页🤡🤡🤡
🤡🤡🤡JavaEE专栏🤡🤡🤡

前言

网络编程的目的是为了跨主机通信,socket==》操作系统提供的网络编程的API就称为"socket"API

1.网络编程套接字

TCP和UDP都是传输层协议,都是给应用层提供服务的,由于这两个协议特点差异非常打,因此我们就需要两套API来分别表示。

1.1流式套接字(TCP)

1.1.1特点

  1. 有连接:在数据传输开始前,需要通信双方建立一个专用的通道,数据传输完成后再关闭连接,好比打电话,需要双方都接通才可以对话
  2. 可靠传输:在传输数据的时候,尽可能的将数据传输到达对方,并不是100%
  3. 面向字节流:面向对象是字节,在读写的操作会非常灵活。
  4. 全双工:一条链路中,能够进行双向通信。

1.1.2编码

TCP中的socket API重点是两个类:ServerSocket和Socket。

1.1.2.1ServerSocket

ServerSocket这个类主要是用于TCP的服务器的,里面有一个非常重要的方法accept,这个方法主要是让服务器与客户端建立连接的方法,没有建立连接是无法让服务器与客户端双方互相通信。

1.1.2.2Socket

Socket这个类是既可以用于服务器中也可以用于客户端中,这个类主要是以字节的形式将数据存储和传输的,所以这个类中提供的两种方法可以类比文件操作中的方法,这个类提供getInputStream()和getOutputStream()
前者是相当于文件操作中的读操作,后者类比于写操作,只是这里的操作对象换成了服务器与客户端了。

1.1.2.3实现一个TCP(7*24)回显服务器

在这里由于getInputStream()数据都是以字节的形式存在和传输的,但在处理响应的时候会转化为字符串的形式,为了不这么麻烦的去转化,我们就用Scanner来作为读操作,将getInputStream实现的对象放入Scanner构造方法中,让Scanner内部将字节数据转化为字符串的形式,这样就避免了之后程序中许多转化。

public class tcpEchoServer {
   
   
    private ServerSocket serverSocket = null;

    public tcpEchoServer(int port) throws IOException {
   
   
        serverSocket = new ServerSocket(port);
    }
    public void start() throws IOException {
   
   
        System.out.println("服务器启动!!!");
        //将服务器与客户端进行连接,连接成功返回一个Socket对象,后续服务器对客户端的操作都基于这个对象
        while(true) {
   
   
            Socket clientSocket = serverSocket.accept();
            //创建一个方法来操作每一个客户端与服务器的联系
            processConnection(clientSocket);
        }
    }
    public void processConnection(Socket clienSocket) throws IOException {
   
   
        //打印一个客户端上线的日志
        System.out.printf("[%s:%d]客户端上线!\n",clienSocket.getInetAddress(),clienSocket.getPort());
        //1.接收客户端发送过来的信息和并解析
        try(InputStream inputStream = clienSocket.getInputStream();
            OutputStream outputStream = clienSocket.getOutputStream()) {
   
   
            //接收客户端发送过来的请求并解析(相当于从客户端读到服务器),用到Scanner的原因是由于InputStream读取的数据是字节的形式,
            //后续处理数据的时候还是要将数据从字节形式转化为字符串,而Scanner内部可以帮我们直接转化。
            Scanner scanner = new Scanner(inputStream);
            //由于需要处理客户端不断发送过来的请求,我们就需要一个while循环
            while(true) {
   
   
                //处理客户端那边不发送请求的情况
                if(!scanner.hasNext()) {
   
   
                    System.out.printf("[%s:%d]客户端下线!\n",clienSocket.getInetAddress(),clienSocket.getPort());
                    break
### JavaEE 网络编程的关键概念 在网络编程领域,JavaEE 提供了一系列工具和技术来简化网络通信的实现。对于应用层而言,网络编程主要涉及应用程序间的沟通机制[^3]。 #### 协议的选择与作用 不同类型的协议适用于特定的应用需求和场景,在Java EE开发中,开发者可以根据实际需要选择适合的协议以满足功能要求[^1]。例如: - **SMTP (Simple Mail Transfer Protocol)**:用于电子邮件传输。 - **FTP (File Transfer Protocol)**:支持文件上传下载操作。 - **Telnet**:提供远程登录服务。 这些协议均位于OSI七层模型中的第七层——应用层,它们定义了如何处理来自上层的数据以及向用户提供接口的方式。 #### Socket 编程基础 为了建立两个进程之间的连接并交换数据,可以利用Socket API完成基本的操作。ServerSocket类提供了监听端口等待客户连接的能力;而DatagramSocket则允许发送或接收基于UDP协议的消息包[^2][^5]。 ```java // 使用TCP协议的服务端实例化过程 ServerSocket server = new ServerSocket(port); // 绑定至指定端口号 ``` ```java // UDP方式下的客户端初始化语句 DatagramSocket client = new DatagramSocket(); // 默认分配可用本地地址及随机开放端口 ``` 通过上述两种形式之一即可开启一次完整的会话流程,进而执行诸如读取输入流、写入输出流之类的常规任务。 #### Echo 实现案例分析 作为一种简易测试手段,“Echo”模式下服务器仅需原样返回收到的信息而不做任何额外加工处理。这种方式有助于初学者快速掌握Socket的工作原理及其API调用方法[^4]。 ```java public class SimpleEchoServer { public static void main(String[] args) throws IOException { try(ServerSocket ss = new ServerSocket(8080)){ while(true){ try(Socket sckt = ss.accept()){ BufferedReader br = new BufferedReader(new InputStreamReader(sckt.getInputStream())); PrintWriter pw = new PrintWriter(sckt.getOutputStream(), true); String inputLine; while ((inputLine = br.readLine()) != null && !inputLine.isEmpty()){ System.out.println("Received: " + inputLine); pw.println(inputLine.toUpperCase()); } } catch(IOException e){ break; // Exit on error. } } } } } ``` 这段代码展示了怎样构建一个简单的回声(Echo) TCP服务器,它接受来自客户的字符串并将之转换成大写字母后再送回去作为回应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

《冰美式与三明治》

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值