用java编写一个多人聊天室可以 实现私聊,群聊,文件传送的功能

用java编写一个多人聊天室可以 实现私聊,群聊,文件传送的功能,第1张

你这就整麻烦了,如果你只是想实现这些功能,不要求速度也不要存储空间,也不要求有界面那还比较简单,实体类序列化所有传送对象,在socket类中用object流直接传和接收所有的东西(包括聊天信息和文件)再用多线程实现群聊大概两三天可以搞定

如果你像做得类似于QQ一样,那就不是几天的事情了

这个是客户端

import javanet;

import javaio;

import javaawt;

import javaawtevent;

public class client extends Frame implements ActionListener{

int i=1;Frame f;

TextField ip,port;

Label Lip,Lport;

Button connect,exit;

public static void main(String args[])

{client c1 = new client();

c1init();

}

public void init()

{

f=new Frame("client connection");

fsetLayout(new FlowLayout());

ip =new TextField("localhost");

port =new TextField("8189",5);

Lip=new Label("ip address");

Lport=new Label("port");

connect=new Button("connect");

exit=new Button("exit");

connectaddActionListener(this);

exitaddActionListener(this);

fadd(Lip);

fadd(ip);

fadd(Lport);

fadd(port);

fadd(connect);

fadd(exit);

fsetSize(500,60);

fsetVisible(true);

}

public void actionPerformed(ActionEvent e){

if(egetSource()==exit)

Systemexit(0);

if(egetSource()==connect)

{

new Thread(new threadclient(ipgetText(),portgetText(),i))start();

i++;

}

}

}

class threadclient extends Frame implements Runnable,ActionListener{

String ip,port;

int no;

Frame f;

TextArea ta;

TextArea name;

TextField tf;

Button send,bye;

InputStream ins;

Socket s;

PrintStream out1;

BufferedReader in;

BufferedWriter out;

threadclient(String n,String m,int i)

{

ip=n;

port=m;

no=i;

}

public void run(){

f=new Frame("client NO" +no);

fsetLayout(new FlowLayout());

ta=new TextArea("",10,30,TextAreaSCROLLBARS_BOTH);

tf=new TextField("",20);

send=new Button("send");

bye=new Button("bye");

sendaddActionListener(this);

byeaddActionListener(this);

fadd(ta);

fadd(tf);

fadd(send);

fadd(bye);

fsetSize(300,300);

fsetVisible(true);

Integer tmp=new Integer(port);

int portint =tmpintValue();

try

{

s=new Socket(ip,portint);

in=new BufferedReader(new InputStreamReader(sgetInputStream()));

out1=new PrintStream(sgetOutputStream());

taappend(inreadLine()+"\n");

}catch(Exception e)

{

Systemoutprintln(egetMessage()+" ss");

}

}

public void send(String txt){

try{

out1println(txt);

out1flush();

taappend(inreadLine()+"\n");

}catch(IOException e)

{

Systemoutprintln(egetMessage()+"send");

}

}

public void actionPerformed(ActionEvent e){

if(egetSource()==bye){

send("BYE");

Systemexit(0);

}

if (egetSource()==send)

send(tfgetText());

}

}

这个是服务器

import javaawtButton;

import javaawtFlowLayout;

import javaawtFrame;

import javaawtTextArea;

import javaawtTextField;

import javaawteventActionEvent;

import javaawteventActionListener;

import javaio;

import javaio;

import javanetServerSocket;

import javanetSocket;

import javautilHashMap;

import javautilMap;

public class server {

private static Map<String,Socket> clientMap=new HashMap<String,Socket>();

public static void main(String[] args) {

int i = 1;

try {

ServerSocket s = new ServerSocket(8189);

for (;;) {

Socket incoming = saccept();

Systemoutprintln("连接成功" + i);

ThreadedEchoHandler teh=new ThreadedEchoHandler(incoming, i);

tehstart();

String name=tehgetClientname();

clientMapput(name,incoming);

i++;

}

} catch (Exception e) {

Systemoutprintln(e);

}

}

}

class ThreadedEchoHandler extends Thread {

Frame f;

TextArea ta;

TextField tf;

Button send, bye;

InputStream ins;

Socket s;

PrintStream out1;

BufferedReader in;

PrintWriter out;

public ThreadedEchoHandler(Socket i, int c) {

incoming = i;

counter = c;

f=new Frame("server");

fsetLayout(new FlowLayout());

ta=new TextArea("",10,30,TextAreaSCROLLBARS_BOTH);

tf=new TextField("",20);

send=new Button("send");

bye=new Button("bye");

sendaddActionListener(new ActionListener(){

@Override

public void actionPerformed(ActionEvent arg0) {

send(tfgetText());

}

});

byeaddActionListener(new ActionListener(){

@Override

public void actionPerformed(ActionEvent arg0) {

send("bye");

}

});

fadd(ta);

fadd(tf);

fadd(send);

fadd(bye);

fsetSize(300,300);

fsetVisible(true);

}

public String getClientname() {

try {

in = new BufferedReader(new InputStreamReader(

incominggetInputStream()));

out = new PrintWriter(incominggetOutputStream(), true);

return inreadLine();

} catch (IOException e) {

Systemoutprintln(egetMessage()+"get");

}

return null;

}

public void send(String context){

outprintln(context);

outflush();

}

public void run() {

try {

boolean done = false;

while (!done) {

String str = inreadLine();

if (str == null)

done = true;

else {

outprintln("Echo(" + counter + "):" + str);

taappend("Echo(" + counter + "):" + str+"\n");

if (strtrim()equals("BYE"))

done = true;

}

}

incomingclose();

} catch (Exception e) {

Systemoutprintln(egetMessage()+"run");

}

}

private Socket incoming;

private int counter;

}

这个鸟东西是个新手写的。唉,太烂了,我无力吐槽。

这是很久以前在网上找的,略作修改的一个小案例UDP聊天的,供你参考,改改里面的ip地址。

import javaioBufferedReader;

import javaioIOException;

import javaioInputStreamReader;

import javanetDatagramPacket;

import javanetDatagramSocket;

import javanetInetSocketAddress;

public class UDPClient {

public static void main(String[] args) throws IOException {

new UDPClient()go();

}

private void go() {

ClientSendThread send = new ClientSendThread();

new Thread(send)start();

ClientRecvThread recv = new ClientRecvThread();

new Thread(recv)start();

}

class ClientSendThread implements Runnable {

@Override

public void run() {

try {

DatagramSocket ds = new DatagramSocket();

String str = "";

byte[] buf = null;

while (true) {

Systemoutprintln("请输入>");

BufferedReader br = new BufferedReader(

new InputStreamReader(Systemin));

str = brreadLine();

if ("bye"equals(str))

break;

buf = strgetBytes();

// Systemoutprintln("-----buflength-------" + buflength);

DatagramPacket dp = new DatagramPacket(buf, buflength,

new InetSocketAddress("127001", 5678));

dssend(dp);

buf = null;

}

dsclose();

} catch (IOException e) {

eprintStackTrace();

}

}

}

class ClientRecvThread implements Runnable {

@Override

public void run() {

byte[] buf = new byte[1024];

//接收端的端口需要指定,不然发送端不知道向哪个端口发送数据包

DatagramSocket ds;

try {

ds = new DatagramSocket(5679);

String message = "";

DatagramPacket dp = null;

while(true){

dp = new DatagramPacket(buf, buflength);

dsreceive(dp);

message = new String(buf,0,dpgetLength());

Systemoutprintln("接收到Server端信息为:"+message);

}

} catch (IOException e) {

eprintStackTrace();

}

}

}

}

import javaioBufferedReader;

import javaioIOException;

import javaioInputStreamReader;

import javanetDatagramPacket;

import javanetDatagramSocket;

import javanetInetSocketAddress;

public class UDPServer {

public static void main(String[] args) throws IOException {

new UDPServer()go();

}

private void go() {

//服务端启动2个线程,1个发送,1个接收

ServerSendThread send = new ServerSendThread();

new Thread(send)start();

ServerRecvThread recv = new ServerRecvThread();

new Thread(recv)start();

}

// 服务端发送线程

class ServerSendThread implements Runnable{

@Override

public void run() {

try {

DatagramSocket ds = new DatagramSocket();

String str = "";

byte[] buf = null;

while (true) {

Systemoutprintln("请输入>");

BufferedReader br = new BufferedReader(

new InputStreamReader(Systemin));

str = brreadLine();

if ("bye"equals(str))

break;

buf = strgetBytes();

DatagramPacket dp = new DatagramPacket(buf, buflength,

new InetSocketAddress("1921632061", 5679));

dssend(dp);

buf = null;

}

dsclose();

} catch (IOException e) {

eprintStackTrace();

}

}

}

// 服务端接收线程

class ServerRecvThread implements Runnable{

@Override

public void run() {

byte[] buf = new byte[1024];

//接收端的端口需要指定,不然发送端不知道向哪个端口发送数据包

DatagramSocket ds;

try {

ds = new DatagramSocket(5678);

String message = "";

while(true){

DatagramPacket dp = new DatagramPacket(buf, buflength);

dsreceive(dp);

message = new String(buf,0,dpgetLength());

Systemoutprintln("接收到Client端的信息为:"+message);

}

} catch (IOException e) {

eprintStackTrace();

}

}

}

}

两路音视频流,符合以下条件才能混合:

格式相同,要解压成 PCM 格式。

采样率相同,要转换成相同的采样率。主流采样率包括:16k Hz、32k Hz、441k Hz 和 48k Hz。

帧长相同,帧长由编码格式决定,PCM 没有帧长的概念,开发者自行决定帧长。为了和主流音频编码格式的帧长保持一致,推荐采用 20ms 为帧长。

位深(Bit-Depth)或采样格式 (Sample Format) 相同,承载每个采样点数据的 bit 数目要相同。

声道数相同,必须同样是单声道或者双声道 (立体声)。这样,把格式、采样率、帧长、位深和声道数对齐了以后,两个音频流就可以混合了。

JAVA代码问题可以到即构开发者中心看看

呵呵,楼主您好!要用Java做聊天室说简单也不简单,但是说难呢也不难

说简单点,就是会话跟踪技术(我个人这样理解)要做聊天室,您需要

使用到的工具: tomcat 服务器(因为是免费的,其他也可以哦,呵呵)

Myeclipse(sun公司提供的编写Java程序的工具,别说你不知道哈,

哪样的话我就晕倒了哦,呵呵)

页面框架的设计:indexjsp(聊天室主页面)index_topjsp(聊天室的顶部页面)

usersonlinejsp(在线人数的统计及显示页面) sendMessagejsp(发送信息的页面)

showMessagejsp(显示聊天信息的页面)registerjsp(用户注册的页面)

loginjsp(用户登录页面)

当然,这是最简单的设计方式咯您也可以设计得更好点

页面介绍与功能:

indexjsp 主要是聊天室的主页面由上中下3个框架组成,中间部分在分为

左右2个框架实际上indexjsp就是一个由于5个框架组成的页面

顶部框架:放index_topjsp页面可以设计自己聊天室的特色(比如说:logo)

中间部分的左边框架:showMessagejsp 显示聊天的信息

中间部分的右边框架:usersonlinejsp(在线人数的统计及显示页面)

底部框架:sendMessagejsp 这个发送信息的jsp页面不多说吧

聊天室的框架的设计大楷就是这样子咯

实现聊天:

1编写一个servlet,用户处理的信息(包括验证用户是否登录和聊天信息)。

2用户发送信息之后,将发送的信息存放到Application中(群聊)(放在session中就是私聊)

3显示信息的页面每个XX秒中获取session或者Application中的数据显示出来就OK了

更多的东西还是需要您学习Ajax之后再做,会有不一样的效果哦。祝您成功哟呵呵

以上就是关于用java编写一个多人聊天室可以 实现私聊,群聊,文件传送的功能全部的内容,包括:用java编写一个多人聊天室可以 实现私聊,群聊,文件传送的功能、求一个用JAVA写的网络编程的网络聊天系统,能够实现两个人聊天信息收发。、用java语言实行一个UDP聊天室 多客户 无图形用户界面等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9515166.html

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

发表评论

登录后才能评论

评论列表(0条)

保存