2025年2月21日17:23:56

master
qmstyle 2025-02-21 17:24:05 +08:00
commit 6b872416ae
7 changed files with 349 additions and 0 deletions

38
.gitignore vendored Normal file
View File

@ -0,0 +1,38 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

45
pom.xml Normal file
View File

@ -0,0 +1,45 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zhangmeng</groupId>
<artifactId>Tcp-Server</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Tcp-Server</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>21</java.version>
</properties>
<dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.27</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>21</source>
<target>21</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,24 @@
package com.zhangmeng;
import com.zhangmeng.service.impl.ServerImpl;
/**
* Hello world!
*
*/
public class TcpApplication
{
public static void main( String[] args )
{
ServerImpl.Config config = new ServerImpl.Config();
config.setName("SimpleServer");
config.setIPVersion("IPv4");
config.setIP("127.0.0.1");
config.setPort(8888);
ServerImpl server = new ServerImpl();
server.setConfig(config);
server.Start();
}
}

View File

@ -0,0 +1,67 @@
package com.zhangmeng.handler;
import cn.hutool.core.io.BufferUtil;
import java.io.*;
import java.net.Socket;
/**
* @author zm
* @date 2025/2/21 15:40
* @version: 1.0
*/
public class ClientHandler implements Runnable {
private Socket socket;
// private BufferedReader reader;
// private BufferedWriter writer;
private OutputStream outputStream;
private InputStream inputStream;
public void close() {
try {
outputStream.close();
inputStream.close();
socket.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public void run() {
while (true) {
try {
byte[] bytes = new byte[1024];
int len = inputStream.read(bytes);
if (len == -1) {
break;
}
String message = new String(bytes, 0, len);
System.out.println("receive message: " + message);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
public Socket getSocket() {
return socket;
}
public void setSocket(Socket socket) {
this.socket = socket;
}
public ClientHandler(Socket socket) {
this.socket = socket;
try {
this.inputStream = socket.getInputStream();
this.outputStream = socket.getOutputStream();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

View File

@ -0,0 +1,21 @@
package com.zhangmeng.service;
/**
* @author zm
* @Description:
* @date 2025/2/21 15:03
* @version: 1.0
*/
public interface Server {
//启动服务器方法
public void Start();
//停止服务器方法
public void Stop();
//开启业务服务方法
public void Serve();
}

View File

@ -0,0 +1,115 @@
package com.zhangmeng.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.BufferUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.log.Log;
import cn.hutool.log.LogFactory;
import cn.hutool.log.StaticLog;
import cn.hutool.socket.aio.AioServer;
import cn.hutool.socket.aio.AioSession;
import cn.hutool.socket.aio.SimpleIoAction;
import com.zhangmeng.handler.ClientHandler;
import com.zhangmeng.service.Server;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
/**
* @author zm
* @date 2025/2/21 15:04
* @version: 1.0
*/
public class ServerImpl implements Server {
private final Log log = LogFactory.get();
private Config config;
private ServerSocket serverSocket;
@Override
public void Start() {
log.info("[START] Server listenner at IP: {}, Port {}, is starting", config.getIP(), config.getPort());
try {
serverSocket = new ServerSocket(config.getPort());
while (true) {
Socket accept = serverSocket.accept();
log.info("[ACCEPT] Accept a client at IP: {}, Port {}", accept.getInetAddress().getHostAddress(), accept.getPort());
new Thread(new ClientHandler(accept)).start();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public void Stop() {
log.info("[STOP] Server listenner at IP: {}, Port {}, is stoped", config.getIP(), config.getPort());
try {
serverSocket.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public void Serve() {
}
public void setConfig(Config config) {
this.config = config;
}
public static class Config {
//服务器的名称
private String Name;
//tcp4 or other
private String IPVersion;
//服务绑定的IP地址
private String IP;
//服务绑定的端口
private int Port;
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getIPVersion() {
return IPVersion;
}
public void setIPVersion(String IPVersion) {
this.IPVersion = IPVersion;
}
public String getIP() {
return IP;
}
public void setIP(String IP) {
this.IP = IP;
}
public int getPort() {
return Port;
}
public void setPort(int port) {
Port = port;
}
}
}

View File

@ -0,0 +1,39 @@
package com.zhangmeng;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
/**
* Unit test for simple App.
*/
public class AppTest {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
System.out.println("等待连接服务端!");
Socket socket = new Socket("127.0.0.1", 8888);
System.out.println("连接服务端成功!");
while (true) {
// 给服务端发信息
System.out.print("请输入:");
String s = scanner.next();
if ("out".equals(s)) {
break;
}
OutputStream outputStream = socket.getOutputStream();
outputStream.write(s.getBytes(StandardCharsets.UTF_8));
byte[] bytes = new byte[1024];
// 读一下服务端发来的信息
InputStream inputStream = socket.getInputStream();
int read = inputStream.read(bytes);
System.out.println("服务端:" + new String(bytes, 0, read, Charset.defaultCharset()));
}
}
}