转自:轻样知生 - JAVA网络通信之基础篇 - Tylili
一、Socket套接字
作为JAVA网络通信的基础,Socket帮助进程实现进程间的建立连接并相互通信。而Socket又分为客户端和服务端,也就是Socket和SocketServer。在JAVA开发过程中,采用Socket套接字开发是较为简便的。
1、SocketServer服务端
服务端的开发首先需要绑定服务器的端口,然后通过accept()方法接收到一个来自客户端的Socket对象。服务端获取到Socket对象之后,便开始通过Socket与客户端建立连接并开始通信。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServer {
private ServerSocket socketSvr;
public SocketServer(int port) {
try {
socketSvr = new ServerSocket(port);
} catch (IOException e) {
e.printStackTrace();
}
}
public void accept() {
try {
while (true) {
Socket socket = socketSvr.accept();
InputStream inputStream = socket.getInputStream(); // 获取输入流
// 将消息读入缓冲
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
System.out.println("from CLIENT : " + reader.readLine()); // 获取消息
socket.shutdownInput(); // 关闭输入流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bw.write("SESSION ENDING..."); // 写入消息
bw.flush(); // 刷新缓冲,消息发出
socket.shutdownOutput(); // 关闭输出流
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
SocketServer server = new SocketServer(8088);
server.accept();
}
}
2、Socket客户端
服务端的开发需要注册服务端的IP地址和端口,然后才能通过Socket与服务端建立连接并开始通信。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
public class SocketClient {
private Socket socket;
public SocketClient(String host, int port) {
try {
socket = new Socket(host, port);
} catch (IOException e) {
e.printStackTrace();
}
}
public void send(String msg) {
try {
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
byte[] bytes = msg.getBytes("UTF-8");
outputStream.write(bytes); // 写入消息
outputStream.flush(); // 刷新缓冲,消息发出
socket.shutdownOutput();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
System.out.println("from SERVER : " + reader.readLine());
socket.isInputShutdown();
} catch (IOException e) {
e.printStackTrace();
}
}
public void close() {
try {
if (socket != null && !socket.isClosed()) {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
for (int i = 1; i <= 100; i ) {
final int index = i;
new Thread(new Runnable() {
@Override
public void run() {
SocketClient cli = new SocketClient("127.0.0.1", 8088);
cli.send("Hello world, No." + String.format("%04d", index));
cli.close();
}
}).start();
}
}
}