Socket通信过程——一对一TCP程序、多对一TCP程序、端口扫描程序

一对一的TCP程序

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

/**
 * @ClassName MyServer01
 * @Description 服务器端
 * @Author lzq
 * @Date 2018/12/11 20:45
 * @Version 1.0
 **/
public class MyServer01 {
    public static void main(String[] args) {
        start();
    }

    private static void start() {
        ServerSocket serverSocket = null;    //声明ServerSocket对象
        Socket socket = null;                //声明Socket对象
        InputStream in = null;
        OutputStream out = null;
        try {
            serverSocket = new ServerSocket(8000);   //实例化ServerSocket对象
            System.out.println("等待客户端连接......");
            socket = serverSocket.accept();//实例化Socket对象,阻塞等待连接
            System.out.println("客户端连接上!!1");
            System.out.println("客户端来自:"+socket.getInetAddress().getHostAddress());//获取客户端Ip
            in = new DataInputStream(socket.getInputStream());
            out = new DataOutputStream(socket.getOutputStream());
            String strMassage = null;
            Scanner scanner = new Scanner(System.in);
            boolean flag = true;   //标记
            while(flag) {
                strMassage = ((DataInputStream) in).readUTF();   //读取客户端发送信息
                if(!strMassage.equals("bye")) {  //若信息为bye则退出
                    System.out.println("客户端消息:"+strMassage); //输出客户端内容
                    System.out.println("回复客户端:");
                    strMassage = scanner.next();  //回复客户端
                    ((DataOutputStream) out).writeUTF(strMassage); //向客户端发送消息
                    out.flush();
                }else {
                    ((DataOutputStream) out).writeUTF("bye"); //给人家也发送bye,让它退出
                    flag = false;
                }
            }
            in.close();
            out.close();
            serverSocket.close();
            socket.close();
            System.out.println("服务器退出!!");
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

}
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

/**
 * @ClassName Client01
 * @Description 客户端
 * @Author lzq
 * @Date 2018/12/11 20:46
 * @Version 1.0
 **/
public class Client01 {
    public static void main(String[] args) {
        start();
    }

    private static void start() {
        Socket socket = null;                //声明Socket对象
        InputStream in = null;
        OutputStream out = null;
        try {
            System.out.println("尝试连接服务器......");
            socket = new Socket("127.0.0.1",8000);
            System.out.println("服务器连接成功!!!");
            in = new DataInputStream(socket.getInputStream());
            out = new DataOutputStream(socket.getOutputStream());
            String strMassage = null;
            Scanner scanner = new Scanner(System.in);
            boolean flag = true;
            while(flag) {
                System.out.println("发送消息:");
                strMassage = scanner.next();
                ((DataOutputStream) out).writeUTF(strMassage);  //向服务器发送消息
                out.flush();
                strMassage = ((DataInputStream) in).readUTF();//读取服务器消息
                if(!strMassage.equals("bye")) {
                    System.out.println("接收消息:"+strMassage);
                }else {
                    ((DataOutputStream) out).writeUTF("bye"); //给人家也发送bye,让它退出
                    flag = false;
                }
            }
            in.close();
            out.close();
            socket.close();
            System.out.println("客户端退出!");
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

}

多对一的TCP程序

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import java.util.Scanner;

/**
 * @ClassName ServerThread
 * @Description 多线程服务器端
 * @Author lzq
 * @Date 2018/12/12 10:38
 * @Version 1.0
 **/
public class ServerThread implements Runnable{
    private Socket socket;    //定义Socket属性
    public  ServerThread(Socket socket) {
        this.socket = socket;
    }

    public void run() {
        DataInputStream in = null;
        DataOutputStream out = null;
        try {
            System.out.println("客户端连接上......\n客户端来自"+socket.getInetAddress().getHostAddress());
            in = new DataInputStream(socket.getInputStream());
            out = new DataOutputStream(socket.getOutputStream());
            String strMassage = null;
            Scanner scanner = new Scanner(System.in);
            boolean flag = true;
            while(flag) {
                strMassage = in.readUTF();
                if(!strMassage.equals("bye")) {
                    System.out.println("客户端消息:\n"+strMassage);
                    System.out.println("回复客户端:");
                    strMassage = scanner.next();
                    out.writeUTF(strMassage);
                    out.flush();
                }else {
                    out.writeUTF("bye");
                    flag = false;
                }
            }
            in.close();
            out.close();
            socket.close();
            System.out.println("服务器退出!");
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @ClassName ServerDemo
 * @Description 这个类来使用ServerThread类
 * @Author lzq
 * @Date 2018/12/12 10:48
 * @Version 1.0
 **/
public class ServerDemo {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        Socket socket = null;
        try {
            serverSocket = new ServerSocket(8000);
            System.out.println("等待客户端连接......");
            while(true) {
                socket = serverSocket.accept();
                new Thread(new ServerThread(socket)).start(); //实例化并启动线程
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}

客户端代码不变,就是上面一对一通信是使用的客户端代码

端口扫描程序

import java.net.Socket;
import java.util.Scanner;

/**
 * @ClassName NetTest1
 * @Description 扫描端口范围
 * @Author lzq
 * @Date 2018/12/12 11:13
 * @Version 1.0
 **/
public class NetTest1 {
    public static void main(String[] args) throws Exception {
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入IP地址:");
        String ip = scanner.next();
        System.out.println("输入其实端口号:");
        int start = scanner.nextInt();
        System.out.println("输入终止端口号:");
        int end = scanner.nextInt();
        Socket socket = null;
        int port = start;
        System.out.println("扫描中......");
        while(port <= end) {
            try {
                socket = new Socket(ip,port);
                System.out.println("活动端口:"+port);
            }catch (Exception e) {
                System.out.println(port+"端口关闭");
            }
            if(socket != null) {
                socket.close();
            }
            port++;
        }
        System.out.println("扫描结束!");
    }
}
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @ClassName TestDemo7
 * @Description 扫描测试类
 * @Author lzq
 * @Date 2018/12/12 11:22
 * @Version 1.0
 **/
public class TestDemo7 {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        Socket socket = null;
        try {
            serverSocket = new ServerSocket(50);
            socket = serverSocket.accept();
            socket.close();
            serverSocket.close();
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}
输入IP地址:
127.0.0.1
输入其实端口号:
48
输入终止端口号:
52
扫描中......
48端口关闭
49端口关闭
活动端口:50
51端口关闭
52端口关闭
扫描结束!

猜你喜欢

转载自blog.csdn.net/QQ2899349953/article/details/84962280