单发单收
ServerSocket
/**
* 服务端
*/
System.out.println("===服务端启动成功===");
// 1.注册端口
ServerSocket serverSocket = new ServerSocket(7777);
// 2.必须调用accept方法: 等待接收客户端的Socket连接请求,建立Socket通信管道
Socket socket = serverSocket.accept();
// 3.从Socket通信管道中得到一个字节输入流
InputStream is = socket.getInputStream();
// 4.把字节输入流包装成缓冲字符输入流进行消息的接受
BufferedReader br = new BufferedReader(new InputStreamReader(is));
// 5.按照行读取
String msg =null;
SocketAddress cip = socket.getRemoteSocketAddress();
while ((msg = br.readLine()) != null) {
System.out.println("客户端IP :" + cip);
System.out.println("消息:" + msg);
}
Socket
/**
* 客户端
*/
System.out.println("===客户端启动成功===");
// 1.创建Socket通信管道请求有服务端的连接
// 参数一:服务器ip地址,参数二:端口
Socket socket = new Socket("127.0.0.1", 7777);
// 2.从Socket通信管道中得到一个字节输出流,负责发送数据
OutputStream os = socket.getOutputStream();
// 3、把低级的字节流包装成打印流
PrintStream ps = new PrintStream(os);
// 4.发送消息
String msg = "测试一下";
ps.println(msg);
ps.flush();
// 5.关闭流,不需要关闭,容易引起BUG
// ps.close();
多发多收(单线程只能接受1个客户端)
/**
* 服务端
*/
System.out.println("===服务端启动成功===");
// 1.注册端口
ServerSocket serverSocket = new ServerSocket(7777);
// 2.必须调用accept方法: 等待接收客户端的Socket连接请求,建立Socket通信管道
Socket socket = serverSocket.accept();
// 3.从Socket通信管道中得到一个字节输入流
InputStream is = socket.getInputStream();
// 4.把字节输入流包装成缓冲字符输入流进行消息的接受
BufferedReader br = new BufferedReader(new InputStreamReader(is));
// 5.按照行读取
String msg =null;
SocketAddress cip = socket.getRemoteSocketAddress();
while ((msg = br.readLine()) != null) {
System.out.println("客户端IP :" + cip);
System.out.println("消息:" + msg);
}
/**
* 客户端
*/
System.out.println("===客户端启动成功===");
// 1.创建Socket通信管道请求有服务端的连接
// 参数一:服务器ip地址,参数二:端口
Socket socket = new Socket("127.0.0.1", 7777);
// 2.从Socket通信管道中得到一个字节输出流,负责发送数据
OutputStream os = socket.getOutputStream();
// 3、把低级的字节流包装成打印流
PrintStream ps = new PrintStream(os);
Scanner sc = new Scanner(System.in);
while (true) {
// 4.发送消息
System.out.println("请输入:");
String msg = sc.nextLine();
ps.println(msg);
ps.flush();
}
多发多收(多线程-线程池接受多个客户端)
// 使用静态变量记住一个线程池对象
private static ExecutorService pool = new ThreadPoolExecutor(3,
5,
6,
TimeUnit.SECONDS, new ArrayBlockingQueue<>(2),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
public static void main(String[] args) throws IOException {
/**
* 服务端
*/
System.out.println("===服务端启动成功===");
// 1.注册端口
ServerSocket serverSocket = new ServerSocket(7777);
// a.定义一个死循环由主线程负责不断的接受客户端的Socket管道连接。
while (true) {
// 2.每接收到一个客户端的Socket管道,交给一个独立的子线程负责读取消息
Socket socket = serverSocket.accept();
// 获取客户端的ip地址
SocketAddress cip = socket.getRemoteSocketAddress();
System.out.println("客户端IP: " + cip);
// 3.开始创建独立线程处理socket
Runnable target = new ServerReaderRunnable(socket);
pool.execute(target);
}
}
package xuexi.variable.logback;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.SocketAddress;
public class ServerReaderRunnable implements Runnable {
private Socket socket;
public ServerReaderRunnable(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
//重写run方法
try {
// 3.从Socket通信管道中得到一个字节输入流
InputStream is = socket.getInputStream();
// 4.把字节输入流包装成缓冲字符输入流进行消息的接受
BufferedReader br = new BufferedReader(new InputStreamReader(is));
// 5.按照行读取
String msg = null;
SocketAddress cip = socket.getRemoteSocketAddress();
while ((msg = br.readLine()) != null) {
System.out.println("客户端IP :" + cip);
System.out.println("消息:" + msg);
}
} catch (IOException e) {
SocketAddress ip2 = socket.getRemoteSocketAddress();
System.out.println("客户端IP下线 " + ip2);
}
}
}
/**
* 客户端
*/
System.out.println("===客户端启动成功===");
// 1.创建Socket通信管道请求有服务端的连接
// 参数一:服务器ip地址,参数二:端口
Socket socket = new Socket("127.0.0.1", 7777);
// 2.从Socket通信管道中得到一个字节输出流,负责发送数据
OutputStream os = socket.getOutputStream();
// 3、把低级的字节流包装成打印流
PrintStream ps = new PrintStream(os);
Scanner sc = new Scanner(System.in);
while (true) {
// 4.发送消息
System.out.println("请输入:");
String msg = sc.nextLine();
ps.println(msg);
ps.flush();
}