Socket之Java实现普通版本

0-0、精彩,null强制转换,仍为null

Socket s = new Socket((SocketImpl) null);

0、一个进程占据一个端口,同一台计算机下

a、Socket Server端占用一个端口 (Server端绑定一个)

b、Socket Client端也占用一个端口(随机找一个操作系统限制的端口)

 

1、Server端代码

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class IOServer {
    public static void main(String[] args) throws Exception {

        ServerSocket serverSocket = new ServerSocket(8000); //先创建一个ServerSocket对象

        // (1) 接收新连接线程
        new Thread(() -> {
            while (true) {
                try {
                    // (1) 阻塞方法获取新的连接,这个牛逼,多线程知识真是太重要了
                    Socket socket = serverSocket.accept(); //线程处于的状态感觉是WAITING状态,不应该是BLOCKED状态吧
                    System.out.println("开始接客了");
                    // (2) 每一个新的Socket连接都会创建一个线程,负责读取数据,卧槽连接多了,得让操作系统创建多少个线程……
                    new Thread(() -> {
                        try {
                            byte[] data = new byte[1024]; //1Kb、1kb的读
                            InputStream inputStream = socket.getInputStream(); //获取到客户端的Socket对象,然后获取输入字节流
                            while (true) {
                                int len;
                                // (3) 按字节流方式读取数据
                                while ((len = inputStream.read(data)) != -1) {
                                    System.out.println(new String(data, 0, len));
                                }
                            }
                        } catch (IOException e) {
                        }
                    }).start();

                } catch (IOException e) {
                }

            }
        }).start();
    }
}

2、Client端代码

import java.io.IOException;
import java.net.Socket;
import java.util.Date;

public class IOClient {

    public static void main(String[] args) {
        new Thread(() -> {
            try {
                Socket socket = new Socket("127.0.0.1", 8000); //传入目标ip与目标端口
                while (true) {
                    try {
                        socket.getOutputStream().write((new Date() + ": hello world").getBytes());
                        socket.getOutputStream().flush();
                        System.out.println("localPort:" + socket.getLocalPort()); //Socket Client使用的端口,每次会随机占用一个
                        System.out.println("target port:" + socket.getPort());    //Socket Server使用的端口
                        Thread.sleep(2000);
                    } catch (Exception e) {
                    }
                }
            } catch (IOException e) {
            }
        }).start();
    }
}

 

你可能感兴趣的:(Java,综合)