TCP
服务端
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(8888);
System.out.println("server is running...");
while (true) {
Socket sock = ss.accept();
new Handler(sock).start();
}
}
}
class Handler extends Thread {
private Socket sock;
private String name;
public Handler(Socket sock) {
this.sock = sock;
this.name = sock.getRemoteSocketAddress().toString();
show("connect new client");
}
@Override
public void run() {
try (InputStream input = sock.getInputStream();
OutputStream output = sock.getOutputStream()) {
this.handle(input, output);
} catch (IOException e) {
show("client disconnected");
}
try {
sock.close();
} catch (IOException e) {
show("client close IOException");
}
}
private void show(String msg) {
System.out.printf("[%s] %s\n", name, msg);
}
private void handle(InputStream input, OutputStream output) throws IOException {
show("进入handle");
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output, StandardCharsets.UTF_8));
BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
while (true) {
String s = reader.readLine();
if (s.equals("bye")) {
writer.write("bye\n");
writer.flush();
break;
}
writer.write("Echo:" + s + "\n");
writer.flush();
}
show("退出handle");
}
}
客户端
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws IOException {
System.out.println("准备连接Server");
Socket sock = new Socket("localhost", 8888);
try (InputStream input = sock.getInputStream();
OutputStream output = sock.getOutputStream()) {
handle(input, output);
}
sock.close();
System.out.println("disconnected.");
}
private static void handle(InputStream input, OutputStream output) throws IOException {
System.out.println("进入handle");
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output, StandardCharsets.UTF_8));
BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.print(">>> ");
String s = scanner.nextLine();
writer.write(s);
writer.newLine();
writer.flush();
String resp = reader.readLine();
System.out.println("<<< " + resp);
if (resp.equals("bye")) {
break;
}
}
System.out.println("退出handle");
}
}
运行结果
$ java Server
server is running...
[/127.0.0.1:61176] connect new client
[/127.0.0.1:61176] 进入handle
[/127.0.0.1:61176] 退出handle
$ java Client
准备连接Server
进入handle
>>> 消息1
<<< Echo:消息1
>>> 消息2
<<< Echo:消息2
>>> bye
<<< bye
退出handle
disconnected.
UDP
服务端
DatagramSocket ds = new DatagramSocket(6666);
for (;;) {
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
ds.receive(packet);
String s = new String(packet.getData(), packet.getOffset(), packet.getLength(), StandardCharsets.UTF_8);
byte[] data = "ACK".getBytes(StandardCharsets.UTF_8);
packet.setData(data);
ds.send(packet);
}
客户端
DatagramSocket ds = new DatagramSocket();
ds.setSoTimeout(1000);
ds.connect(InetAddress.getByName("localhost"), 6666);
byte[] data = "Hello".getBytes();
DatagramPacket packet = new DatagramPacket(data, data.length);
ds.send(packet);
byte[] buffer = new byte[1024];
packet = new DatagramPacket(buffer, buffer.length);
ds.receive(packet);
String resp = new String(packet.getData(), packet.getOffset(), packet.getLength());
ds.disconnect();