进程之间的通信:
网络通信:
模拟服务器和客户端的工作方式。
创建客户端
import javax.print.DocFlavor;
import java.io.*;
import java.net.Socket;
public class EchoClient {
private String host = "localhost";
private int port = 8000;
private Socket socket;
/**
* 构造方法
*
* @throws IOException
*/
public EchoClient() throws IOException {
socket = new Socket(host, port);
}
/**
* 获取输出流
*
* @param socket
* @return
* @throws IOException
*/
private PrintWriter getWrite(Socket socket) throws IOException {
OutputStream outputStream = socket.getOutputStream();
return new PrintWriter(outputStream, true);
}
/**
* 获取输入流
*
* @param socket
* @return
* @throws IOException
*/
private BufferedReader getReader(Socket socket) throws IOException {
InputStream inputStream = socket.getInputStream();
return new BufferedReader(new InputStreamReader(inputStream));
}
/**
* 主要方法,发送信息到客户端
*
* @throws IOException
*/
public void talk() throws IOException {
try {
BufferedReader bufferedReader = getReader(socket);
PrintWriter printWriter = getWrite(socket);
//获取本地输入,缓存到buffer中
BufferedReader localReader = new BufferedReader(new InputStreamReader(System.in));
String msg = null;
while ((msg = localReader.readLine()) != null) {
printWriter.println(msg);
System.out.println(bufferedReader.readLine());
if (msg.equals("bey")) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//无论如何都要执行的,关闭socket
try {
if (socket != null) {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException {
new EchoClient().talk();
}
}
创建服务端
import com.sun.media.sound.SoftJitterCorrector;
import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;
import sun.awt.windows.WBufferStrategy;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.Buffer;
import java.security.spec.RSAOtherPrimeInfo;
public class EchoServer {
private int port = 8000;
private ServerSocket serverSocket;
/**
* 构造方法,用来初始化服务器
*/
public EchoServer() throws IOException {
serverSocket = new ServerSocket(port);
System.out.println("服务器启动成功!!!!");
}
/**
* 输出信息,下文要使用
* @param msg
* @return
*/
public String echo(String msg) {
return "echo:" + msg;
}
/**
* 获取输出流
* @param socket
* @return
* @throws IOException
*/
private PrintWriter getWriter(Socket socket) throws IOException {
OutputStream outputStream = socket.getOutputStream();
return new PrintWriter(outputStream, true);
}
/**
* 获取输入流
* @param socket
* @return
* @throws IOException
*/
private BufferedReader getReader(Socket socket) throws IOException {
InputStream inputStream = socket.getInputStream();
return new BufferedReader(new InputStreamReader(inputStream));
}
/**
* 主要方法,用来创建服务
*/
public void service() {
while (true) {
Socket socket = null;
try {
socket = serverSocket.accept();
System.out.println("新的连接:" + socket.getInetAddress() + ":" + socket.getPort());
BufferedReader bufferedReader = getReader(socket);
PrintWriter printWriter = getWriter(socket);
//接受客户端信息并输出信息,如果信息为bey,则不输出并结束循环
String msg = null;
while ((msg = bufferedReader.readLine()) != null) {
System.out.println(msg);
printWriter.println(echo(msg));
if (msg.equals("bey")) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//无论如何都要执行的,关闭socket
try {
if (socket != null) {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws IOException {
new EchoServer().service();
}
}
通信原理: 在两个机器之间建立一个流,通过写入和读取数据到流来实现通信。
源码中关键类:
- ServerSocket类。ServerSocket对象的构造方法负责将当前进程注册为服务器进程,accept监听端口,等待客户端请求。
- Socket类,流的操作,提供了两个方法,getInputStream()和getOutStream(),分别用于获取输入流和输出流。程序只需冲输入流读取数据就能实现接受数据,向输出流写数据就能发送数据。(这个流好像是单方向的,由客户端流向客户端)
-end-