客户端:
package chatroom;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import javax.swing.*;
public class client extends JFrame implements ActionListener,Runnable{
JPanel conn,text,send;
JLabel name,sendto;
JComboBox list;
JButton con,snd,clear;
JTextArea talk;
JTextField who,say;
jscrollPane jsp;
Socket client;
InputStream is;
OutputStream os;
PrintStream ps;
BufferedReader br;
String receive,yousay;
Thread th;
DataInputStream dis;
Double tof;
client()
{
super("聊天室客户端");
this.setSize(800,600);
this.setResizable(false);
conn=new JPanel();
text=new JPanel();
send=new JPanel();
this.getContentPane().add(conn);
conn.setBounds(0, 0, this.getWidth(),50);
name=new JLabel("姓名:");
who=new JTextField();
con=new JButton("连接");
conn.setLayout(null);
conn.add(name);
name.setBounds(30, 10, 50, 25);
conn.add(who);
who.setBounds(80, 10, 150, 25);
conn.add(con);
con.setBounds(250,10, 60, 25);
this.getContentPane().add(text);
text.setBounds(0,50,this.getWidth(),450);
text.setLayout(new BorderLayout());
jsp=new JScrollPane();
talk=new JTextArea();
jsp.getViewport().setView(talk);
text.add(jsp,"Center");
talk.setLineWrap(true);
this.getContentPane().add(send);
send.setLayout(null);
send.setBounds(0, 480, this.getWidth(), 150);
sendto=new JLabel("发送到:");
snd=new JButton("发送");
list=new JComboBox();
say=new JTextField();
clear=new JButton("清空");
send.add(sendto);
sendto.setBounds(30, 525, 50, 25);
send.add(list);
list.setBounds(100, 525, 75, 25);
send.add(say);
say.setEditable(true);
say.setBounds(200, 525, 300, 25);
send.add(snd);
snd.setBounds(520, 525, 100, 25);
send.add(clear);
clear.setBounds(650, 525, 100, 25);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
con.addActionListener(this);
snd.addActionListener(this);
}
public void actionPerformed(ActionEvent ae) {
if (ae.getActionCommand().equals("连接"))
{
try
{
client=new Socket(InetAddress.getLocalHost(),55555);
talk.append("连接成功...\n");
con.setText("断开");
is=client.getInputStream();
os=client.getOutputStream();
th=new Thread(this);
String id=who.getText();
byte b[]=id.getBytes();
DataOutputStream dos=new DataOutputStream(os);
int len=b.length;
dos.writeInt(len);
dos.write(b);
th.start();
}catch(Exception e){talk.append("连接失败\n"+e.toString()+"0000");}
}
else if(ae.getSource()==snd)
{
if(list.getSelectedItem().toString()=="所有人")
{
yousay="@open"+say.getText();
byte b[]=yousay.getBytes();
DataOutputStream dos=new DataOutputStream(os);
try{
int len=b.length;
dos.writeInt(len);
dos.write(b);
}catch(Exception e)
{
System.out.print(e.toString()+"1111");
}
}
else
{
yousay="@whisper"+say.getText();
byte b[]=yousay.getBytes();
byte w[]=list.getSelectedItem().toString().getBytes();
DataOutputStream dos=new DataOutputStream(os);
try{
int len=b.length;
int wlen=w.length;
dos.writeInt(len); //内容
dos.write(b);
dos.writeInt(wlen); //发送对象
dos.write(w);
}catch(Exception e)
{
System.out.print(e.toString()+"AAAA");
}
}
}
else if(ae.getActionCommand().equals("断开"))
{
try
{
client.close();
talk.append("连接已断开\n");
con.setText("连接");
}catch(Exception e){System.out.println(e.toString()+"2222");}
}
}
public void run()
{
while(true)
{
try
{
dis=new DataInputStream(is);
tof=dis.readDouble();
if(tof==1.1)
{
dis=new DataInputStream(is);
int number;
list.removeAllItems();
list.addItem("所有人");
number=dis.readInt();
for(int i=0;i<number;i++)
{
int len=dis.readInt();
byte b[]=new byte[len];
dis.read(b);
String name=new String(b);
list.addItem(name);
}
}
else if(tof==2.2)
{
try
{
dis=new DataInputStream(is);
int len=dis.readInt();
byte b[]=new byte[len];
dis.read(b);
receive=new String(b);
talk.append(receive+"\n");
}catch(Exception e){JOptionPane.showMessageDialog(this, "连接已断开","消息",JOptionPane.INFORMATION_MESSAGE);break;}
}
}catch(Exception e){JOptionPane.showMessageDialog(this, "连接已断开","消息",JOptionPane.INFORMATION_MESSAGE);break;}
}
}
public static void main(String[] args) {
client cl=new client();
}
}
服务端:
package chatroom;
import java.awt.*;
import javax.swing.*;
import java.net.*;
import java.util.Vector;
import java.io.*;
public class server extends JFrame implements Runnable{
JPanel jp1;
JTextArea jta;
JScrollPane jsp;
Socket socket=null;
ServerSocket server;
InputStream is;
OutputStream os;
static int i=0,login;
int no;
static String s="";
Thread sr;
Thread th[]=new Thread[20];
static Vector ol=new Vector();
static public byte w[]=null;
static String from=""; //人名
static String to="";
static String fromtext=""; //内容
static String totext="";
server()
{
super("聊天室服务端");
this.getContentPane().setLayout(new GridLayout(1,1));
this.setSize(400,300);
jp1=new JPanel();
jta=new JTextArea();
jsp=new JScrollPane();
this.getContentPane().add(jp1);
jp1.setLayout(new GridLayout(1,1));
jsp.getViewport().setView(jta);
jp1.add(jsp);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
server sr=new server();
sr.sr=new Thread(sr);
sr.sr.start();
sendtoall sta=new sendtoall();
returnfrom rf=new returnfrom(sr);
returnto rt=new returnto(sr);
sta.start();
rf.start();
rt.start();
}
public void run()
{
try
{
server=new ServerSocket(55555);
while(true)
{
socket=server.accept();
is=socket.getInputStream();
DataInputStream dis=new DataInputStream(is);
int len=dis.readInt();
byte b[]=new byte[len];
dis.read(b);
String id=new String(b);
record v=new record(id,socket);
ol.addElement(v);
for (int i=0;i<ol.size();i++)
{
if (ol.elementAt(i).equals(v))
{
no=i;
}
}
login=1;
s=id+"已来到聊天室!";
th[no]=new Thread(new receive(this,no));
th[no].start();
}
}catch(Exception e){System.out.println(e.toString()+"aaaa");}
}
}
class receive implements Runnable
{
InputStream is;
OutputStream os;
server sr;
Socket sk;
int i;
String name;
String ip;
receive(server sr,int i)
{
this.sr=sr;
this.i=i;
sk=((record)sr.ol.elementAt(i)).ip;
name=((record)sr.ol.elementAt(i)).name;
ip=((record)sr.ol.elementAt(i)).ip.getInetAddress().toString();
}
public void run()
{
while(true)
{
try
{
is=sk.getInputStream();
DataInputStream dis=new DataInputStream(is);
int len=dis.readInt();
byte b[]=new byte[len];
dis.read(b);
String abc=new String(b);
sr.jta.append(abc);
if(abc.substring(0,5).equals("@open"))
{
server.s=name+"["+ip.substring(1, ip.length())+"]"+"说:"+abc.substring(5,abc.length());
sr.jta.append(server.s+"\n");
}
else if(abc.substring(0,8).equals("@whisper"))
{
int wlen=dis.readInt();
sr.w=new byte[wlen];
dis.read(sr.w);
server.to=new String(sr.w);
server.from=((record)sr.ol.elementAt(i)).name;
String ip=((record)sr.ol.elementAt(i)).ip.getInetAddress().toString();
// server.s=server.from+"对"+server.to+"["+ip.substring(1, ip.length())+"]"+"悄悄地说:"+abc.substring(8,abc.length());
server.fromtext="你对"+server.to+"["+ip.substring(1, ip.length())+"]"+"悄悄地说:"+abc.substring(8,abc.length());
server.totext=server.from+"["+ip.substring(1, ip.length())+"]"+"对你悄悄地说:"+abc.substring(8,abc.length());
sr.jta.append(server.s+"\n");
}
}catch(Exception e)
{
try
{
DataOutputStream dos=new DataOutputStream(os);
server.ol.removeElementAt(i);
server.s=name+"已离开聊天室.";
server.login=1;
break;
}catch(Exception f){}
}
}
}
}
class sendtoall extends Thread
{
int len,number;
byte b[];
server sr;
Socket st;
OutputStream os;
DataOutputStream dos;
public void run()
{
while(true)
{
try
{
if(server.login==1)
{
number=0;
number=server.ol.size();
dos=new DataOutputStream(os);
for(int i=0;i<server.ol.size();i++)
{
st=((record)sr.ol.elementAt(i)).ip;
os=st.getOutputStream();
dos=new DataOutputStream(os);
dos.writeDouble(1.1);
dos.writeInt(number);
for (int j=0;j<number;j++)
{
String name=((record)sr.ol.elementAt(j)).name;
byte b[]=name.getBytes();
int len=b.length;
dos.writeInt(len);
dos.write(b);
}
}
server.login=0;
}
else if(!server.s.equals("")&&sr.ol.size()>0)
{
b=server.s.getBytes(); //String类型中 汉字占一个字节,但是byte类型中,汉字占两个字节
len=b.length;
//len=server.s.length();
//b=new byte[len];
//b=server.s.getBytes();
for(int i=0;i<server.ol.size();i++)
{
st=((record)sr.ol.elementAt(i)).ip;
os=st.getOutputStream();
DataOutputStream dos=new DataOutputStream(os);
dos.writeDouble(2.2);
dos.writeInt(len);
dos.write(b);
}
server.s="";
}
}catch(Exception e){System.out.println(e.toString()+"sdasd");}
}
}
}
class returnfrom extends Thread
{
int len,wlen;
byte b[];
byte w[];
server sr;
Socket st;
OutputStream os;
DataOutputStream dos;
//String from="",to="";
returnfrom(server sr)
{
this.sr=sr;
}
public void run()
{
while(true)
{
if(!server.fromtext.equals(""))
{
b=server.fromtext.getBytes();
len=b.length;
sr.jta.append(sr.fromtext);
try
{
for(int i=0;i<server.ol.size();i++)
{
if(((record)sr.ol.elementAt(i)).name.equals(server.from))
{
st=((record)sr.ol.elementAt(i)).ip;
os=st.getOutputStream();
DataOutputStream dos=new DataOutputStream(os);
dos.writeDouble(2.2);
dos.writeInt(len);
dos.write(b);
}
}
}catch(Exception e){System.out.println(e.toString()+"wwww");}
server.fromtext="";
server.from="";
}
}
}
}
class returnto extends Thread
{
int len,wlen;
byte b[];
byte w[];
server sr;
Socket st;
OutputStream os;
DataOutputStream dos;
//String from="",to="";
returnto (server sr)
{
this.sr=sr;
}
public void run()
{
while(true)
{
if(!server.totext.equals(""))
{
w=server.totext.getBytes();
wlen=w.length;
try
{
for(int i=0;i<server.ol.size();i++)
{
if(((record)sr.ol.elementAt(i)).name.equals(server.to))
{
st=((record)sr.ol.elementAt(i)).ip;
os=st.getOutputStream();
DataOutputStream dos=new DataOutputStream(os);
dos.writeDouble(2.2);
dos.writeInt(wlen);
dos.write(w);
}
}
}catch(Exception e){System.out.println(e.toString()+"wwww");}
server.totext="";
server.to="";
}
}
}
}
class record
{
String name;
Socket ip;
record(String id,Socket socket)
{
name=id;
ip=socket;
}
}
以前学习java时写的,是个在线聊天室只有群聊,私聊,上下线提示,搞不好里面还有错误- -其他功能自己看着加吧,你要的功能实在是很好很强大.
B. java实现聊天室功能难不难
我本身无法判断难不难,但是实现聊天室功能需要比较丰富的编程知识和技能,包括网络编程、线程管理明银、数据结构等方面的知识,同时需要考虑安全性、稳定性等因素,因此相对来说还是比较有挑战性的。需要考虑的要点如下:1. 通信协议选择和实现:网络编程中通常使用TCP或UDP协议实现数据传输,聊天室也需要选择合适的协议并进行实现。2. 用户管理和身份认证:聊天室需要实现用户注册、登录、退出等功能,并对用户身份进行合法性认证。3. 实现聊天室的基本功能:发送聊天内容、接收聊天内容、查弊槐租看在线用户列表等功能,还需要实现一些高级功能,例如发租兆送文件、语音消息等。4. 广播和私聊功能实现:聊天室需要实现广播功能,使得所有用户都能收到发送的消息,也需要实现私聊功能,使得用户可以与特定用户进行一对一聊天。5. 安全性防御功能实现:聊天室需要实现安全性防御功能,防止用户发送不良信息、泄露个人信息等,防范网络攻击等安全隐患。总体来说,实现聊天室需要多方面技术的支持,需要认真设计和实现,考虑到软件稳定、可靠、可扩展、易用等方面,是相对有挑战性的。C. 如何用C语言编写一个简单的聊天室程序
这样:
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <pthread.h>
#define MAXLINE 100;
void *threadsend(void *vargp);
void *threadrecv(void *vargp);
int main()
{
int *clientfdp;
clientfdp = (int *)malloc(sizeof(int));
*clientfdp = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in serveraddr;
struct hostent *hp;
bzero((char *)&serveraddr,sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(15636);
serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
if(connect(*clientfdp,(struct sockaddr *)&serveraddr,sizeof(serveraddr)) < 0){
printf("connect error ");
exit(1);
}
pthread_t tid1,tid2;
printf("connected ");
while(1){
pthread_create(&tid1,NULL,threadsend,clientfdp);
pthread_create(&tid2,NULL,threadrecv,clientfdp);
}
return EXIT_SUCCESS;
}
void *threadsend(void * vargp)
{
//pthread_t tid2;
int connfd = *((int *)vargp);
int idata;
char temp[100];
while(1){
//printf("me: ");
fgets(temp,100,stdin);
send(connfd,temp,100,0);
printf(" client send OK ");
}
printf("client send ");
return NULL;
}
void *threadrecv(void *vargp)
{
char temp[100];
int connfd = *((int *)vargp);
while(1){
int idata = 0;
idata = recv(connfd,temp,100,0);
if(idata > 0){
printf("server : %s ",temp);
}
}
return NULL;
}
注意事项
linux下编译多线程代码时,shell提示找不到 pthread_create函数,原因是 pthread.h不是linux系统默认加载的库文件,应该使用类似如下gcc命令进行编译:
gcc echoserver.c -lpthread -o echoserver
只要注意 -lpthread参数就可以了。
D. go语言聊天室实现(二)gorilla/websocket中的聊天室示例
我们可以看到 gorilla/websocket中的examples中有一个聊天室的demo。
我们进入该项目可以看到里面有这样的一些内容
按照官方的运行方式来运行这个项目差简
在浏览器中打开8080端口,可以看到该项目可以被成功运行了。
就是这样一个简单的demo。
然后我们去看一下它的具体实现。
在这个项目中首先定义了一个hub的结构体:
这个结构体中,clients代表所有已经注册的用户,broadcast管道会存储客户端发送来的信息。 register是一个*Client类型的管道,用于存储新注册的用户,unregister管道反之。
我们打开main.go,main函数的源码为:
在这里首先会新开一个goroutine,去跑hub的run方法,run方法中一个死循环,不停地去轮询hub中的内容
如果取到了新用户,就加入到clients中,如果闷唤取到了信息,就循环所有的client,将信息写到client.send中。
我们看到在请求路径为根的时候,它会请求一个函数,而这个函数就是将home.html发送到客户蚂庆凯端。
而在请求路径为“/ws”的时候,他会执行一个serveWS的函数。
每当一个新的用户进来之后,首先将连接升级为长连接,然后将当前的client写到register中,由hub.run函数去做处理。然后开启两个goroutine,一个去读client中发送来的数据,一个将数据写入到所有的client中,去发送给用户。
这就是整个聊天室的实现原理。
E. 怎么实现java一对一聊天室可以介绍一下吗
要实现Java一对一聊天室,可以使用Socket编程,以下是一个简单的实现步骤:
1.创建客户端和服务器端的Socket对象,分别用于连接客户端和服务器端;
2.在客户端和服务器端中分别创建输入和输出流,用于发送和接收消息;
3.实现客户端和服务器端的消息传递机制,即客户端芹埋轮和服务器端可以相互发送和接液慎收消息;
4.实现GUI,即为客户端创建一个用户界面,使得用户可以嫌信方便地输入和接收消息;
5.在代码中添加异常处理机制,以处理可能发生的异常情况。
F. 语音聊天系统源码的实现,离不开这些功能
语音聊天系统源码的实现,首先离不开的是它的基础功能——语音通话。
1、创建用户界面
根据场景的需要,为项目创建语音通话的用户界面。
2、获取设备权限
调用 checkSelfPermission 方法,在开启 Activity 时检查并获取 Android 移动设备的麦克风使用权限。
3、 初始化 RtcEngine
在调用其他 Agora API 前,需要创建并初始化 RtcEngine 对象。
将咐带获取到的 App ID 添加到 string.xml 文件中的 agora_app_id 一栏。调用 create 方法,传入获取到的 App ID,即可初始化 RtcEngine。
你还根据场景需要,在初始化时注册想要监听的回调事件,如远端用户下线或静音回调。注意不要在这些回调中进行 UI 操作。
语音聊天室平台源码还要覆盖社交、 娱乐 、直播、电商等多种泛互联网行业应用场景
语音聊天室平台源码可按需搭建直播系统,尤其是语音直播,是当下比较流行的直播产品,语音直播与其他直播不同点在于语音直播是通过声音传递,而无需出现在画面里,并且听众也不需要占用时间,可以边听直播边做其他,更加解放了双手双眼。语音聊天室平台源码的实时音视频能力保证了用户在房间内衡郑芦播放音乐的同时,实时语音沟通依旧流畅,同时提供包括耳返、变声的趣味化能力,保证最佳的K歌 娱乐 体验。
各类直播源码都少不了的社交动态
2、社交话题:语音社交系统源码用户在发布动态时,可以添加话题提高曝光度,也可以通过话题获取更多动态内容。
以上这些功能都是语音聊天系统源码需要实现的功能,在基础的语音聊天功能之上,还加入了互动和 娱乐 成分,带丛桐给用户丰富的体验。
G. 网上语音聊天系统的设计与实现
一度教育:给大学生更多求职力量
随着it高薪职业企业的迅速发展,it高薪职业教育人才需求量逐年攀升,it高薪职业教育人才的薪资也不断提高。但是很多高校的计算机相关专业的毕业生还是感到就业压力大、求职面试四处碰壁。原因之一,也是最重要的原因就是大学毕业之时,他们还不够专业。
相比之下,长沙一度教育学校给学生最大的帮助李升,就是优化他们的专业度,以此来解决就业难的问题。也许你会问我,为什么一度就可以声称自己是业内最专业的。可以这样说:一度教育专业的java软件工程师技术研发团队、项目经理团队和理论讲师团队,从项目采集、教材的自主研发和每年更新的项目实训,专业第一,集中力量专注java。同时,一度教育不仅教授java语言,还注重培训者在实训中掌握java web技术及java及时在网络上的应用,更加深入教授java框架技术;同时强调培训者java编程思腔碧想、创新能力的培养。实训后可以轻松担任大型企业的软件工程师、系统分析师、构架师和项目经理。
同时,即使大学生毕业时并不十分优秀,或还未掌握IT企业的应用技术,可以在毕业时先通过某些成熟的培训机构如长沙一度教育学习JAVA软件开伍扰举发知识和方法,掌握最新的技术,并通过大量项目实战积累项目经验,快速成长为优秀的软件开发人才。这些大型培训机构一般有较好的就业通道,为毕业学员提供就业推荐服务。通过努力学习,优秀毕业学员很有机会进入国内外一流IT企业工作。
H. 用C语言实现聊天室需要什么技术
实现聊天室涉及到通讯技术,网络技术,P2P技术,保密技术,用户交互界面技术等等。通讯技术方面要实现音视频语音对话的功能,用户交互界面需要根据用户的功能的需求和使用体验,制作出体验良好的界面。
每种技术都需要花费大量的时间精力学习。例如,在C语言里面,通讯技术里一般使用套接字Socket来实现。套接字是支持TCP/IP网络通信的基本操作单元。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口。