客户端
import java.io.*;
import java.net.Inet4Address;
import java.net.InetSocketAddress;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket();
// 客户端读从服务端回复的消息的超时时间
socket.setSoTimeout(3000);
// 和服务器取得连接,服务端IP:localhost,服务端端口:2000,建立连接的超时时间3000ms
socket.connect(new InetSocketAddress(Inet4Address.getLocalHost(), 2000), 3000);
System.out.println("已发起服务器连接,并进入后续流程~");
System.out.println("客户端信息:" + socket.getLocalAddress() + " P:" + socket.getLocalPort());
System.out.println("服务器信息:" + socket.getInetAddress() + " P:" + socket.getPort());
try {
// 发送接收数据
todo(socket);
} catch (Exception e) {
System.out.println("异常关闭");
}
// 释放资源
socket.close();
System.out.println("客户端已退出~");
}
private static void todo(Socket client) throws IOException {
// 构建键盘输入流
InputStream in = System.in;
BufferedReader keyboardBufferedReader = new BufferedReader(new InputStreamReader(in));
// 得到Socket输出流,并转换为打印流
OutputStream outputStream = client.getOutputStream();
PrintStream socketPrintStream = new PrintStream(outputStream);
// 得到Socket输入流,并转换为BufferedReader
InputStream inputStream = client.getInputStream();
BufferedReader socketBufferedReader = new BufferedReader(new InputStreamReader(inputStream));
boolean flag = true;
do {
// 键盘读取一行
String str = keyboardBufferedReader.readLine();
// 发送到服务器
socketPrintStream.println(str);
// 从服务器读取一行
String echo = socketBufferedReader.readLine();
if ("bye".equalsIgnoreCase(echo)) {
flag = false;
}else {
System.out.println(echo);
}
}while (flag);
// 资源释放
socketPrintStream.close();
socketBufferedReader.close();
}
}
服务端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
// 服务端监听在 2000 端口
ServerSocket serverSocket = new ServerSocket(2000);
System.out.println("服务器准备就绪~");
System.out.println("服务器信息:" + serverSocket.getInetAddress() + " P:" + serverSocket.getLocalPort());
/**
* 等待客户端连接:
* 如果有一个客户端连接进来,就起一个线程处理之;
*/
for (; ; ) {
// 有一个客户端进来
Socket socket = serverSocket.accept();
// 用一个新线程处理
ClientHandler clientHandler = new ClientHandler(socket);
// 启动线程
clientHandler.start();
}
}
/**
* 客户端处理器
* 这是一个线程,当 serverSocket accept 了一个客户端 socket,会
* 另开一个线程处理这个 socket;
*/
private static class ClientHandler extends Thread {
/**
* 该线程要处理的客户端连接
*/
private Socket socket;
private boolean flag = true;
ClientHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
super.run();
System.out.println("新客户端连接:"
+ socket.getInetAddress()
+ " P:" + socket.getPort());
try {
// 用于读取客户端发来的消息
BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 用于给客户端回复消息
PrintStream output = new PrintStream(socket.getOutputStream());
do {
// 读取客户端发来的一条消息
String str = input.readLine();
if ("bye".equalsIgnoreCase(str)) {
flag = false;
// 回送
output.println("bye");
} else {
// 打印到屏幕
System.out.println(str);
// 并回送数据长度
output.println("回送:" + str.length());
}
} while (flag);
// 关闭这个客户端连接的输入输出流
input.close();
output.close();
} catch (Exception e) {
System.out.println("连接异常断开");
} finally {
try {
// 关闭这个客户端连接,但服务端仍在运行,等待新的客户端连接
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("客户端已退出:"
+ socket.getInetAddress()
+ " P:" + socket.getPort());
}
}
}