Java应用10(客户端与服务器通信)

Java客户端与服务器通信

Java提供了多种方式来实现客户端与服务器之间的通信,下面我将介绍几种常见的方法:

1. 基于Socket的基本通信

服务器端代码

import java.io.*;
import java.net.*;public class SimpleServer {public static void main(String[] args) {try {ServerSocket serverSocket = new ServerSocket(8080);System.out.println("服务器启动,等待客户端连接...");Socket clientSocket = serverSocket.accept();System.out.println("客户端已连接: " + clientSocket.getInetAddress());// 获取输入输出流BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);// 通信循环String inputLine;while ((inputLine = in.readLine()) != null) {System.out.println("收到客户端消息: " + inputLine);out.println("服务器回复: " + inputLine);}// 关闭连接in.close();out.close();clientSocket.close();serverSocket.close();} catch (IOException e) {e.printStackTrace();}}
}

客户端代码

import java.io.*;
import java.net.*;public class SimpleClient {public static void main(String[] args) {try {Socket socket = new Socket("localhost", 8080);// 获取输入输出流PrintWriter out = new PrintWriter(socket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));// 发送消息out.println("Hello, Server!");// 接收回复String response = in.readLine();System.out.println("服务器回复: " + response);// 关闭连接out.close();in.close();socket.close();} catch (IOException e) {e.printStackTrace();}}
}

2. 使用Java RMI (远程方法调用)

RMI允许一个Java程序调用另一个Java虚拟机上对象的方法。

定义远程接口

import java.rmi.Remote;
import java.rmi.RemoteException;public interface RemoteService extends Remote {String sayHello(String name) throws RemoteException;
}

实现远程服务

import java.rmi.*;
import java.rmi.server.*;public class RemoteServiceImpl extends UnicastRemoteObject implements RemoteService {public RemoteServiceImpl() throws RemoteException {super();}public String sayHello(String name) throws RemoteException {return "Hello, " + name + "!";}
}

服务器端代码

import java.rmi.registry.*;public class RMIServer {public static void main(String[] args) {try {RemoteService service = new RemoteServiceImpl();LocateRegistry.createRegistry(1099);Naming.rebind("RemoteService", service);System.out.println("RMI服务已启动...");} catch (Exception e) {e.printStackTrace();}}
}

客户端代码

import java.rmi.*;public class RMIClient {public static void main(String[] args) {try {RemoteService service = (RemoteService) Naming.lookup("rmi://localhost/RemoteService");String response = service.sayHello("Client");System.out.println("服务器回复: " + response);} catch (Exception e) {e.printStackTrace();}}
}

3. 使用HTTP通信 (HttpURLConnection)

客户端HTTP请求示例

import java.io.*;
import java.net.*;public class HttpClientExample {public static void main(String[] args) {try {URL url = new URL("http://example.com/api");HttpURLConnection connection = (HttpURLConnection) url.openConnection();// 设置请求方法connection.setRequestMethod("GET");// 获取响应int responseCode = connection.getResponseCode();System.out.println("响应代码: " + responseCode);BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String inputLine;StringBuilder response = new StringBuilder();while ((inputLine = in.readLine()) != null) {response.append(inputLine);}in.close();System.out.println("响应内容: " + response.toString());} catch (Exception e) {e.printStackTrace();}}
}

4. 使用第三方库 - Apache HttpClient

import org.apache.http.client.methods.*;
import org.apache.http.impl.client.*;
import org.apache.http.util.EntityUtils;public class ApacheHttpClientExample {public static void main(String[] args) {try (CloseableHttpClient httpClient = HttpClients.createDefault()) {HttpGet request = new HttpGet("http://example.com/api");try (CloseableHttpResponse response = httpClient.execute(request)) {System.out.println("状态码: " + response.getStatusLine().getStatusCode());String result = EntityUtils.toString(response.getEntity());System.out.println("响应内容: " + result);}} catch (Exception e) {e.printStackTrace();}}
}

5. WebSocket通信

服务器端 (使用Java EE或Spring)

import javax.websocket.*;
import javax.websocket.server.*;@ServerEndpoint("/websocket")
public class WebSocketServer {@OnOpenpublic void onOpen(Session session) {System.out.println("客户端连接: " + session.getId());}@OnMessagepublic void onMessage(String message, Session session) {System.out.println("收到消息: " + message);try {session.getBasicRemote().sendText("服务器回复: " + message);} catch (IOException e) {e.printStackTrace();}}@OnClosepublic void onClose(Session session) {System.out.println("客户端断开: " + session.getId());}
}

客户端 (使用Java API)

import javax.websocket.*;@ClientEndpoint
public class WebSocketClient {@OnOpenpublic void onOpen(Session session) {System.out.println("连接已建立");try {session.getBasicRemote().sendText("Hello, Server!");} catch (IOException e) {e.printStackTrace();}}@OnMessagepublic void onMessage(String message) {System.out.println("收到服务器消息: " + message);}public static void main(String[] args) {WebSocketContainer container = ContainerProvider.getWebSocketContainer();try {container.connectToServer(WebSocketClient.class, URI.create("ws://localhost:8080/websocket"));Thread.sleep(5000); // 保持连接一段时间} catch (Exception e) {e.printStackTrace();}}
}

选择建议

  1. 简单通信:使用Socket或HttpURLConnection

  2. 分布式应用:考虑RMI或RPC框架

  3. Web服务:使用HTTP客户端库

  4. 实时双向通信:WebSocket是更好的选择

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/85926.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytorch基本运算-范数

引言 前序学习进程中,已经对pytorch基本运算有了详细探索,文章链接有: 基本运算 广播失效 乘除法和幂运算 hadamard积、点积和矩阵乘法 上述计算都是以pytorch张量为运算元素,这些张量基本上也集中在一维向量和二维矩阵&#x…

EasyRTC音视频实时通话助力新一代WebP2P视频物联网应用解决方案

一、方案背景​ 物联网技术深刻变革各行业,视频物联在智慧城市、工业监控等场景广泛应用。传统方案依赖中心服务器中转,存在传输效率低、网络负载大的问题。新一代WebP2P视频物联技术实现设备直连,降低网络压力并提升传输效率,成…

DAY 15 复习日

浙大疏锦行 数据使用爬虫爬取weibo数据,下面是代码 import datetime import os import csv import timeimport numpy as np import random import re import urllib.parse import requests from fake_useragent import UserAgentdef init():if not os.path.exists…

SSL/TLS 协议详解:安全通信的基石

一、概述 SSL(Secure Sockets Layer) 及其继任者 TLS(Transport Layer Security) 是位于 传输层(TCP)与应用层之间 的加密协议,用于在网络通信中实现 机密性、身份认证和数据完整性。 核心目标…

使用子树合并策略更新git项目的部分目录

背景 正在开发的一个项目中引用了第三方库的源码,由于历史原因,源码的引用并不是很规范(直接下载下来后作为自己项目的部分源码使用,还进行了一些修改),具体如下: 我有一个本地git项目project…

pikachu通关教程-CSRF

CSRF(get) 用bp进行抓包 选择action value值的修改 点击test in browser copy然后放在bp代理的浏览器上,会出现一个提交按钮,这时候点击之后信息就被修改了。 CSRF(post) 请求的方式不同,其他都是一样 CSRF Token 存在cookie 首先要先下载一…

AI驱动游戏开发:Unity与ML-Agents结合

AI驱动游戏开发:Unity与ML-Agents结合 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 AI驱动游戏开发:Unity与ML-Agents结合摘要引言技术架构与开发流程1. Unity与ML-Agents协同机制2. 开发…

如何给windos11 扩大C盘容量

动不动C盘就慢了,苹果逼着用户换手机,三天两头更新系统,微软也是毫不手软。c盘 从10个G就够用,到100G 也不够,看来通货膨胀是部分行业的。 在 Windows 11 中扩大 C 盘容量,主要取决于磁盘分区布局和可用空…

Kafka入门-消费者

消费者 Kafka消费方式:采用pull(拉)的方式,消费者从broker中主动拉去数据。使用pull的好处就是消费者可以根据自身需求,进行拉取数据,但是坏处就是如果Kafka没有数据,那么消费者可能会陷入循环…

SpringBoot自动化部署实战技术文章大纲

技术背景与目标 介绍SpringBoot在现代开发中的重要性自动化部署的价值:提升效率、减少人为错误、实现CI/CD适用场景:中小型Web应用、微服务架构 自动化部署核心方案 基于Docker的容器化部署 SpringBoot应用打包为Docker镜像使用Docker Compose编排多容…

TDengine 集群运行监控

简介 为了确保集群稳定运行,TDengine 集成了多种监控指标收集机制,并通过 taosKeeper 进行汇总。taosKeeper 负责接收这些数据,并将其写入一个独立的 TDengine 实例中,该实例可以与被监控的 TDengine 集群保持独立。TDengine 中的…

C# 委托UI控件更新例子,何时需要使用委托

1. 例子1 private void UdpRxCallBackFunc(UdpDataStruct info) {// 1. 前置检查防止无效调用if (textBoxOutput2.IsDisposed || !textBoxOutput2.IsHandleCreated)return;// 2. 使用正确的委托类型Invoke(new Action(() >{// 3. 双重检查确保安全if (textBoxOutput2.IsDis…

[10-2]MPU6050简介 江协科技学习笔记(22个知识点)

1 2 3 欧拉角是描述三维空间中刚体或坐标系之间相对旋转的一种方法。它们由三个角度组成,通常表示为: • 偏航角(Yaw):绕垂直轴(通常是z轴)的旋转,表示偏航方向的变化。 • 俯仰角&a…

虚拟环境共享系统包

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 虚拟环境共享系统包 python basic_pipelines/detection.py如果报错显示如下: Traceback (most recent call last):File "/home/ai/hailort/hailo-rpi5-exam…

Java求职者面试题解析:基础概念、计算机基础与源码原理

Java求职者面试题解析:基础概念、计算机基础与源码原理 第一轮:基础概念问题 1. 什么是Java的跨平台特性? Java的跨平台特性是指Java程序可以在任何支持Java虚拟机(JVM)的设备上运行,而无需重新编译。这…

网页前端开发(基础进阶4--axios)

Ajax Ajax(异步的JavaScript和XML) 。 XML是可扩展标记语言,本质上是一种数据格式,可以用来存储复杂的数据结构。 可以通过Ajax给服务器发送请求,并获取服务器响应的数据。 Ajax采用异步交互:可以在不重新加载整个页面的情况下&am…

设计模式-迪米特法则

迪米特法则 迪米特法则 (Law of Demeter, LoD),也被称为“最少知识原则 (Principle of Least Knowledge)”,是面向对象设计中的一个重要原则。 核心思想:一个对象应该对其他对象有尽可能少的了解。 更具体地说,它规定了一个对象…

结构性-代理模式

动态代理主要是为了处理重复创建模板代码的场景。 使用示例 public interface MyInterface {String doSomething(); }public class MyInterfaceImpl implements MyInterface{Overridepublic String doSomething() {return "接口方法dosomething";} }public class M…

Unity大型项目资源框架

🎯 Unity大型项目资源管理:低端机检测后自动切换资源框架(大厂风格) 🧩 框架目标 ✅ 启动时检测机型性能,判定设备等级 ✅ 同一资源有高配/中配/低配不同压缩格式 ✅ 根据设备等级,加载对应资源包(AB) ✅ 支持动态切换(可用来切换特效/贴图分辨率/模型LOD) ✅ 保证…

MATLAB仿真:偏振光在光纤通信中的应用研究_可复现,有问题请联系博主

MATLAB仿真:偏振光在光纤通信中的应用研究 1. 研究概述 本文通过MATLAB仿真研究偏振光在光纤通信中的关键技术,包括偏振态生成、传输特性和检测方法,重点分析偏振模色散(PMD)的影响机制,并设计偏振控制优化方案。 %% 主程序框架 clc; clear; close all; addpath(Polar…