|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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」