聊天具体是这么聊,聊天室、群聊、一对一。java其实websocket足矣,ws服务器部署起来,客户端程序连接ws服务器服务,用服务器转发作为消息传输机制,当然你要大文件传输和视频通话就用socket转发连接,p2p通信,这里的p2pjava因为都是服务器部署,不需要做外网打洞穿透,因为web服务器他是本地环境,明白不。你用windows应用程序就需要外网穿透打洞,你不可能视频数据也让服务器转发吧,聊天人数越来越多,服务器承受不了,它需要服务器指派点对点单向传输,不去途径服务器。
Java多人聊天可以使用Java的Socket编程实现,主要的思路是:使用服务器来维护所有客户端的连接,并将客户端之间的聊天信息进行转发。
具体的实现步骤如下:
创建服务器端:使用ServerSocket类创建一个服务器端,并监听指定的端口,等待客户端的连接。
创建客户端:使用Socket类创建一个客户端,并连接到服务器端。
实现聊天功能:客户端和服务器端之间可以通过输入和输出流进行通信,客户端将聊天信息发送给服务器,服务器再将其转发给其他客户端。
处理异常:在实现聊天功能时,需要注意处理可能出现的异常,例如连接异常、输入输出异常等等。
一个简单的Java多人聊天程序的代码框架如下:
服务器端:
import javaioIOException;
import javanetServerSocket;
import javanetSocket;
import javautilArrayList;
public class ChatServer {
private ServerSocket serverSocket;
private ArrayList<ClientHandler> clients;
public ChatServer(int port) throws IOException {
serverSocket = new ServerSocket(port);
clients = new ArrayList<ClientHandler>();
Systemoutprintln("服务器已启动,等待客户端连接");
}
public void start() throws IOException {
while (true) {
Socket socket = serverSocketaccept();
ClientHandler client = new ClientHandler(socket, this);
clientsadd(client);
clientstart();
}
}
public void broadcast(String message) {
for (ClientHandler client : clients) {
clientsendMessage(message);
}
}
public void removeClient(ClientHandler client) {
clientsremove(client);
}
public static void main(String[] args) throws IOException {
ChatServer server = new ChatServer(12345);
serverstart();
}
}
客户端:
import javaioBufferedReader;
import javaioIOException;
import javaioInputStreamReader;
import javaioPrintWriter;
import javanetSocket;
public class ChatClient {
private Socket socket;
private BufferedReader reader;
private PrintWriter writer;
private String name;
public ChatClient(String serverAddress, int port, String name) throws IOException {
socket = new Socket(serverAddress, port);
reader = new BufferedReader(new InputStreamReader(socketgetInputStream()));
writer = new PrintWriter(socketgetOutputStream(), true);
thisname = name;
}
public void start() throws IOException {
Systemoutprintln("欢迎来到聊天室!");
new Thread(new IncomingMessageHandler())start();
new Thread(new OutgoingMessageHandler())start();
}
private class IncomingMessageHandler implements Runnable {
@Override
public void run() {
try {
while (true) {
String message = readerreadLine();
if (message == null) {
break;
}
Systemoutprintln(message);
}
} catch (IOException e) {
eprintStackTrace();
} finally {
close();
}
}
}
private class OutgoingMessageHandler implements Runnable {
@Override
public void run() {
BufferedReader reader = new BufferedReader(new InputStreamReader(Systemin));
try {
while (true) {
String message = readerreadLine();
if (messageequals("quit")) {
break;
}
writerprintln(name + ": " + message);
}
} catch (IOException e) {
eprintStackTrace;
} finally {
close();
}
}
}
Java聊天室的实现需要涉及到以下几个关键点:
服务器端和客户端的通信
服务器端的多线程处理
消息的广播和接收
在Java聊天室中,服务器端充当消息中心的角色,处理所有客户端的消息,并将消息广播给所有连接的客户端。以下是Java聊天室的大致实现过程:
服务器端和客户端的通信
使用Java Socket API实现服务器端和客户端之间的TCP/IP通信。服务器端监听客户端连接请求,并为每个客户端创建一个独立的Socket连接。客户端通过Socket连接与服务器端通信。
服务器端的多线程处理
为了支持多个客户端同时连接,服务器端需要使用多线程处理。当一个客户端连接时,服务器端会创建一个新的线程来处理该客户端的消息。这样就可以支持多个客户端并发地连接和通信。
消息的广播和接收
服务器端负责处理所有客户端发送的消息,并将消息广播给所有连接的客户端。当服务器收到消息时,将该消息发送给所有连接的客户端,让客户端更新自己的聊天界面。每个客户端也可以接收其他客户端发送的消息,并将其显示在自己的聊天界面中。
除此之外,Java聊天室的实现还需要考虑一些其它的问题,比如安全性、稳定性、可扩展性等。因此,在实现Java聊天室时,需要仔细考虑各种问题,并做出相应的解决方案。
实验1
Java开发工具及程序设计初步
实验目的
能够搭建Java的开发环境
熟悉常用的JDK *** 作命令的使用
熟悉Java程序的编写和编译过程
了解常用Java开发工具的使用
实验内容
实验练习1:搭建和使用JDK
1.JDK的下载和安装
JDK是SUN公司免费在网上发布的,我们可以进入SUN公司的网站(>
给你一个简单的实现吧,注意一定要先运行MyServerjava
//MyCilentjava
import javaio;
import javanet;
import javaxswing;
import javaawt;
import javaawtevent;
public class MyClient extends JFrame implements ActionListener{
JTextField tf;
JTextArea tx;
JButton bt;
PrintWriter out;
public MyClient(){
tf=new JTextField(20);
tx=new JTextArea();
txsetLineWrap(true);
txsetWrapStyleWord(true);
JPanel pan=new JPanel();
JScrollPane jsp=new JScrollPane(tx);
add(jsp,"Center");
bt=new JButton("SEND");
btaddActionListener(this);
panadd(tf);
panadd(bt);
add(pan,"South");
thisaddWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
Systemexit(0);
}
});
setTitle("THE CLIENT");
setSize(400,300);
setVisible(true);
try{
Socket socket=new Socket("127001",1680);
out=new PrintWriter(socketgetOutputStream(),true);
InputStreamReader in = new InputStreamReader(socketgetInputStream());
BufferedReader sin=new BufferedReader(in);
String s;
while(true){
s=sinreadLine();
txappend("#Server Said#: "+s+"\n");
}
}catch(Exception e){
eprintStackTrace();
}
}
public void actionPerformed(ActionEvent e){
if(egetSource()==bt){
txappend("@Client Said@: "+tfgetText()+"\n");
outprintln(tfgetText());
tfsetText("");
}
}
public static void main(String[] args){
MyClient mct = new MyClient();
}
}
//MyServerjava
import javaio;
import javanet;
import javaxswing;
import javaawt;
import javaawtevent;
public class MyServer extends JFrame implements ActionListener{
JTextField tf;
JTextArea tx;
JButton bt;
JScrollPane jsp;
JPanel pan;
PrintWriter out;
public MyServer(){
tx=new JTextArea();
txsetLineWrap(true);
txsetWrapStyleWord(true);
jsp=new JScrollPane(tx);
tf=new JTextField(20);
bt=new JButton("SEND");
btaddActionListener(this);
pan=new JPanel();
panadd(tf);
panadd(bt);
add(pan,"South");
add(jsp,"Center");
thisaddWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
Systemexit(0);
}
});
setTitle("THE SERVER");
setSize(400,300);
setVisible(true);
try{
ServerSocket server = new ServerSocket(1680);
Socket socket = serveraccept();
InputStreamReader in = new InputStreamReader(socketgetInputStream());
BufferedReader sin=new BufferedReader(in);
out=new PrintWriter(socketgetOutputStream(),true);
while(true){
String s=sinreadLine();
txappend("@Client Said@: "+s+"\n");
}
}catch(Exception e){
eprintStackTrace();
}
}
public void actionPerformed(ActionEvent e){
if(egetSource()==bt){
String st = tfgetText();
txappend("#Server Said#: "+st+"\n");
outprintln(st);
tfsetText("");
}
}
public static void main(String[] args){
MyServer msr = new MyServer();
}
}
Java可以使用Socket编程实现聊天功能。Socket是一种网络通信协议,它可以在不同的主机之间传输数据。在聊天功能中,一般有客户端和服务器两个角色。
客户端是发送消息的一方,它需要创建一个Socket对象,指定要连接的服务器的IP地址和端口号。然后,客户端通过Socket对象的输入输出流向服务器发送和接收消息。在接收消息时,客户端需要启动一个线程不断监听服务器的消息,并将接收到的消息展示给用户。
服务器端则是接收和转发消息的一方。服务器需要创建一个ServerSocket对象,指定监听的端口号。当有客户端连接到服务器时,服务器通过Socket对象的输入输出流向客户端发送和接收消息。在接收到客户端的消息后,服务器需要将消息转发给其他客户端,以实现聊天室的功能。
需要注意的是,在聊天功能中,数据的传输是通过网络进行的,因此需要考虑数据传输的稳定性和安全性。例如,可以使用加密算法对聊天数据进行加密,确保聊天数据的安全性。此外,在多用户同时连接的情况下,还需要考虑服务器的并发处理能力。
客户端:
package chatroom;
import javaawt;
import javaawtevent;
import javanet;
import javaio;
import javaxswing;
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("聊天室客户端");
thissetSize(800,600);
thissetResizable(false);
conn=new JPanel();
text=new JPanel();
send=new JPanel();
thisgetContentPane()add(conn);
connsetBounds(0, 0, thisgetWidth(),50);
name=new JLabel("姓名:");
who=new JTextField();
con=new JButton("连接");
connsetLayout(null);
connadd(name);
namesetBounds(30, 10, 50, 25);
connadd(who);
whosetBounds(80, 10, 150, 25);
connadd(con);
consetBounds(250,10, 60, 25);
thisgetContentPane()add(text);
textsetBounds(0,50,thisgetWidth(),450);
textsetLayout(new BorderLayout());
jsp=new JScrollPane();
talk=new JTextArea();
jspgetViewport()setView(talk);
textadd(jsp,"Center");
talksetLineWrap(true);
thisgetContentPane()add(send);
sendsetLayout(null);
sendsetBounds(0, 480, thisgetWidth(), 150);
sendto=new JLabel("发送到:");
snd=new JButton("发送");
list=new JComboBox();
say=new JTextField();
clear=new JButton("清空");
sendadd(sendto);
sendtosetBounds(30, 525, 50, 25);
sendadd(list);
listsetBounds(100, 525, 75, 25);
sendadd(say);
saysetEditable(true);
saysetBounds(200, 525, 300, 25);
sendadd(snd);
sndsetBounds(520, 525, 100, 25);
sendadd(clear);
clearsetBounds(650, 525, 100, 25);
thissetDefaultCloseOperation(JFrameEXIT_ON_CLOSE);
thissetVisible(true);
conaddActionListener(this);
sndaddActionListener(this);
}
public void actionPerformed(ActionEvent ae) {
if (aegetActionCommand()equals("连接"))
{
try
{
client=new Socket(InetAddressgetLocalHost(),55555);
talkappend("连接成功\n");
consetText("断开");
is=clientgetInputStream();
os=clientgetOutputStream();
th=new Thread(this);
String id=whogetText();
byte b[]=idgetBytes();
DataOutputStream dos=new DataOutputStream(os);
int len=blength;
doswriteInt(len);
doswrite(b);
thstart();
}catch(Exception e){talkappend("连接失败\n"+etoString()+"0000");}
}
else if(aegetSource()==snd)
{
if(listgetSelectedItem()toString()=="所有人")
{
yousay="@open"+saygetText();
byte b[]=yousaygetBytes();
DataOutputStream dos=new DataOutputStream(os);
try{
int len=blength;
doswriteInt(len);
doswrite(b);
}catch(Exception e)
{
Systemoutprint(etoString()+"1111");
}
}
else
{
yousay="@whisper"+saygetText();
byte b[]=yousaygetBytes();
byte w[]=listgetSelectedItem()toString()getBytes();
DataOutputStream dos=new DataOutputStream(os);
try{
int len=blength;
int wlen=wlength;
doswriteInt(len); //内容
doswrite(b);
doswriteInt(wlen); //发送对象
doswrite(w);
}catch(Exception e)
{
Systemoutprint(etoString()+"AAAA");
}
}
}
else if(aegetActionCommand()equals("断开"))
{
try
{
clientclose();
talkappend("连接已断开\n");
consetText("连接");
}catch(Exception e){Systemoutprintln(etoString()+"2222");}
}
}
public void run()
{
while(true)
{
try
{
dis=new DataInputStream(is);
tof=disreadDouble();
if(tof==11)
{
dis=new DataInputStream(is);
int number;
listremoveAllItems();
listaddItem("所有人");
number=disreadInt();
for(int i=0;i<number;i++)
{
int len=disreadInt();
byte b[]=new byte[len];
disread(b);
String name=new String(b);
listaddItem(name);
}
}
else if(tof==22)
{
try
{
dis=new DataInputStream(is);
int len=disreadInt();
byte b[]=new byte[len];
disread(b);
receive=new String(b);
talkappend(receive+"\n");
}catch(Exception e){JOptionPaneshowMessageDialog(this, "连接已断开","消息",JOptionPaneINFORMATION_MESSAGE);break;}
}
}catch(Exception e){JOptionPaneshowMessageDialog(this, "连接已断开","消息",JOptionPaneINFORMATION_MESSAGE);break;}
}
}
public static void main(String[] args) {
client cl=new client();
}
}
服务端:
package chatroom;
import javaawt;
import javaxswing;
import javanet;
import javautilVector;
import javaio;
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("聊天室服务端");
thisgetContentPane()setLayout(new GridLayout(1,1));
thissetSize(400,300);
jp1=new JPanel();
jta=new JTextArea();
jsp=new JScrollPane();
thisgetContentPane()add(jp1);
jp1setLayout(new GridLayout(1,1));
jspgetViewport()setView(jta);
jp1add(jsp);
thissetDefaultCloseOperation(JFrameEXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
server sr=new server();
srsr=new Thread(sr);
srsrstart();
sendtoall sta=new sendtoall();
returnfrom rf=new returnfrom(sr);
returnto rt=new returnto(sr);
stastart();
rfstart();
rtstart();
}
public void run()
{
try
{
server=new ServerSocket(55555);
while(true)
{
socket=serveraccept();
is=socketgetInputStream();
DataInputStream dis=new DataInputStream(is);
int len=disreadInt();
byte b[]=new byte[len];
disread(b);
String id=new String(b);
record v=new record(id,socket);
oladdElement(v);
for (int i=0;i<olsize();i++)
{
if (olelementAt(i)equals(v))
{
no=i;
}
}
login=1;
s=id+"已来到聊天室!";
th[no]=new Thread(new receive(this,no));
th[no]start();
}
}catch(Exception e){Systemoutprintln(etoString()+"aaaa");}
}
}
class receive implements Runnable
{
InputStream is;
OutputStream os;
server sr;
Socket sk;
int i;
String name;
String ip;
receive(server sr,int i)
{
thissr=sr;
thisi=i;
sk=((record)srolelementAt(i))ip;
name=((record)srolelementAt(i))name;
ip=((record)srolelementAt(i))ipgetInetAddress()toString();
}
public void run()
{
while(true)
{
try
{
is=skgetInputStream();
DataInputStream dis=new DataInputStream(is);
int len=disreadInt();
byte b[]=new byte[len];
disread(b);
String abc=new String(b);
srjtaappend(abc);
if(abcsubstring(0,5)equals("@open"))
{
servers=name+"["+ipsubstring(1, iplength())+"]"+"说:"+abcsubstring(5,abclength());
srjtaappend(servers+"\n");
}
else if(abcsubstring(0,8)equals("@whisper"))
{
int wlen=disreadInt();
srw=new byte[wlen];
disread(srw);
serverto=new String(srw);
serverfrom=((record)srolelementAt(i))name;
String ip=((record)srolelementAt(i))ipgetInetAddress()toString();
// servers=serverfrom+"对"+serverto+"["+ipsubstring(1, iplength())+"]"+"悄悄地说:"+abcsubstring(8,abclength());
serverfromtext="你对"+serverto+"["+ipsubstring(1, iplength())+"]"+"悄悄地说:"+abcsubstring(8,abclength());
servertotext=serverfrom+"["+ipsubstring(1, iplength())+"]"+"对你悄悄地说:"+abcsubstring(8,abclength());
srjtaappend(servers+"\n");
}
}catch(Exception e)
{
try
{
DataOutputStream dos=new DataOutputStream(os);
serverolremoveElementAt(i);
servers=name+"已离开聊天室";
serverlogin=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(serverlogin==1)
{
number=0;
number=serverolsize();
dos=new DataOutputStream(os);
for(int i=0;i<serverolsize();i++)
{
st=((record)srolelementAt(i))ip;
os=stgetOutputStream();
dos=new DataOutputStream(os);
doswriteDouble(11);
doswriteInt(number);
for (int j=0;j<number;j++)
{
String name=((record)srolelementAt(j))name;
byte b[]=namegetBytes();
int len=blength;
doswriteInt(len);
doswrite(b);
}
}
serverlogin=0;
}
else if(!serversequals("")&&srolsize()>0)
{
b=serversgetBytes(); //String类型中 汉字占一个字节,但是byte类型中,汉字占两个字节
len=blength;
//len=serverslength();
//b=new byte[len];
//b=serversgetBytes();
for(int i=0;i<serverolsize();i++)
{
st=((record)srolelementAt(i))ip;
os=stgetOutputStream();
DataOutputStream dos=new DataOutputStream(os);
doswriteDouble(22);
doswriteInt(len);
doswrite(b);
}
servers="";
}
}catch(Exception e){Systemoutprintln(etoString()+"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)
{
thissr=sr;
}
public void run()
{
while(true)
{
if(!serverfromtextequals(""))
{
b=serverfromtextgetBytes();
len=blength;
srjtaappend(srfromtext);
try
{
for(int i=0;i<serverolsize();i++)
{
if(((record)srolelementAt(i))nameequals(serverfrom))
{
st=((record)srolelementAt(i))ip;
os=stgetOutputStream();
DataOutputStream dos=new DataOutputStream(os);
doswriteDouble(22);
doswriteInt(len);
doswrite(b);
}
}
}catch(Exception e){Systemoutprintln(etoString()+">
以上就是关于java聊天功能怎么做的有没有知道的可以指导一下吗全部的内容,包括:java聊天功能怎么做的有没有知道的可以指导一下吗、java多人聊天一般都是怎么搭建的、java聊天室是怎么实现的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)