1:Sender.java
package com.capinfotech.network;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class Sender {
private String host = "localhost";
private int port = 8000;
private Socket socket;
private static int stopWay = 1; //结束通信的方式
private final int NATURAL_STOP = 1; //自然结束
private final int SUDDEN_STOP = 2; //突然终止程序
private final int SOCKET_STOP = 3; //关闭Socket,再结束程序
private final int OUTPUT_STOP = 4; //关闭输出流,再结束程序
public Sender() throws UnknownHostException, IOException {
socket = new Socket(host, port);
}
private PrintWriter getWriter(Socket socket) throws IOException {
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os, true);
return pw;
}
public void send() throws IOException, InterruptedException {
PrintWriter pw = getWriter(socket);
for(int i = 0; i < 20; i++) {
String msg = "hello_" + i;
pw.println(msg);
System.out.println("send:" + msg);
Thread.sleep(500);
if(i == 2) {
if(stopWay == SUDDEN_STOP) {
System.out.println("突然中止程序");
System.exit(0);
} else if(stopWay == SOCKET_STOP) {
System.out.println("关闭socket,并终止程序");
socket.close();
break;
} else if(stopWay == OUTPUT_STOP) {
socket.shutdownOutput();
System.out.println("关闭输出流并终止程序");
break;
}
}
}
if(stopWay == NATURAL_STOP) {
socket.close();
}
}
public static void main(String[] args) throws UnknownHostException, IOException, InterruptedException {
if(args.length > 0) {
stopWay = Integer.parseInt(args[0]);
}
new Sender().send();
}
}
Sender表示发送数据的客户程序,每隔500毫秒发送一行字符串,共发送20行字符串
2:Receiver.java
package com.capinfotech.network;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Receiver {
private int port = 8000;
private ServerSocket serverSocket;
private static int stopWay = 1; //结束通信的方式
private final int NATURAL_STOP = 1; //自然结束
private final int SUDDEN_STOP = 2; //突然终止程序
private final int SOCKET_STOP = 3; //关闭Socket,再结束程序
private final int INPUT_STOP = 4; //关闭输出流,再结束程序
private final int SERVERSOCKET_STOP = 5; //关闭ServerSocket,再结束程序
public Receiver() throws IOException {
serverSocket = new ServerSocket(port);
}
private BufferedReader getReader(Socket socket) throws IOException {
InputStream is = socket.getInputStream();
return new BufferedReader(new InputStreamReader(is));
}
public void receive() throws IOException, InterruptedException {
Socket socket = null;
socket = serverSocket.accept();
BufferedReader br = getReader(socket);
for(int i = 0; i < 20; i++) {
String msg = null;
msg = br.readLine();
System.out.println("receive:" + msg);
Thread.sleep(1000);
if(i == 2) { //终止程序,结束通信
if(stopWay == SUDDEN_STOP) {
System.out.println("突然中止程序");
System.exit(0);
} else if(stopWay == SOCKET_STOP) {
System.out.println("关闭Socket并终止程序");
socket.close();
break;
} else if(stopWay == INPUT_STOP) {
System.out.println("关闭输入流并终止程序");
socket.shutdownInput();
break;
} else if(stopWay == SERVERSOCKET_STOP) {
System.out.println("关闭ServerSocket并终止程序");
serverSocket.close();
break;
}
}
}
if(stopWay == NATURAL_STOP) {
socket.close();
serverSocket.close();
}
}
public static void main(String[] args) throws IOException, InterruptedException {
if(args.length > 0) stopWay = Integer.parseInt(args[0]);
new Receiver().receive();
}
}
Receiver类表示接收数据的服务器程序,它每隔1秒钟接收一行字符串,共接收20行字符串
3:测试的方法
*自然结束Server和Receiver的通信
先运行java Receiver, 后运行java Sender
*提前终止Receiver
先运行java Receiver 2 或 java Receiver 3 或java Receiver 4 或java Receiver 5, 然后再运行java Sender,会发现Receiver接收了3个字符后结束运行,但是Sender依然在发送数据。
*突然终止Sender
先运行java Receiver,再运行java Sender 2, Sender在发送了3行字符串之后,在没有关闭socket的情况下,就结束了运行,Receiver在第四次执行BufferedReader的readLine()方法时会抛出异常
*关闭或者半关闭Sender的Socket
先运行java Receiver, 再运行java Sender3,或者java Sender 4,Sender在发送了3行字符串之后,会关闭socket执行(java
Sender 3),或者关闭Socket的输出(java Sender 4),然后结束运行,Receiver在第四次执行BufferedReader的readLine()方法时读到输入流的末尾,因此,readLine()方法返回null