客户端
import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
public class Client {
private Socket socket;
public Client(){
try {
System.out.println("连接服务端");
socket = new Socket("localhost",8088);
System.out.println("已连接服务端");
} catch (IOException e) {
e.printStackTrace();
}
}
public void start(){
try {
ServerHandler sh = new ServerHandler();
Thread thread = new Thread(sh);
thread.setDaemon(true);
thread.start();
OutputStream ops = socket.getOutputStream();
OutputStreamWriter opsw = new OutputStreamWriter(ops, StandardCharsets.UTF_8);
BufferedWriter bw = new BufferedWriter(opsw);
PrintWriter pw = new PrintWriter(bw,true);
Scanner scanner = new Scanner(System.in);
while (true){
String str;
str = scanner.nextLine();
if ("exit".equals(str)) {
break;
}
pw.println(str);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
socket.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
public static void main(String[] args) {
Client client = new Client();
client.start();
}
private class ServerHandler implements Runnable{
@Override
public void run() {
try {
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
BufferedReader br = new BufferedReader(isr);
String message;
while ((message = br.readLine()) != null){
System.out.println(message);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
服务端
多线程
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
public class Server {
private ServerSocket serverSocket;
private List<PrintWriter> allout = new ArrayList<>();
public Server() {
try {
System.out.println("启动服务端");
serverSocket = new ServerSocket(8088);
System.out.println("服务端启动成功");
} catch (IOException e) {
e.printStackTrace();
}
}
public void start() {
try {
while (true) {
System.out.println("等待客户端连接");
Socket socket = serverSocket.accept();
String host = socket.getInetAddress().getHostAddress();
System.out.println("客户端" + host + "连接成功");
ClientHanlder ch = new ClientHanlder(socket);
Thread thread = new Thread(ch);
thread.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Server server = new Server();
server.start();
}
private class ClientHanlder implements Runnable {
private Socket socket;
private String host;
public ClientHanlder(Socket socket) {
this.socket = socket;
host = socket.getInetAddress().getHostAddress();
}
@Override
public void run() {
PrintWriter pw = null;
try {
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
BufferedReader br = new BufferedReader(isr);
OutputStream ops = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(ops, StandardCharsets.UTF_8);
BufferedWriter bw = new BufferedWriter(osw);
pw = new PrintWriter(bw, true);
synchronized (allout) {
allout.add(pw);
}
System.out.println(host + "上线了,当前在线人数:" + allout.size());
String message;
while ((message = br.readLine()) != null) {
System.out.println(host + ": " + message);
synchronized (allout) {
for (PrintWriter p : allout) {
p.println(host + ":" + message);
}
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
synchronized (allout) {
allout.remove(pw);
}
System.out.println(host + "下线了,当前人数:" + allout.size());
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}