Socket 被称为套接字,是Java 中的 网络编程API,可以通过TCP 协议 和 UDP协议在客户端和服务端中进行网络通信,
其本质是基于TCP和UDP协议之上封装的一个JAVA网络编程接口。
Socket分为客户端和服务端,通信方式为
1. 在服务端创建ServerSocket对象 ServerSocket ss = new ServerSocket(8080); //8080为指定监听端口,不能被占用
2.服务端监听请求并阻塞 Socket socket = ss.accept(); //调用accept方法后,线程会阻塞,直到客户端连接成功才会释放
3.客户端连接服务端 Socket socket = new Socket("127.0.0.1",8080); //指定连接服务端地址和服务端监听端口
4.连接成功后,服务端接收到客户端连接,双方通过IO流进行通信
---------------------------------------以下演示客户端向服务端发送信息----------------------------------------
服务端:ObjectInputStream client = new ObjectInputStream(socket.getInputStream()); //获取输入流,此时线程会阻塞,直到客户端获取输出流通道
客户端:ObjectOutputStream server = new ObjectOutputStream(socket.getOutputStream()); //获取输出流,此时服务端阻塞线程释放
服务端:Object obj = ois.readObject(); //调用read方法后,线程会再次阻塞,直到客户端调用write方法发送信息
客户端:client .writeObject("hello server im client"); //调用write方法后,服务端read方法收到信息,会释放
服务端:System.out.print(obj.toString()); //服务端输出 hello server im client
总结:服务端socket在调用accept监听客户端连接时会阻塞,收到连接后会释放,若要监听多个客户端请求,可以在循环中进行监听,并创建不同线程处理请求
while(true){
Socket socket = ss.accept()
//创建线程处理不同客户端请求,可以使用线程
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(new Thread(){//定义处理方式});}
通过socket对象获取输出流传输信息,获取输入流读取信息,注意:不要在客户端和服务端同时先获取输入流,因为获取输入流会造成线程阻塞,若两边同时阻塞,则整个连接会被阻塞。
调用read方法时,会读取传输信息,若没有信息传输,会阻塞线程。
注意:若多次调用read方法,每次都会阻塞,若调用时输入流通道中没有新信息,线程会持续阻塞,直到另一端传输信息。
以上为个人学习socket时的一些心得,用作学习记录,如有理解不对之处,欢迎指正