Java ServerSocket

วันนี้ได้เขียนอะไรสนุกๆ เกี่ยวกับการจำลองขารับ ServerSocket เพื่อตอบกลับ สำหรับทำการทดสอบแทน AS400 แบบ simulation


Scripts

import java.io.*;
import java.net.*;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;


public class inbound {
    private static final int PORT = 5555;
    private static final String LOG_PATH = "log/inbound/";


    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(PORT)) {
            System.out.println("Server started at port: " + PORT);


            while (true) {
                Socket clientSocket = serverSocket.accept();
                handleClient(clientSocket);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    private static void handleClient(Socket clientSocket) {
        try {
            // รับข้อมูลจาก client
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            String inputLine = in.readLine();


            // บันทึกข้อมูลไปยังไฟล์ .txt โดยใช้เวลาปัจจุบันเป็นชื่อไฟล์
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("ddMMyyyyHHmmss");
            LocalDateTime now = LocalDateTime.now(ZoneId.of("Asia/Bangkok"));
            String fileName = LOG_PATH + formatter.format(now) + ".txt";
            File file = new File(fileName);
            file.getParentFile().mkdirs();  // สร้าง directory หากยังไม่มี
            try (FileWriter writer = new FileWriter(file)) {
                writer.write(inputLine);
            }


            // แสดงผลในรูปแบบที่ต้องการ
            System.out.println("Save Log " + file.getName() + " | Length " + (inputLine != null ? inputLine.length() : 0));


            // ดึงข้อมูลตอบกลับจากไฟล์ response.txt
            String responseMessage = "";
            try (BufferedReader responseReader = new BufferedReader(new FileReader("DD25706.txt"))) {
                String line;
                while ((line = responseReader.readLine()) != null) {
                    responseMessage += line + "\n";
                }
            }


            // ส่งข้อมูลตอบกลับไปยัง client
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
            out.println(responseMessage);


            clientSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


Open Port

sudo ufw allow 5555/tcp
sudo ufw enable

Run Scripts

javac inbound.java
java inbound

ขายิงลองเขียนเป็น python ทดสอบดูก่อนได้ว่าระบบใช้งานได้ เช่น

import socket
from datetime import datetime, timedelta, timezone

def send_and_receive():
  THAI_TZ = timezone(timedelta(hours=7))

  IP = "ip"
  PORT = 5555

  with open("rq.txt", "r") as file:
    message = file.read()

  with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((IP, PORT))
    s.sendall(message.encode())
    data = s.recv(1024)

    current_time = datetime.now(THAI_TZ)
    filename = current_time.strftime('%d%m%Y%H%M%S') + "_RS.txt"
    with open(filename, 'w') as f:
      f.write(data.decode())

    print('Received:', data.decode())

send_and_receive()

ส่วนเงื่อนไขอื่นๆ เช่นเก็บ log ลงฐานข้อมูล หรือแยก socket ตามรายการ ก็ไปอะแดปใช้ดูนะครับ สวัสดี..


1
180