socket笔记



import java.io.*;
import java.net.*;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {

    public static       String SERVER_HOST         = "";
    public static       String CLIENT_HOST         = "";
    public static final int    SERVER_RECEIVE_PORT = 9344;
    public static final int    CLIENT_RECEIVE_PORT = 9345;

    public static ServerSocket serverSocket;
    public static Socket       receiveSocket;

    public static Socket sendSocket;

    public static Scanner scanner   = new Scanner(System.in);
    public static boolean isQuitApp = false;
    public static String  role      = "";

    static class ReceiveThread extends Thread {

        public ReceiveThread() {
            super("RECEIVE_THREAD");
        }

        @Override
        public void run() {
            super.run();
            try {
                receiveSocket = serverSocket.accept();
                if ("1".equals(role)) {
                    InetSocketAddress isa = (InetSocketAddress) receiveSocket.getRemoteSocketAddress();
                    CLIENT_HOST = isa.getAddress().getHostAddress();
                    System.out.println("收到来自IP: " + CLIENT_HOST + " 的连接!");
                } else if ("2".equals(role)) {
                    System.out.println("收到连接!");
                }
                System.out.println("建立连接成功!");
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }

            InputStream is = null;
            try {
                is = receiveSocket.getInputStream();
                byte[] buffer = new byte[65535];
                while (true) {
                    int count = is.read(buffer);
                    String line = new String(buffer, 0, count);
                    if ("exit".equals(line)) {
                        break;
                    }
                    System.out.println("对方:" + line);
                }
            } catch (IOException ioe) {
                ioe.printStackTrace();
            } finally {
                closeQuietly(is);
                closeQuietly(receiveSocket);
            }
        }
    }

    static class SendThread extends Thread {

        private SendThread() {
            super("SEND_THREAD");
        }

        @Override
        public void run() {
            super.run();
            try {
                if ("1".equals(role)) {
                    while (CLIENT_HOST.length() == 0) {
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException ie) {
                            ie.printStackTrace();
                        }
                    }
                    sendSocket = new Socket(CLIENT_HOST, CLIENT_RECEIVE_PORT);
                } else if ("2".equals(role)) {
                    if (SERVER_HOST.length() == 0) {
                        throw new RuntimeException("SERVER_HOST is empty");
                    }
                    sendSocket = new Socket(SERVER_HOST, SERVER_RECEIVE_PORT);
                }
            } catch (UnknownHostException uhe) {
                uhe.printStackTrace();
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }

            OutputStream os = null;
            Writer writer = null;
            BufferedWriter bw = null;
            try {
                os = sendSocket.getOutputStream();
                writer = new OutputStreamWriter(os);
                bw = new BufferedWriter(writer);
                while (scanner.hasNext()) {
                    String line = scanner.nextLine();
                    bw.write(line);
                    bw.flush();
                    if ("exit".equals(line.trim())) {
                        break;
                    }
                    if ("quitApp".equals(line.trim())) {
                        isQuitApp = true;
                        break;
                    }
                }
            } catch (IOException ioe) {
                ioe.printStackTrace();
            } finally {
                closeQuietly(os);
                closeQuietly(writer);
                closeQuietly(bw);
                closeQuietly(sendSocket);
            }
        }
    }

    public static void main(String[] args) {
        try {
            printScreen();
            try {
                while (scanner.hasNext()) {
                    String line = scanner.nextLine();
                    if ("1".equals(line.trim())) {
                        role = "1";
                        serverSocket = new ServerSocket(SERVER_RECEIVE_PORT);
                        System.out.println("已成为服务端!");
                        break;
                    } else if ("2".equals(line.trim())) {
                        role = "2";
                        serverSocket = new ServerSocket(CLIENT_RECEIVE_PORT);
                        System.out.println("已成为客户端!");
                        System.out.println("请输入服务端ip地址:");
                        while (scanner.hasNext()) {
                            String serverIp = scanner.nextLine().trim();
                            if (isIpv4(serverIp)) {
                                SERVER_HOST = serverIp;
                                break;
                            } else {
                                System.out.println("ip格式错误");
                                System.out.println("请输入服务端ip地址:");
                            }
                        }
                        break;
                    } else {
                        System.out.println("输入不合法!");
                        printScreen();
                    }
                }
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
            if (serverSocket != null) {
                new ReceiveThread().start();
                new SendThread().start();
            }
            while (!isQuitApp) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException ie) {
                    ie.printStackTrace();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeQuietly(serverSocket);
            closeQuietly(receiveSocket);
            closeQuietly(sendSocket);
        }
    }

    private static void printScreen() {
        System.out.println("请输入(您的IP为: " + getIp() + " ):");
        System.out.println("    1 --> 成为服务端");
        System.out.println("    2 --> 成为客户端");
    }

    private static String getIp() {
        try {
            InetAddress ia = InetAddress.getLocalHost();
            return ia.getHostAddress();
        } catch (UnknownHostException uhe) {
            uhe.printStackTrace();
            return "";
        }
    }

    public static void closeQuietly(Closeable closeable) {
        try {
            if (closeable != null) {
                closeable.close();
            }
        } catch (IOException var2) {
            ;
        }
    }

    public static void closeQuietly(ServerSocket sock) {
        if (sock != null && !sock.isClosed()) {
            try {
                sock.close();
            } catch (IOException var2) {
                ;
            }
        }
    }

    public static boolean isIpv4(String ipAddress) {
        String ip = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\."
                    + "(00?\\d|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
                    + "(00?\\d|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
                    + "(00?\\d|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$";
        Pattern pattern = Pattern.compile(ip);
        Matcher matcher = pattern.matcher(ipAddress);
        return matcher.matches();
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值