仿照廖雪峰的java教程中http相关部分用java实现TCP/UDP服务器和客户端实现简单的通信,以后有时间会进行功能扩展
TCP
服务器
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(6666);
System.out.println("TCP.Server is running");
for (; ; ) {
Socket socket = ss.accept();
Thread t = new Handler(socket);
System.out.println(t.getName() + ": Connect from" + socket.getRemoteSocketAddress() + " as TCP.Client " + t.getId());
t.start();
}
}
}
class Handler extends Thread {
Socket socket;
public Handler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try (InputStream inputStream = socket.getInputStream()) {
try (OutputStream outputStream = socket.getOutputStream()) {
handle(inputStream, outputStream);
}
} catch (Exception e) {
try {
this.socket.close();
} catch (Exception ioe) {
}
System.out.println("client disconnected");
}
}
private void handle(InputStream inputStream, OutputStream outputStream) throws IOException {
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8));
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
writer.write("hello\n");
writer.flush();
for (; ; ) {
String s = reader.readLine();
System.out.println("[TCP.Client " + this.getId() + "]: " + s);
if (s.equals("bye")) {
writer.write("bye\n");
writer.flush();
break;
}
writer.write("ok: " + s + "\n");
writer.flush();
}
System.out.println(socket.getRemoteSocketAddress() + " disconnected");
}
}
客户端
public class Client {
static public void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 6666);
try (InputStream inputStream = socket.getInputStream()) {
try (OutputStream outputStream = socket.getOutputStream()) {
handle(socket, inputStream, outputStream);
}
}
socket.close();
System.out.println("disconnect;");
}
private static void handle(Socket socket, InputStream inputStream, OutputStream outputStream) throws IOException {
System.out.println("TCP.Client is working at " + socket.getLocalSocketAddress());
System.out.println("TCP.Client connected to " + socket.getRemoteSocketAddress());
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8));
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
Scanner scanner = new Scanner(System.in);
System.out.println("[server]: " + reader.readLine());
for (; ; ) {
System.out.print("[TCP.Client]: ");
String s = scanner.nextLine();
writer.write(s);
writer.newLine();
writer.flush();
String resp = reader.readLine();
System.out.println("[TCP.Server]: " + resp);
if (resp.equals("bye"))
break;
}
}
}
UDP
服务器
public class Server {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket(6666);
System.out.println("Server running at " + ds.getLocalSocketAddress());
for (; ; ) {
// receive
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);
System.out.println("Received " + s + " from " + packet.getSocketAddress());
// send
byte[] data = "ACK".getBytes(StandardCharsets.UTF_8);
packet.setData(data);
ds.send(packet);
}
}
}
客户端
public class Client {
public static void main(String[] args) throws IOException {
// connect
DatagramSocket ds = new DatagramSocket();
ds.setSoTimeout(1000);
ds.connect(InetAddress.getLocalHost(), 6666);
// send
byte[] data = "Hello".getBytes(StandardCharsets.UTF_8);
DatagramPacket packet = new DatagramPacket(data, data.length);
ds.send(packet);
// receive
byte[] buffer = new byte[1024];
packet = new DatagramPacket(buffer, buffer.length);
ds.receive(packet);
String resp = new String(packet.getData(), packet.getOffset(), packet.getLength(), StandardCharsets.UTF_8);
System.out.println("Received " + resp + " from " + packet.getSocketAddress());
ds.disconnect();
}
}