Java使用Socket传输数据

复制代码
import sun.swing.UIAction;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;

//TIP To <b>Run</b> code, press <shortcut actionId="Run"/> or
// click the <icon src="AllIcons.Actions.Execute"/> icon in the gutter.
public class Main {
    public static void main(String[] args) {
        JFrame jf = new JFrame("socket通信");
        jf.setSize(800, 400);
        JPanel jp = new JPanel();
        JButton jbServerCreate = new JButton("创建服务");
        jp.add(jbServerCreate);
        jbServerCreate.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                createServer();
            }
        });
        JButton jbServerClose = new JButton("关闭服务");
        jp.add(jbServerClose);
        jbServerClose.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                closeServer();
            }
        });

        JButton jbClientCreate = new JButton("创建客户端");
        jp.add(jbClientCreate);
        jbClientCreate.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                createClient();
            }
        });
        JButton jbClientClose = new JButton("关闭客户端");
        jp.add(jbClientClose);
        jbClientClose.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                closeClient();
            }
        });
        JButton jbSendFromClient = new JButton("发送数据到服务");
        jp.add(jbSendFromClient);
        jbServerClose.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                sendFromClient();
            }
        });


        jf.add(jp);

        // 设置窗口关闭时退出程序
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 显示窗口
        jf.setVisible(true);
    }

    private static ServerSocket serverSocket = null;
    private static boolean isServerRunning = true;

    private static void createServer() {
        isServerRunning = true;
        try {
            serverSocket = new ServerSocket(6666);
//            serverSocket.bind(new InetSocketAddress("127.0.0.1", 6666));
            System.out.println("创建了8088端口的服务器");
            new Thread(new Runnable() {
                @Override
                public void run() {
                    Socket cs = null;
                    try {
                        cs = serverSocket.accept();
                        System.out.println("有新的连接请求,客户端地址" + cs.getInetAddress());
                        BufferedReader br = new BufferedReader(new InputStreamReader(cs.getInputStream()));
                        PrintWriter pw = new PrintWriter(cs.getOutputStream(), true);
                        while (isServerRunning) {
                            String line = br.readLine();
                            System.out.println("服务端收到客户端发送的数据:"+line);
                            pw.println(line+"_server");
                            pw.flush();
                        }
                        br.close();
                        pw.close();
                        cs.close();
                        serverSocket.close();
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }
            }).start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void closeServer() {
        isServerRunning = false;
    }

    private static Socket clientSocket = null;

    private static void createClient() {
        try {
            clientSocket = new Socket("127.0.0.1", 6666);
            clientSocket.setSoTimeout(3000);
//            clientSocket.connect(new InetSocketAddress("127.0.0.1", 6666));
            new Thread(new Runnable() {

                @Override
                public void run() {
                    BufferedReader in = null;
                    try {
                        in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
                        BufferedReader userIn = new BufferedReader(new InputStreamReader(System.in));
                        while (isServerRunning) {
                            String message = userIn.readLine();
                            System.out.println("客户端收到服务端发送的数据:"+in.readLine());
                            out.println(message);
                        }
                        //一定要调用close服务端才会收到数据
                        in.close();
                        out.close();
                        userIn.close();
                        clientSocket.close();
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }
            }).start();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private static void closeClient() {
        isServerRunning = false;
    }

    private static StringBuffer sb = new StringBuffer();

    private static void sendFromClient() {
        /*if (clientSocket != null && !clientSocket.isClosed()){
            try {
                clientSocket.getOutputStream().write(sb.append("hello world").toString().getBytes());
                clientSocket.getOutputStream().flush();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }*/
    }
}
复制代码

 

posted @   呢哇哦比较  阅读(145)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示