CC00116.bigdatajava——|Java&网络编程.V05|——|Java.v05|tcp协议|框架实现|

本文详细解析了基于TCP协议的Java网络编程,包括ServerSocket和Socket类的使用,实现了客户端向服务器发送数据,服务器响应并回传数据的功能。通过多线程机制,服务器能同时处理多个客户端的连接请求,展示了客户端与服务器间的数据交换流程。代码示例中,客户端通过Scanner读取用户输入,发送到服务器,服务器接收到消息后回发'Ireceived!',直到客户端发送'bye'结束通信。
摘要由CSDN通过智能技术生成
一、相关类和方法的解析
### --- 相关类和方法的解析

——>        [基于tcp协议模型的框架实现]——[客户端向进服务器发送数据的实现]
——>        [服务器向客户端发回数据的实现]——[客户端和服务器不断通信的实现]
——>        [服务器采用多线程机制的实现]
### --- ServerSocket类

——>        java.net.ServerSocket类主要用于描述服务器套接字信息(大插排)。
二、常用的方法如下:
方法声明功能介绍
ServerSocket(int port) 根据参数指定的端口号来构造对象
Socket accept()侦听并接收到此套接字的连接请求
void close() 用于关闭套接字
### --- Socket类

——>        java.net.Socket类主要用于描述客户端套接字,是两台机器间通信的端点(小插排)。
三、常用的方法如下:
方法声明功能介绍
Socket(String host, int port)根据指定主机名和端口来构造对象
InputStream getInputStream()用于获取当前套接字的输入流
OutputStream getOutputStream() 用于获取当前套接字的输出流
void close()用于关闭套接字
### --- 注意事项

——>       客户端 Socket 与服务器端 Socket 对应, 都包含输入和输出流。
——>       客户端的socket.getInputStream() 连接于服务器socket.getOutputStream()。
——>       客户端的socket.getOutputStream()连接于服务器socket.getInputStream()
四、编程代码
package com.yanqi.task19;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.Socket;

public class ServerThread extends Thread {
    private Socket s;

    public ServerThread(Socket s) {
        this.s = s;
    }

    @Override
    public void run() {
        BufferedReader br = null;
        PrintStream ps = null;

        try {
            // 3.使用输入输出流进行通信
            br = new BufferedReader(new InputStreamReader(s.getInputStream()));
            ps = new PrintStream(s.getOutputStream());

            while(true) {
                // 实现对客户端发来字符串内容的接收并打印
                // 当没有数据发来时,下面的方法会形成阻塞
                String s1 = br.readLine();
                InetAddress inetAddress = s.getInetAddress();
                System.out.println("客户端" + inetAddress + "发来的字符串内容是:" + s1);
                // 当客户端发来的内容为"bye"时,则聊天结束
                if ("bye".equalsIgnoreCase(s1)) {
                    System.out.println("客户端" + inetAddress + "已下线!");
                    break;
                }
                // 实现服务器向客户端回发字符串内容"I received!"
                ps.println("I received!");
                System.out.println("服务器发送数据成功!");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (null != ps) {
                ps.close();
            }
            if (null != br) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != s) {
                try {
                    s.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}
五、编程代码
package com.yanqi.task19;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerStringTest {

    public static void main(String[] args) {
        ServerSocket ss = null;
        Socket s = null;

        try {
            // 1.创建ServerSocket类型的对象并提供端口号
            ss = new ServerSocket(8888);

            // 2.等待客户端的连接请求,调用accept方法
            while(true) {
                System.out.println("等待客户端的连接请求...");
                // 当没有客户端连接时,则服务器阻塞在accept方法的调用这里
                s = ss.accept();
                System.out.println("客户端" + s.getInetAddress() + "连接成功!");
                // 每当有一个客户端连接成功,则需要启动一个新的线程为之服务
                new ServerThread(s).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 4.关闭Socket并释放有关的资源
            if (null != ss) {
                try {
                    ss.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
六、编程代码:拷贝该代码为多份,实现模拟多个客户端并发效果
package com.yanqi.task19;

import com.yanqi.task10.StaticOuter;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;

public class ClientStringTest {

    public static void main(String[] args) {
        Socket s = null;
        PrintStream ps = null;
        Scanner sc = null;
        BufferedReader br = null;

        try {
            // 1.创建Socket类型的对象并提供服务器的主机名和端口号
            s = new Socket("127.0.0.1", 8888);
            System.out.println("连接服务器成功!");

            // 2.使用输入输出流进行通信
            sc = new Scanner(System.in);
            ps = new PrintStream(s.getOutputStream());
            br = new BufferedReader(new InputStreamReader(s.getInputStream()));

            while(true) {
                //Thread.sleep(10000);
                // 实现客户端发送的内容由用户从键盘输入
                System.out.println("请输入要发送的数据内容:");
                String str1 = sc.next();
                // 实现客户端向服务器发送字符串内容"hello"
                //ps.println("hello");
                ps.println(str1);
                System.out.println("客户端发送数据内容成功!");
                // 当发送的数据内容为"bye"时,则聊天结束
                if ("bye".equalsIgnoreCase(str1)) {
                    System.out.println("聊天结束!");
                    break;
                }
                // 实现接收服务器发来的字符串内容并打印
                String str2 = br.readLine();
                System.out.println("服务器回发的消息是:" + str2);
            }

        } catch (IOException /*| InterruptedException*/ e) {
            e.printStackTrace();
        } finally {
            // 3.关闭Socket并释放有关的资源
            if (null != br) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != ps) {
                ps.close();
            }
            if (null != sc) {
                sc.close();
            }
            if (null != s) {
                try {
                    s.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
七、编译打印
D:\JAVA\jdk-11.0.2\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=54365:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\NO.Z.10000——javaproject\NO.H.00001.javase\javase\out\production\javase com.yanqi.task19.ServerStringTest
等待客户端的连接请求...
客户端/127.0.0.1连接成功!
等待客户端的连接请求...
客户端/127.0.0.1连接成功!
等待客户端的连接请求...
客户端/127.0.0.1连接成功!
等待客户端的连接请求...
客户端/127.0.0.1连接成功!
等待客户端的连接请求...
客户端/127.0.0.1发来的字符串内容是:hello
服务器发送数据成功!
客户端/127.0.0.1发来的字符串内容是:bye
客户端/127.0.0.1已下线!
客户端/127.0.0.1发来的字符串内容是:hello
服务器发送数据成功!
客户端/127.0.0.1发来的字符串内容是:bye
客户端/127.0.0.1已下线!
客户端/127.0.0.1发来的字符串内容是:hello
服务器发送数据成功!
客户端/127.0.0.1发来的字符串内容是:bye
客户端/127.0.0.1已下线!
客户端/127.0.0.1发来的字符串内容是:hello
服务器发送数据成功!
客户端/127.0.0.1发来的字符串内容是:bye
客户端/127.0.0.1已下线!
D:\JAVA\jdk-11.0.2\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=54371:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\NO.Z.10000——javaproject\NO.H.00001.javase\javase\out\production\javase com.yanqi.task19.ClientStringTest
连接服务器成功!
请输入要发送的数据内容:
hello
客户端发送数据内容成功!
服务器回发的消息是:I received!
请输入要发送的数据内容:
bye
客户端发送数据内容成功!
聊天结束!

Process finished with exit code 0
D:\JAVA\jdk-11.0.2\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=54377:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\NO.Z.10000——javaproject\NO.H.00001.javase\javase\out\production\javase com.yanqi.task19.ClientStringTest1
连接服务器成功!
请输入要发送的数据内容:
hello
客户端发送数据内容成功!
服务器回发的消息是:I received!
请输入要发送的数据内容:
bye
客户端发送数据内容成功!
聊天结束!

Process finished with exit code 0
D:\JAVA\jdk-11.0.2\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=54383:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\NO.Z.10000——javaproject\NO.H.00001.javase\javase\out\production\javase com.yanqi.task19.ClientStringTest3
连接服务器成功!
请输入要发送的数据内容:
hello
客户端发送数据内容成功!
服务器回发的消息是:I received!
请输入要发送的数据内容:
bye
客户端发送数据内容成功!
聊天结束!

Process finished with exit code 0
D:\JAVA\jdk-11.0.2\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=54405:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\NO.Z.10000——javaproject\NO.H.00001.javase\javase\out\production\javase com.yanqi.task19.ClientStringTest2
连接服务器成功!
请输入要发送的数据内容:
hello
客户端发送数据内容成功!
服务器回发的消息是:I received!
请输入要发送的数据内容:
bye
客户端发送数据内容成功!
聊天结束!

Process finished with exit code 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

yanqi_vip

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

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

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

打赏作者

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

抵扣说明:

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

余额充值