百木园-与人分享,
就是让自己快乐。

java学习之socket编程

0x00前言和思维导图

Socks实际上是什么:实际上是提供了精彩通信的端口,在通信之前双方都必须要创造一个端点才能通信,其实感觉socket跟计算机的三次握手有些相似,分为三个步骤:
(1)服务器监听:服务器不知道下一个客户端的具体套接字,而是处于等待连接的状态
(2)客户端请求:由客户端的套接字提出请求,连接目标是服务器的套接字。
(3)连接确认:服务器接收到客户端的套接字请求,它就响应客户端的请求,创建一个新的线程把服务器套接字的具体描述发个客户端,客户端确认以后,这个连接就建立好了,服务端继续进入监听状态。

0x01socks的编程

0x1客户端的编写

(1)首先是Socket类的构造方法public Socket(String host, int port),前面是你连接的服务端的ip,后面是连接端口。
(2)socketlei下面的成员方法

getInputStream() 
          返回此套接字的输入流
getOutputStream() 
          返回此套接字的输出流
 void bind(SocketAddress bindpoint) 
          将套接字绑定到本地地址。 
 void close() 
          关闭此套接字。 
 void connect(SocketAddress endpoint) 
          将此套接字连接到服务器。 

(3)一些方法的使用,传输数据
a.outputstream.write(\"数据\".getbytes())需要把类型转化成字节类型看一看它的源码public void write(byte b[])
b.可以利用另一个类去完成PrintWriter : 高级输出流
c.PrintWriter pw3 = new PrintWriter(socket.getOutputStream());发送给服务器或者客户端
d.Scanner scan3 = new Scanner(socket.getInputStream())网络通信里面去读取对方发给我的信息
e.用缓冲流去接受信息

InputStream is=socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
class Mysocks_test1{
    public static void main(String[] args) {
        try {
            Socket socket=new Socket(\"127.0.0.1\",9099);
            OutputStream os=socket.getOutputStream();
            PrintWriter pw=new PrintWriter(os);
            pw.write(\"客户端发送信息\");
            pw.flush();
            socket.shutdownOutput();
            InputStream is=socket.getInputStream();
            BufferedReader br=new BufferedReader(new InputStreamReader(is));//按照字符流读取,缓冲流
            String info=null;
            while ((info= br.readLine())!=null){
                System.out.println(\"我接受到的信息是\"+info);
            }
            br.close();
            is.close();
            os.close();
            pw.close();
            socket.close();

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

        }

    }
    }

0x2服务端的编写

(1)构建一个线程去接受一个客户端的请求与客户端交互
(2)InetAddress类从名字就可以看出来ip地址类,

用法:socket.getInetAddress(),获取ip地址
构造方法public InetAddress getInetAddress()返回的是一个InetAddress对象

看一下代码

点击查看代码
public class JAVA_serverSocket {
    public static void main(String[] args) {
            try {
                 ServerSocket serverSocket = new ServerSocket(8080);
                Socket socket=new Socket();
                while (true){
                    socket=serverSocket.accept();
                    ServerThread thread=new ServerThread(socket);
                    thread.start();
                    InetAddress address=socket.getInetAddress();//获取客户端的IP
                    System.out.println(\"目标客户端的ip是\"+address);

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

####0x3服务端线程
(1)构建的时候采用的是继承Thread的方法去构建的,还有两种方法(写一个类去实现接口Runnable,调用类对象)(匿名内部类)()。
(2)编写完成后一定要记得关闭所有流和socket

点击查看代码
public class ServerThread extends Thread{
    private Socket socket=null;
    public ServerThread(Socket socket){
        this.socket=socket;
    }
    @Override
    public void run() {
        InputStream is=null;
        InputStreamReader isr=null;
        BufferedReader br=null;
        OutputStream os=null;
        PrintWriter pw=null;
        try {
            is=socket.getInputStream();
            isr=new InputStreamReader(is);
            br=new BufferedReader(isr);
            String info=null;
            while ((info= br.readLine())!=null);{
                System.out.println(\"我是服务,客户机说\"+br.readLine());
            }
            socket.shutdownInput();
            os=socket.getOutputStream();
            pw=new PrintWriter(os);
            pw.write(\"服务器欢迎你\");
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try{
                if (pw != null) {
                    pw.close();
                if (os != null) {
                    os.close();
                    }                    }
                if (br != null) {
                    br.close();
                }
                if (isr != null) {
                    isr.close();
                }
                if (is != null) {
                    is.close();
                }
                if (socket != null) {
                    socket.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }


        }
        }
    }

的编写
###0x02总结
这里只写了一个专业的两个客户端,其实还有很多改进的地方可以通过代理词去进行会话管理,还没有进行一下手动的输入信息,和发送过去的数据可以当做cmd的指令来执行,这个东西可能给以后的shell获取有关
学习一点免杀和shell设计之后再来继续深入
其他要用于payload的发送,还有就是写一些内网探测的脚本,但是这些在python上面已经写好了大部分的工具了,以后可能做系统的软件开发的话可能会用到
socket就先告别一个段落把


来源:https://www.cnblogs.com/0x3e-time/p/16176866.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » java学习之socket编程

相关推荐

  • 暂无文章