一、客户端到服务端一发一收
public class Send {
public static void main(String[] args) throws Exception {
System.out.println("========客户端========");
//1.创建Socket通信管道请求
Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
//2.从Socket通信管道中获取字节输出流
OutputStream os = socket.getOutputStream();
//3.将字节输出流包装成打印流 提高发送效率
PrintStream ps = new PrintStream(os);
//4.发送消息
ps.println("我爱小迪");
//5.关闭通信管道
socket.close();
}
}
public class Receive {
public static void main(String[] args) throws Exception {
System.out.println("=======服务端=======");
//1.注册服务端口
ServerSocket serverSocket = new ServerSocket(8888);
//2.接收来自客户端的Socket通信管道请求
Socket socket = serverSocket.accept();
//3.从Socket通信管道中获取字节输入流
InputStream is = socket.getInputStream();
//4.将字节输入流包装成缓冲字符流 提高效率
BufferedReader br = new BufferedReader(new InputStreamReader(is));
//5.输出
String info;
while ((info = br.readLine()) != null) {
System.out.println(info);
}
//6.关闭通信管道
socket.close();
}
}
运行结果:
二、客户端到服务端多发多收
仅在客户端基础上加以循环输入,服务端不需要动。
public class Send {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
System.out.println("========客户端========");
//1.创建Socket通信管道请求
Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
//2.从Socket通信管道中获取字节输出流
OutputStream os = socket.getOutputStream();
//3.将字节输出流包装成打印流 提高发送效率
PrintStream ps = new PrintStream(os);
//4.循环发送消息
while (true) {
System.out.println("请输入:");
String info = sc.nextLine();
if ("exit".equals(info)) {
socket.close();
break;
} else {
ps.println(info);
}
}
}
}
运行结果:
三、服务端接收多个客户端请求
服务端要不停的接收来自客户端的Socket信息通道请求,每接收一个通道请求就启动一个线程。
public class Receive {
public static void main(String[] args) throws Exception {
System.out.println("=======服务端=======");
ServerSocket serverSocket = new ServerSocket(8888);
while (true) {
Socket socket = serverSocket.accept();
new MyThread(socket).start();
}
}
}
public class MyThread extends Thread{
private Socket socket;
public MyThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info;
while ((info = br.readLine()) != null) {
System.out.println(socket.getRemoteSocketAddress() + info);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
四、即时通信
public class Send {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
System.out.println("=======客户端=======");
//创建Socket通信管道请求
Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
//从Socket通信管道中获取字节输出流
OutputStream os = socket.getOutputStream();
//将输出流包装成打印流 提高效率
PrintStream ps = new PrintStream(os);
//开启分支线程等待接收消息
new SendThread(socket).start();
//发送信息
while (true) {
String info = sc.nextLine();
if ("exit".equals(info)) {
Server.allSocket.remove(socket);
socket.close();
break;
} else {
ps.println(info);
ps.flush();
}
}
}
}
public class SendThread extends Thread{
private Socket socket;
public SendThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info;
while ((info = br.readLine()) != null) {
System.out.println(socket.getLocalSocketAddress() + ":" + info);
}
} catch (Exception e) {
System.out.println("离线成功!");
}
}
}
public class Server {
public static ArrayList<Socket> allSocket = new ArrayList<>(); //保存全部的用户
public static void main(String[] args) throws Exception {
System.out.println("=======服务端=======");
//注册服务端端口
ServerSocket serverSocket = new ServerSocket(8888);
//循环接收来自客户端的Socket请求
while (true) {
Socket socket = serverSocket.accept();
System.out.println(socket.getRemoteSocketAddress() + "已上线~");
allSocket.add(socket);
new ServerThread(socket).start();
}
}
}
public class ServerThread extends Thread{
private Socket socket;
public ServerThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
//从Socket通信管道中获取字节输入流
InputStream is = socket.getInputStream();
//将字节输入流包装成缓冲字符流 提高效率
BufferedReader br = new BufferedReader(new InputStreamReader(is));
//中转, 服务端将来自客户端的信息发送给另外一个客户端
String info;
while ((info = br.readLine()) != null) {
for (Socket socket1 : Server.allSocket) {
if (socket1 != this.socket) {
OutputStream os = socket1.getOutputStream();
PrintStream ps = new PrintStream(os);
ps.println(info);
ps.flush();
}
}
}
} catch (Exception e) {
System.out.println(socket.getRemoteSocketAddress() + "已离线!");
}
}
}
运行结果: