Socket可以实现不同主机之间的通信,而且现在的网络环境中非常常见。
简单来讲Socket就是对TCP/IP的封装,然后提供API,让编程人员不用管底层的网络协议如何运作。
下面的代码实现了简单的两个程序之间的Socket通信
- 服务端
SocketServer
(被动等待接收消息并回复消息的一端):
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* Socket服务端
**/
public class SocketServer {
public static void main(String[] args) {
doServer();
}
/**
* 建立服务端并监听客户端的输入
*/
private static void doServer() {
try {
// 建立监听端口为2023的服务端Socket服务
ServerSocket ss = new ServerSocket(2023);
System.out.println("服务端Socket服务已建立,等待客户端连接...");
// 通过ss.accept()开始持续监听2023端口,当有连接时获取收到的包装成Socket的客户端对象
Socket s = ss.accept();
// 获取客户端的IP地址和端口号
String ip = s.getInetAddress().getHostAddress();
int port = s.getPort();
System.out.println("服务端与 " + ip + ":" + port + " 已建立连接");
// 接收客户端的通信消息(用输入流接收客户端的输出流)
InputStream ins = s.getInputStream();
byte[] bytes = new byte[1024];
int len = ins.read(bytes);
// 将二进制转成字符串
String msg = new String(bytes, 0, len);
System.out.println("客户端消息:" + msg);
// 用输出流返回消息
OutputStream os = s.getOutputStream();
os.write("Hello!".getBytes());
// 释放资源
s.close();
ss.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
- 客户端
SocketClient
(主动发出消息并接收回复消息的一端):
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
* Socket客户端
**/
public class SocketClient {
public static void main(String[] args) {
doClient();
}
/**
* 与服务端通信
*/
private static void doClient(){
try {
// 与ip为127.0.0.1、端口为2023的服务端建立连接
Socket s = new Socket("127.0.0.1", 2023);
// 创建通信输出流
OutputStream os = s.getOutputStream();
// 向输出流中写入二进制字节流以传输消息
os.write("Hello Socket!".getBytes());
// 用输入流获取服务端的回复消息
InputStream ins = s.getInputStream();
byte[] bytes = new byte[1024];
int len = ins.read(bytes);
String msg = new String(bytes, 0, len);
System.out.println("服务端的返回:" + msg);
// 释放资源
s.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
先运行服务端,再运行客户端,运行结果如下
- 服务端:
- 客户端: