首页 > 基础资料 博客日记

Java TCP长连接详解:实现稳定、高效的网络通信

2024-09-08 22:00:06基础资料围观156

本篇文章分享Java TCP长连接详解:实现稳定、高效的网络通信,对你有帮助的话记得收藏一下,看Java资料网收获更多编程知识

        while (true) {
            String message = scanner.nextLine();
            session.getBasicRemote().sendText(message);
        }
    } catch (DeploymentException | IOException e) {
        e.printStackTrace();
    }
}

}


以上代码使用Java的WebSocket API实现了一个简单的实时聊天室。服务器端使用`@ServerEndpoint`注解标记一个WebSocket端点,并实现了相应的事件处理方法。客户端使用`@ClientEndpoint`注解标记一个WebSocket客户端,并实现了相应的事件处理方法。


服务器端使用`broadcast`方法将接收到的消息广播给所有连接的客户端。客户端可以通过`session.getBasicRemote().sendText(message)`方法向服务器发送消息,并通过`@OnMessage`注解接收服务器发送的消息。


在实际应用中,可以根据需要修改和扩展这些代码,添加认证、消息过滤等功能,以满足实际的业务需求。


场景2:在线多人游戏


在在线多人游戏中,多个玩家需要通过服务器进行实时的游戏交互,包括角色移动、攻击等操作。服务器需要接收并处理玩家的操作,并将操作结果广播给其他玩家。


服务器端代码示例(使用Java的Socket编程):



import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class GameServer {
private static final int PORT = 8888;
private List players;

public GameServer() {
    players = new ArrayList<>();
}

public void start() {
    try {
        ServerSocket serverSocket = new ServerSocket(PORT);
        System.out.println("服务器已启动,等待玩家连接...");

        while (true) {
            Socket playerSocket = serverSocket.accept();
            players.add(playerSocket);
            System.out.println("玩家已连接");

            Thread playerThread = new Thread(new PlayerThread(playerSocket));
            playerThread.start();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private class PlayerThread implements Runnable {
    private Socket playerSocket;

    public PlayerThread(Socket playerSocket) {
        this.playerSocket = playerSocket;
    }

    @Override
    public void run() {
        try {
            InputStream is = playerSocket.getInputStream();
            OutputStream os = playerSocket.getOutputStream();
            byte[] buffer = new byte[1024];
            int length;

            while ((length = is.read(buffer)) != -1) {
                String message = new String(buffer, 0, length);
                System.out.println("接收到玩家消息:" + message);

                // 处理玩家消息
                // ...

                // 将消息广播给其他玩家
                for (Socket otherSocket : players) {
                    if (otherSocket != playerSocket) {
                        os = otherSocket.getOutputStream();
                        os.write(message.getBytes());
                        os.flush();
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                playerSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

public static void main(String[] args) {
    GameServer gameServer = new GameServer();
    gameServer.start();
}

}


客户端代码示例(使用Java的Socket编程):



import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class GameClient {
private static final String SERVER_IP = “127.0.0.1”;
private static final int SERVER_PORT = 8888;

public void start() {
    try {
        Socket socket = new Socket(SERVER\_IP, SERVER\_PORT);
        System.out.println("已连接服务器");

        Thread sendThread = new Thread(new SendThread(socket));
        sendThread.start();

        Thread receiveThread = new Thread(new ReceiveThread(socket));
        receiveThread.start();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private class SendThread implements Runnable {
    private Socket socket;

    public SendThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            OutputStream os = socket.getOutputStream();
            Scanner scanner = new Scanner(System.in);

            while (true) {
                String message = scanner.nextLine();
                os.write(message.getBytes());
                os.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

private class ReceiveThread implements Runnable {
    private Socket socket;

    public ReceiveThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            InputStream is = socket.getInputStream();
            byte[] buffer = new byte[1024];
            int length;

            while ((length = is.read(buffer)) != -1) {
                String message = new String(buffer, 0, length);
                System.out.println("接收到服务器消息:" + message);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

public static void main(String[] args) {
    GameClient gameClient = new GameClient();
    gameClient.start();
}

}


以上是一个简单的在线多人游戏的示例,服务器可以接收玩家的消息,并将消息广播给其他玩家。客户端可以发送消息到服务器,并接收服务器广播的消息。在实际的游戏开发中,还需要更多的逻辑来处理游戏的交互和状态。


### 案例:


案例1:股票实时价格推送


在股票交易系统中,经常需要实时推送股票的最新价格给客户端。以下是一个简单的实现代码示例:


服务器端:



import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

@ServerEndpoint(“/stock”)
public class StockServer {
private static List clients = new ArrayList<>();
private static Random random = new Random();

@OnOpen
public void onOpen(Session session) {
    clients.add(session);
    System.out.println("有新的客户端连接,当前在线人数:" + clients.size());

    // 开始推送股票价格
    new Thread(() -> {
        try {
            while (true) {
                double price = random.nextDouble() \* 100.0;
                broadcast("股票价格:" + price);
                Thread.sleep(2000);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }).start();
}

@OnClose
public void onClose(Session session) {
    clients.remove(session);
    System.out.println("有客户端断开连接,当前在线人数:" + clients.size());
}

@OnError
public void onError(Session session, Throwable error) {
    System.out.println("发生错误");
    error.printStackTrace();
}

private void broadcast(String message) {
    for (Session client : clients) {
        try {
            client.getBasicRemote().sendText(message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

}


客户端:



import javax.websocket.*;
import java.io.IOException;
import java.net.URI;

@ClientEndpoint
public class StockClient {
private static final String SERVER_URI = “ws://localhost:8080/stock”;

@OnOpen
public void onOpen(Session session) {
    System.out.println("已连接到服务器");
}

@OnMessage
public void onMessage(String message, Session session) {
    System.out.println("接收到股票价格:" + message);
}

@OnClose
public void onClose(Session session, CloseReason reason) {
    System.out.println("已断开与服务器的连接:" + reason.getReasonPhrase());
}

@OnError
public void onError(Session session, Throwable error) {
    System.out.println("发生错误");
    error.printStackTrace();
}

public static void main(String[] args) {
    WebSocketContainer container = ContainerProvider.getWebSocketContainer();
    try {
        Session session = container.connectToServer(StockClient.class, URI.create(SERVER\_URI));
        System.out.println("连接已建立");

        // 可以在这里添加其他代码,例如用户认证、接收用户输入等操作

    } catch (DeploymentException | IOException e) {
        e.printStackTrace();
    }
}

}


以上代码在服务器端模拟生成随机的股票价格,然后将价格推送给所有连接的客户端。客户端收到价格后进行相应的处理。


案例2:实时天气信息推送


在一个天气查询系统中,可以实时推送天气信息给用户。以下是一个简单的实现代码示例:


服务器端:



import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

@ServerEndpoint(“/weather”)
public class WeatherServer {
private static List clients = new ArrayList<>();
private static Random random = new Random();

@OnOpen
public void onOpen(Session session) {
    clients.add(session);
    System.out.println("有新的客户端连接,当前在线人数:" + clients.size());

    // 开始推送天气信息
    new Thread(() -> {
        try {
            while (true) {
                String weather = generateWeather();
                broadcast("当前天气:" + weather);
                Thread.sleep(5000);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }).start();
}

@OnClose
public void onClose(Session session) {
    clients.remove(session);
    System.out.println("有客户端断开连接,当前在线人数:" + clients.size());
}

@OnError
public void onError(Session session, Throwable error) {
    System.out.println("发生错误");
    error.printStackTrace();
}

private void broadcast(String message) {
    for (Session client : clients) {
        try {
            client.getBasicRemote().sendText(message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

private String generateWeather() {
    String[] weatherOptions = {"晴天", "多云", "阴天", "小雨", "雷阵雨"};
    int index = random.nextInt(weatherOptions.length);
    return weatherOptions[index];
}

}


客户端:



import javax.websocket.*;
import java.io.IOException;
import java.net.URI;

@ClientEndpoint
public class WeatherClient {
private static final String SERVER_URI = “ws://localhost:8080/weather”;

@OnOpen
public void onOpen(Session session) {
    System.out.println("已连接到服务器");
}

@OnMessage
public void onMessage(String message, Session session) {
    System.out.println("接收到天气信息:" + message);
}

@OnClose
public void onClose(Session session, CloseReason reason) {
    System.out.println("已断开与服务器的连接:" + reason.getReasonPhrase());
}

@OnError
public void onError(Session session, Throwable error) {

最后

每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。

如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。

se
public void onClose(Session session, CloseReason reason) {
System.out.println(“已断开与服务器的连接:” + reason.getReasonPhrase());
}

@OnError
public void onError(Session session, Throwable error) {

最后

每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。

如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。

[外链图片转存中…(img-HOWSMFI9-1719652759485)]


文章来源:https://blog.csdn.net/2401_85112749/article/details/140067312
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐

标签云