一对多应答型服务器的意思就是对于一个服务器监听的端口有多个客户端会进行连接,将单个客户端发送的消息传给该客户端。在看代码之前,祝宝贝们龙年快乐呀!!
while (true)
{
Socket socket = serverSocket.accept();
System.out.println(socket.getInetAddress()+"连接成功....");
new Msg(socket).start();
}
如何创建多个客户端,这里我们用到了while循环来创建
1.服务端
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.stream.BaseStream;
//一对多应答型服务器
public class EchoServer {
public static void main(String[] args) {
try(ServerSocket serverSocket = new ServerSocket(8888)){
System.out.println("服务器正在监听8888端口..........");
while (true)
{
Socket socket = serverSocket.accept();
System.out.println(socket.getInetAddress()+"连接成功....");
new Msg(socket).start();
}
}catch (Exception e)
{
System.out.println("连接失败.......");
}
}
}
//定义消息处理线程
class Msg extends Thread{
private Socket socket;
public Msg(Socket socket)
{
this.socket = socket;
}
public void run()
{
this.msg();
}
private void msg() {
try(BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter printWriter = new PrintWriter(socket.getOutputStream())
)
{
//将从客户端读取的消息写回给客户端
while(true)
{
printWriter.println(bufferedReader.readLine()+"[ok]");
printWriter.flush();
}
}catch (Exception e)
{
System.out.println(this.socket.getInetAddress()+"断线了");
}
}
}
2.客户端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Objects;
import java.util.Scanner;
public class GoodTCP {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
try {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入: server,<port> 或者:<ip>,<port>");
String str = scanner.nextLine();
String [] temp = str.split(",");
if (Objects.equals("server",temp[0]))
{
System.out.println("TCP Server Listen at "+temp[1]+" .....");
serverSocket = new ServerSocket(Integer.parseInt(temp[1]));
socket = serverSocket.accept();//监听端口
System.out.println("连接成功");
}
else {
System.out.println("TCP Server Listen at "+temp[0]+","+temp[1]);
socket = new Socket(temp[0],Integer.parseInt(temp[1]));
System.out.println("连接成功");
}
new send(socket).start();
new Receives(socket).start();
}catch (Exception e)
{
System.out.println("连接失败......");
}finally{
if(serverSocket != null){
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
class send extends Thread{
private Socket socket;
public send(Socket socket)
{
this.socket = socket;
}
public void run()
{
this.sendMsg();
}
//发送消息线程
private void sendMsg() {
try(Scanner scanner = new Scanner(System.in);
PrintWriter printWriter = new PrintWriter(socket.getOutputStream())){
while(true)
{
String tmp = scanner.nextLine();
printWriter.println(tmp);
printWriter.flush();
if (Objects.equals("exit",tmp))
{
System.out.println("结束聊天");
break;
}
}
}catch (Exception e)
{
System.out.println("发送失败");
}
}
}
class Receives extends Thread
{
private Socket socket;
public Receives(Socket socket)
{
this.socket = socket;
}
public void run()
{
this.receiveMsg();
}
//接收消息线程
private void receiveMsg() {
try(BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())))
{
while (true)
{
String temp = bufferedReader.readLine();
System.out.println("服务端:"+temp);
if (Objects.equals("exit",temp))
{
System.out.println("对方已结束聊天");
break;
}
}
}catch (Exception e)
{
System.out.println("接受失败.....");
}
}
}
在这里我们的客户端代码话还是使用我们的优化后的点对点应用代码很方便
3.运行结果
在这里我们可以看到我们创建了两个客户端来实现