单线程(单发单收)
发送方(一般设计成本机)
public static void main(String[] args) throws IOException {
//设置ip与端口、类似一个管道
Socket socket = new Socket("127.0.0.1", 1111);
//写就ops
OutputStream os = socket.getOutputStream();
//包装成string
PrintStream ps = new PrintStream(os);
ps.print("发送信息");
ps.flush();
os.close();
}
接收方
public static void main(String[] args) throws IOException {
//连接端口
ServerSocket serverSocket = new ServerSocket(1111);
//设置接收
Socket socket = serverSocket.accept();
//设置可以输入is
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
//按找行读取信息
String msg;
if ((msg = br.readLine()) != null){
System.out.println(socket.getRemoteSocketAddress() + "说了:: " + msg);
}
}
多条信息(单线程)
发送方(循环发送)
public static void main(String[] args) throws IOException {
// 1、创建Socket通信管道请求有服务端的连接
// public Socket(String host, int port)
// 参数一:服务端的IP地址
// 参数二:服务端的端口
Socket socket = new Socket("127.0.0.1", 1111);
OutputStream os = socket.getOutputStream();
PrintStream ps = new PrintStream(os);
//固定三行
//输入信息
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请说:");
String msg = sc.nextLine();//输入信息
// 4、发送消息
ps.println(msg);
ps.flush();
}
}
循环接收
ServerSocket serverSocket = new ServerSocket(1111);
while (true){
Socket socket = serverSocket.accept();
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
//按找行读取信息
String msg;
if ((msg = br.readLine()) != null){
System.out.println(socket.getRemoteSocketAddress() + "说了:: " + msg);
}
}
实战
端口转发
客户端和客户端不能直接连接,还是鸭哦准备一个服务端、让客户端先连接到服务端
服务端主线程不端接收客户端主线程的连接socket
然后每一个socket分配一个子线程去连接,然后只需要将线程接收的信息分发给每一个在线的客户端
如何查询在线客户端
服务端需要一个集合存储所有的socket管道,方便转发消息
每次建立连接就用list去存储一个