|NO.Z.00116|——————————|BigDataEnd|——|Java&网络编程.V05|——|Java.v05|tcp协议|框架实现|

一、相关类和方法的解析
### --- 相关类和方法的解析

——>        [基于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

 
 
 
 
 
 
 
 
 

Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
                                                                                                                                                   ——W.S.Landor

 

posted on   yanqi_vip  阅读(22)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示