一、原理
二、代码实现
server端代码
package com.hadoop.bd.NetworkCommunication;
import com.sun.security.ntlm.Server;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
/**
* @Author He Bao Jing
* @Date 2019-03-03 10:53
*/
public class SocketServerDemo {
public static void main(String[] args) {
int port = 9999;
improveServer(port);
}
private static void improveServer(int port) {
ExecutorService threadPool = Executors.newFixedThreadPool(10);
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(port);
while (true) {
final Socket socket = serverSocket.accept();
System.out.println("server accept the client connection!");
threadPool.submit(new Runnable() {
public void run() {
try {
InputStream inputStream = socket.getInputStream();
StringBuilder sb = new StringBuilder();
int len;
byte[] bytes = new byte[2014];
while ((len = inputStream.read(bytes)) != -1) {
sb.append(new String(bytes, 0, len, "UTF-8"));
}
System.out.println(Thread.currentThread().getName() + ", Client: " + sb.toString());
OutputStream outputStream = socket.getOutputStream();
outputStream.write("I am server".getBytes("UTF-8"));
inputStream.close();
outputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static void primaryServer(int port) {
try {
ServerSocket serverSocket = new ServerSocket(port);
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
byte[] byteArray = new byte[1024];
int len;
StringBuilder sb = new StringBuilder();
// 只有客户端关闭输出流时,服务端才能获取到末尾的-1
while ((len = inputStream.read(byteArray)) != -1) {
sb.append(new String(byteArray, 0, len, "UTF-8"));
}
System.out.println("Client: " + sb.toString());
OutputStream outputStream = socket.getOutputStream();
outputStream.write("Hello, Client, I have received from you!".getBytes("UTF-8"));
inputStream.close();
outputStream.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Client端代码
package com.hadoop.bd.NetworkCommunication;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
* @Author He Bao Jing
* @Date 2019-03-03 10:53
*/
public class SocketClientDemo {
public static void main(String[] args) {
int port = 9999;
String host = "127.0.0.1";
for (int i = 0; i < 8; i++) {
try {
Socket socket = new Socket(host, port);
OutputStream outputStream = socket.getOutputStream();
String message = "I am client" + i;
outputStream.write(message.getBytes());
// 关闭输出流,后续只能接收数据;如果没有此处,服务端无法接收到-1,即服务端会阻塞
socket.shutdownOutput();
InputStream inputStream = socket.getInputStream();
byte[] byteArray = new byte[1024];
int len;
StringBuilder sb = new StringBuilder();
while ((len = inputStream.read(byteArray)) != -1) {
sb.append(new String(byteArray, 0, len, "UTF-8"));
}
System.out.println("Server: " + sb.toString());
inputStream.close();
outputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}