介绍
所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面。一个Socket由一个IP地址和一个端口号唯一确定。
应用场景
Socket通常用来实现客户方和服务方的连接,比如聊天通信功能。
Socket通信案例
步骤分析
服务端
1、创建ServerSocket和Socket
2、打开连接到的Socket的输入/输出流
3、按照协议对Socket进行读/写操作
4、关闭输入输出流,以及Socket
客户端
1、创建Socket对象,指明需要链接的服务器的地址和端号
2、链接建立后,通过输出流向服务器发送请求信息
3、通过输出流获取服务器响应的信息
4、关闭相关资源
代码简单实现案例
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 只接受服务器
*
* @author zengLingYao
* @date 2021/12/09
*/
public class OnlyAcceptServer {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
InputStream inputStream = null;
try {
serverSocket = new ServerSocket(8008);
System.out.println("服务端启动成功,等待客户端连接......");
//调用accept阻塞,等待客户端连接
socket = serverSocket.accept();
System.out.println(socket.getRemoteSocketAddress()+"客户机已上线");
inputStream = socket.getInputStream();
byte[] buffer = new byte[1024];
int len = 0;
//读取客户端的数据,read()阻塞
while ((len = inputStream.read(buffer)) > 0) {
String magess = new String(buffer, 0, len);
System.out.println(magess);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
System.out.println("客户端关闭,服务即将关闭");
inputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
/**
* 只发送客户端
*
* @author zengLingYao
* @date 2021/12/09
*/
public class OnlySendClient {
public static void main(String[] args) {
//创建一个流套接字并将其连接到指定主机上的指定端口号。
Socket socket = null;
OutputStream outputStream = null;
try {
socket = new Socket("127.0.0.1", 8008);
//返回此套接字的输出流。
outputStream = socket.getOutputStream();
System.out.println("连接成功,请输入发送内容:");
while(socket != null){
//控制台中读取信息
String nextLine = new Scanner(System.in).nextLine();
if ("exit".equals(nextLine)){
outputStream.close();
socket.close();
break;
}
byte[] magess = nextLine.getBytes();
outputStream.write(magess);
//刷新缓冲区
outputStream.flush();
System.out.println("发送成功");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}