用java编写多人聊天室程序,不需要太复杂求大神发给我,最好能运行,有源代码。谢谢了

用java编写多人聊天室程序,不需要太复杂求大神发给我,最好能运行,有源代码。谢谢了,第1张

文件1:

package comqq;

import javaioInputStream;

import javaioDataInputStream;

import javaioInputStreamReader;

import javaioOutputStream;

import javaioDataOutputStream;

import javaioBufferedReader;

import javanetServerSocket;

import javanetSocket;

import javaioIOException;

import javautilDate;

public class Server {

public Server() {

try {

ServerSocket s = new ServerSocket(8888);

Socket ss = saccept();

OutputStream out = ssgetOutputStream();

DataOutputStream dout = new DataOutputStream(out);

InputStream in = ssgetInputStream();

DataInputStream din = new DataInputStream(in);

Systemoutprint(dinreadUTF() + "!");

doutwriteUTF("你已经连接到服务器" + "\t" + "你的地址:" + ssgetInetAddress()

+ "\t" + "你的链接端口:" + ssgetLocalPort() + "\n");

new ReadMessage(din)start();

new SendMessage(dout)start();

} catch (IOException e) {

eprintStackTrace();

}

}

public static void main(String[] args) {

new Server();

}

}

// 接受客户端信息

class ReadMessage extends Thread {

private DataInputStream din;

public ReadMessage(DataInputStream din) {

thisdin = din;

}

public void run() {

String str;

try {

while (true) {

str = dinreadUTF();

Systemoutprintln(new Date()toLocaleString() + "客户端说:" + str);

if (strequals("bye")) {

Systemoutprintln("客户端下线!");

break;

}

}

} catch (IOException e) {

eprintStackTrace();

}

}

}

// 发出服务器信息

class SendMessage extends Thread {

private DataOutputStream dout;

public SendMessage(DataOutputStream dout) {

thisdout = dout;

}

public void run() {

InputStreamReader inr = new InputStreamReader(Systemin);

BufferedReader buf = new BufferedReader(inr);

String str;

try {

while (true) {

str = bufreadLine();

doutwriteUTF(str);

if (strequals("bye")) {

Systemoutprintln("服务器退出!");

Systemexit(1);

}

}

} catch (IOException e) {

eprintStackTrace();

}

}

}

----------------------------------------

文件2:

package comqq;

import javaioInputStream;

import javaioDataInputStream;

import javaioInputStreamReader;

import javaioOutputStream;

import javaioDataOutputStream;

import javaioBufferedReader;

import javanetSocket;

import javaioIOException;

import javautilDate;

public class Client {

public Client() {

try {

Socket s = new Socket("19216812", 8888);

InputStream in = sgetInputStream();

DataInputStream din = new DataInputStream(in);

OutputStream out = sgetOutputStream();

DataOutputStream dout = new DataOutputStream(out);

doutwriteUTF("服务器你好!我是客户端");

Systemoutprintln(dinreadUTF());

new Thread(new SenderMessage(dout))start();

new Thread(new ReaderMessage(din))start();

} catch (IOException e) {

eprintStackTrace();

}

}

public static void main(String[] args) {

new Client();

}

}

class ReaderMessage implements Runnable {

private DataInputStream din;

public ReaderMessage(DataInputStream din) {

thisdin = din;

}

public void run() {

String str;

try {

while (true) {

str = dinreadUTF();

Systemoutprintln(new Date()toLocaleString() + "服务器说:" + str);

if (strequals("bye")) {

Systemoutprintln("服务器已经关闭,此程序自动退出!");

break;

}

}

} catch (IOException e) {

eprintStackTrace();

}

}

}

class SenderMessage implements Runnable {

private DataOutputStream dout;

public SenderMessage(DataOutputStream dout) {

thisdout = dout;

}

public void run() {

String str;

InputStreamReader inf = new InputStreamReader(Systemin);

BufferedReader buf = new BufferedReader(inf);

try {

while (true) {

str = bufreadLine();

doutwriteUTF(str);

if (strequals("bye")) {

Systemoutprintln("客户端自己退出!");

Systemexit(1);

}

}

} catch (IOException e) {

eprintStackTrace();

}

}

}

概述 Java Remote Method Invocation ( RMI Java远程方法调用)允许您使用Java编写分布式对象 本文将介绍RMI的优点以及如何将其连接到现有的和原有的系统中 以及与用Java 编写的组件的连接 RMI为采用Java对象的分布式计算提供了简单而直接的途径 这些对象可以是新的Java对象 也可以是围绕现有API的简单的Java包装程序 Java体现了 编写一次就能在任何地方运行的模式 而RMI可将Java模式进行扩展 使之可在任何地方运行 因为RMI是以Java为核心的 所以 它将Java的安全性和可移植性等强大功能带给了分布式计算 您可将代理和梢务逻辑等属性移动到网络中最合适的地方 如果您要扩展Java在系统中的使用 RMI将使您充分利用其强大功能 RMI可利用标准Java本机方法接口JNI与现有的和原有的系统相连接 RMI还可利用标准JDBC包与现有的关系数据库连接 RMI/JNI和RMI/JDBC相结合 可帮助您利用RMI与目前使用非Java语言的现有服务器进行通信 而且在您需要时可扩展Java在这些服务器上的使用 RMI可帮助您在扩展使用时充分利用Java的强大功能 优点 从最基本的角度看 RMI是Java的远程过程调用(RPC)机制 与传统的RPC系统相比 RMI具有若干优点 因为它是Java面向对象方法的一部分 传统的RPC系统采用中性语言 所以是最普通的系统 它们不能提供所有可能的目标平台所具有的功能 RMI以Java为核心 可与采用本机方法与现有系统相连接 这就是说 RMI可采用自然 直接和功能全面的方式为您提供分布式计算技术 而这种技术可帮助您以不断递增和无缝的方式为整个系统添加Java功能 RMI的主要优点如下面向对象 RMI可将完整的对象作为参数和返回值进行传递 而不仅仅是预定义的数据类型 也就是说 您可以将类似Java哈希表这样的复杂类型作为一个参数进行传递 而在目前的RPC系统中 您只能依靠客户机将此类对象分解成基本数据类型 然后传递这些数据类型 最后在服务器端重新创建哈希表 RMI则不需额外的客户程序代码(将对象分解成基本数据类型) 直接跨网传递对象可移动属性 RMI可将属性(类实现程序)从客户机移动到服务器 或者从服务器移到客户机 例如 您可以定义一个检查雇员开支报告的接口 以便察看雇员是否遵守了公司目前实行的政策 在开支报告创建后 客户机就会从服务器端获得实现该接口的对象 如果政策发生变化 服务器端就会开始返回使用了新政策的该接口的另一个实现程序 您不必在用户系统上安装任何新的软件就能在客户端检查限制条件 从而向用户提供烁快的反馈 并降低服务器的工作量 这样就能具备最大的灵活性 因为政策改变时只需要您编写一个新的Java类 并将其在服务器主机上安装一次即可设计方式 对象传递功能使您可以在分布式计算中充分利用面向对象技术的强大功能 如二层和三层结构系统 如果您能够传递属性 那么您就可以在您的解决方案中使用面向对象的设计方式 所有面向对象的设计方式无不依靠不同的属性来发挥功能 如果不能传递完整的对象 包括实现和类型 就会失去设计方式上所提供的优点安全 RMI使用Java内置的安全机制保证下载执行程序时用户系统的安全 RMI使用专门为保护系统免遭恶意小应用程序侵害而设计的安全管理程序 可保护您的系统和网络免遭潜在的恶意下载程序的破坏 在情况严重时 服务器可拒绝下载任何执行程序 便于编写和使用 RMI使得Java远程服务程序和访问这些服务程序的Java客户程序的编写工作变得轻松 简单 远程接口实际上就是Java接口 服务程序大约用三行指令宣布本身是服务程序 其它方面则与任何其它Java对象类似 这种简单方法便于快速编写完整的分布式对象系统的服务程序 并快速地制做软件的原型和早期版本 以便于进行测试和评估 因为RMI程序编写简单 所以维护也简单可连接现有/原有的系统 RMI可通过Java的本机方法接口JNI与现有系统进行进行交互 利用RMI和JNI 您就能用Java语言编写客户端程序 还能使用现有的服务器端程序 在使用RMI/JNI与现有服务器连接时 您可以有选择地用Java重新编写服务程序的任何部分 并使新的程序充分发挥Java的功能 类似地 RMI可利用JDBC 在不修改使用数据库的现有非Java源代码的前提下与现有关系数据库进行交互编写一次 到处运行 RMI是Java 编写一次 到处运行 方法的一部分 任何基于RMI的系统均可 %地移植到任何Java虚拟机上 RMI/JDBC系统也不例外 如果使用RMI/JNI与现有系统进行交互工作 则采用JNI编写的代码可与任何Java虚拟机进行编译 运行分布式垃圾收集 RMI采用其分布式垃圾收集功能收集不再被网络中任何客户程序所引用的远程服务对象 与Java 虚拟机内部的垃圾收集类似 分布式垃圾收集功能允许用户根据自己的需要定义服务器对象 并且明确这些对象在不再被客户机引用时会被删除并行计算 RMI采用多线程处理方法 可使您的服务器利用这些Java线程更好地并行处理客户端的请求 Java分布式计算解决方案 RMI从JDK 开始就是Java平台的核心部分 因此 它存在于任何一台 Java虚拟机中 所有RMI系统均采用相同的公开协议 所以 所有Java 系统均可直接相互对话 而不必事先对协议进行转换 lishixinzhi/Article/program/Java/hx/201311/26469

JNI是JavaNativeInterface的缩写,中文为JAVA本地调用。从Java11开始,JavaNativeInterface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。

使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库,与硬件、 *** 作系统进行交互,或者为了提高程序的性能。JNI标准至少保证本地代码能工作在任何Java虚拟机实现下。

------------------------------------------------------------------

编写带有native声明的方法的java类

·使用javac命令编译所编写的java类

·使用javahjnijava类名生成扩展名为h的头文件

·使用C/C++实现本地方法

·将C/C++编写的文件生成动态连接库

·ok

1)编写java程序:这里以HelloWorld为例。

代码1:

classHelloWorld{

publicnativevoiddisplayHelloWorld();

static{

SystemloadLibrary("hello");

}

publicstaticvoidmain(String[]args){

newHelloWorld()displayHelloWorld();

}

}

声明native方法:如果你想将一个方法做为一个本地方法的话,那么你就必须声明改方法为native的,并且不能实现。其中方法的参数和返回值在后面讲述。Load动态库:SystemloadLibrary("hello");加载动态库(我们可以这样理解:我们的方法displayHelloWorld()没有实现,但是我们在下面就直接使用了,所以必须在使用之前对它进行初始化)这里一般是以static块进行加载的。同时需要注意的是SystemloadLibrary();的参数“hello”是动态库的名字。

2)编译

没有什么好说的了javacHelloWorldjava

3)生成扩展名为h的头文件javah

jniHelloWorld头文件的内容:/DONOTEDITTHISFILE-itismachinegenerated/

1include

/HeaderforclassHelloWorld/

1ifndef_Included_HelloWorld

2define_Included_HelloWorld

3ifdef__cplusplus

extern"C"{

1endif

/

Class:HelloWorld

Method:displayHelloWorld

Signature:()V

/

JNIEXPORTvoidJNICALLJava_HelloWorld_displayHelloWorld(JNIEnv,jobject);

1ifdef__cplusplus

}

1endif

2endif

(这里我们可以这样理解:这个h文件相当于我们在java里面的接口,这里声明了一个Java_HelloWorld_displayHelloWorld(JNIEnv,jobject);方法,然后在我们的本地方法里面实现这个方法,也就是说我们在编写C/C++程序的时候所使用的方法名必须和这里的一致)。

4)编写本地方法实现和由javah命令生成的头文件里面声明的方法名相同的方法。

代码2:

1#include"jnih"

2#include"HelloWorldh"

3//#includeotherheaders

4JNIEXPORTvoidJNICALLJava_HelloWorld_displayHelloWorld(JNIEnvenv,jobjectobj)

{

printf("Helloworld!\n");

return;

}

注意代码2中的第1行,需要将jnih(该文件可以在%JAVA_HOME%/include文件夹下面找到)文件引入,因为在程序中的JNIEnv、jobject等类型都是在该头文件中定义的;另外在第2行需要将HelloWorldh头文件引入(我是这么理解的:相当于我们在编写java程序的时候,实现一个接口的话需要声明才可以,这里就是将HelloWorldh头文件里面声明的方法加以实现。当然不一定是这样)。然后保存为HelloWorldImplc就ok了。

5)生成动态库

这里以在Windows中为例,需要生成dll文件。在保存HelloWorldImplc文件夹下面,使用VC的编译器cl成。cl-I%java_home%\include-I%java_home%\include\win32-LDHelloWorldImpc-Fehellodll注意:生成的dll文件名在选项-Fe后面配置,这里是hello,因为在HelloWorldjava文件中我们loadLibary的时候使用的名字是hello。当然这里修改之后那里也需要修改。另外需要将-I%java_home%\include-I%java_home%\include\win32参数加上,因为在第四步里面编写本地方法的时候引入了jnih文件。

6)运行程序javaHelloWorld就ok

---------------------------------------------------------------

下面是一个简单的例子实现打印一句话的功能,但是用的c的printf最终实现。一般提供给java的jni接口包括一个so文件(封装了c函数的实现)和一个java文件(需要调用path的类)。

1.JNI的目的是使java方法中能够调用c实现的一些函数,比如以下的java类,就需要调用一个本地函数testjni(一般声明为privatenative类型),首先需要创建文件weiqiongjava,内容如下:

classweiqiong{static{SystemloadLibrary("testjni");//载入静态库,test函数在其中实现}privatenativevoidtestjni();//声明本地调用publicvoidtest(){testjni();}publicstaticvoidmain(Stringargs[]){weiqionghaha=newweiqiong();hahatest();}}

2.然后执行javacweiqiongjava,如果没有报错,会生成一个weiqiongclass。

3.然后设置classpath为你当前的工作目录,如直接输入命令行:setclasspath=weiqiongclass所在的完整目录(如c:\test)再执行javahweiqiong,会生成一个文件weiqiongh文件,其中有一个函数的声明如下:

JNIEXPORTvoidJNICALLJava_weiqiong_testjni(JNIEnv,jobject);

4.创建文件testjnic将上面那个函数实现,内容如下:

1include

2include

JNIEXPORTvoidJNICALLJava_weiqiong_testjni(JNIEnvenv,jobjectobj){printf("haha---------gointoc!!!\n");}

5.为了生成so文件,创建makefile文件如下:

libtestjniso:testjniomakefilegcc-Wall-rdynamic-shared-olibtestjnisotestjniotestjnio:testjnicweiqionghgcc-Wall-ctestjnic-I/-I/usr/java/j2sdk140/include-I/usr/java/j2sdk140/include/linuxcl:rm-rfoso注意:gcc前面是tab空,j2sdk的目录根据自己装的j2sdk的具体版本来写,生成的so文件的名字必须是loadLibrary的参数名前加“lib”。

6.exportLD_LIBRARY_PATH=,由此设置library路径为当前目录,这样java文件才能找到so文件。一般的做法是将so文件copy到本机的LD_LIBRARY_PATH目录下。

7.执行javaweiqiong,打印出结果:“haha---------gointoc!!!”

Java 实现聊天室可以分为以下几个步骤:

建立服务器端

首先需要建立一个服务器端,负责接收客户端的连接请求并处理客户端发送过来的消息。

建立客户端

然后需要建立客户端,客户端通过网络连接到服务器端,并向服务器端发送消息。

实现通信协议

为了实现聊天室功能,需要定义一个通信协议,规定客户端和服务器端之间的通信格式,例如消息的头部和内容等。

实现多线程处理

聊天室通常会有多个用户同时在线,因此需要使用多线程来处理多个客户端的连接请求和消息传递。

实现GUI界面(可选)

为了方便用户使用,可以实现一个GUI界面,让用户可以方便地发送和接收消息。

以下是一个简单的 Java 聊天室的代码示例:

java

Copy code

// 服务器端代码

public class Server {

public static void main(String[] args) {

try {

ServerSocket serverSocket = new ServerSocket(8888);

while (true) {

Socket socket = serverSocketaccept();

new Thread(new ServerThread(socket))start();

}

} catch (IOException e) {

eprintStackTrace();

}

}

}

class ServerThread implements Runnable {

private Socket socket;

private BufferedReader reader;

private PrintWriter writer;

public ServerThread(Socket socket) {

thissocket = socket;

try {

reader = new BufferedReader(new InputStreamReader(socketgetInputStream()));

writer = new PrintWriter(socketgetOutputStream());

} catch (IOException e) {

eprintStackTrace();

}

}

public void run() {

try {

String msg;

while ((msg = readerreadLine()) != null) {

// 处理客户端发送过来的消息

Systemoutprintln("接收到消息:" + msg);

// 将消息发送给所有客户端

for (Socket s : ServerThreadListgetList()) {

if (s != socket) {

PrintWriter w = new PrintWriter(sgetOutputStream());

wprintln(msg);

wflush();

}

}

}

// 关闭连接

socketclose();

ServerThreadListremoveThread(this);

} catch (IOException e) {

eprintStackTrace();

}

}

}

class ServerThreadList {

private static List

list = new ArrayList<>();

public static void addThread(ServerThread thread) {

listadd(thread);

}

public static void removeThread(ServerThread thread) {

listremove(thread);

}

public static List

getList() {

return list;

}

}

// 客户端代码

public class Client {

public static void main(String[] args) {

try {

Socket socket = new Socket("localhost", 8888);

new Thread(new ClientThread(socket))start();

BufferedReader reader = new BufferedReader(new InputStreamReader(Systemin));

PrintWriter writer = new PrintWriter(socketgetOutputStream());

while (true) {

String msg = readerreadLine();

writerprintln(msg);

writerflush();

}

} catch (IOException e) {

eprintStackTrace();

}

}

}

class ClientThread implements Runnable {

private Socket socket;

private BufferedReader reader;

public ClientThread(Socket socket) {

thissocket = socket;

try {

reader

要搭建一个Java多人聊天应用程序,您需要按照以下步骤进行 *** 作:

设计用户界面:设计聊天界面,包括消息列表、输入框、发送按钮等组件。

建立服务器:在云服务商或自己的服务器上建立一个服务器,用于存储和转发消息。您可以选择使用现有的聊天服务器,如Firebase Realtime Database、Google Cloud Messaging、XMPP等,也可以自己编写服务器端代码。

登录和注册:在应用中实现用户登录和注册功能,以便用户可以使用应用。

建立Socket连接:使用Socket API建立与服务器的Socket连接。您可以使用Java中的Socket或Android中的Socket类来建立连接。

发送消息:在应用中实现发送消息的功能。当用户在应用中输入一条消息并点击发送按钮时,应用将该消息发送到服务器。

接收消息:使用Socket API监听服务器发送的消息。当服务器有新消息时,应用将其接收并显示在消息列表中。

处理消息:在应用中处理接收到的消息。当应用接收到一条消息时,它需要将消息保存到本地数据库中,并更新消息列表。

实现通知:当应用在后台运行时,您需要使用通知来通知用户有新消息到达。您可以使用Android中的通知API来实现通知功能。

实现其他功能:您可能还需要实现其他功能,如消息撤回、表情符号、和文件发送等。

需要注意的是,聊天应用中的数据传输需要使用安全的方式进行,以确保用户数据不被窃取。您可以使用SSL或TLS等安全协议来保护数据传输。

同时,为了实现多人聊天,您需要在服务器端实现广播机制,将消息广播到所有连接的客户端。在Java中,您可以使用多线程来实现广播机制,每个客户端连接都在单独的线程中运行。当服务器接收到一条消息时,它将该消息发送到所有客户端连接的线程中,以便广播到所有客户端。

以上是搭建Java多人聊天应用程序的基本步骤,具体实现方式因应用需求和技术选择而异。

以上就是关于用java编写多人聊天室程序,不需要太复杂求大神发给我,最好能运行,有源代码。谢谢了全部的内容,包括:用java编写多人聊天室程序,不需要太复杂求大神发给我,最好能运行,有源代码。谢谢了、Java远程方法调用(1)、救,air调用本地java程序和远程java怎么实现等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10625483.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存