你这就整麻烦了,如果你只是想实现这些功能,不要求速度也不要存储空间,也不要求有界面那还比较简单,实体类序列化所有传送对象,在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聊天室 多客户 无图形用户界面等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)