多人聊天java代码,java多人聊天室

java编写多人聊天室中,如何在群聊里@xx,然后这条消息只发送给xx,其他人看不到

私聊功能跟你截屏的这段代码没有关系,首先你是多人聊天室,肯定要开连接池来解决线程问题,每个客户端都有自己对象创建的流,正常大家在公共聊天时,socket服务器向所有对象的流同一发送消息,当私聊时需要先找到对应对象的流,服务器单独向该流发送消息就可以实现私聊功能了。

成都创新互联主营惠来网站建设的网络公司,主营网站建设方案,成都App制作,惠来h5微信小程序开发搭建,惠来网站营销推广欢迎惠来等地区企业咨询

建议你在创建对象时,将每个对象的昵称和流存入一个map集合,私聊时通过昵称来找到对应的流。

java UDP 实现 多人聊天

UDP也可以和TCP那样遍历list然后发送啊

客户端向外面开一个UDP端口接受数据报

然后服务器这边要是有消息要发送就直接发送数据报包就可以了嘛

UDP都不用保持着连接的,比TCP还简单些

另外也可以用组播来实现,搜索下java UDP 组播,你能找到不少实例性的代码,也有聊天室的代码

如何用java做一个聊天小程序 要求使用图形用户界面,可以实现一个聊天室中多人聊天,也可以两人私聊,

给你一个简单的实现吧,注意一定要先运行MyServer.java

//MyCilent.java

import java.io.*;

import java.net.*;

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class MyClient extends JFrame implements ActionListener{

JTextField tf;

JTextArea tx;

JButton bt;

PrintWriter out;

public MyClient(){

tf=new JTextField(20);

tx=new JTextArea();

tx.setLineWrap(true);

tx.setWrapStyleWord(true);

JPanel pan=new JPanel();

JScrollPane jsp=new JScrollPane(tx);

add(jsp,"Center");

bt=new JButton("SEND");

bt.addActionListener(this);

pan.add(tf);

pan.add(bt);

add(pan,"South");

this.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){

System.exit(0);

}

});

setTitle("THE CLIENT");

setSize(400,300);

setVisible(true);

try{

Socket socket=new Socket("127.0.0.1",1680);

out=new PrintWriter(socket.getOutputStream(),true);

InputStreamReader in = new InputStreamReader(socket.getInputStream());

BufferedReader sin=new BufferedReader(in);

String s;

while(true){

s=sin.readLine();

tx.append("#Server Said#: "+s+"\n");

}

}catch(Exception e){

e.printStackTrace();

}

}

public void actionPerformed(ActionEvent e){

if(e.getSource()==bt){

tx.append("@Client Said@: "+tf.getText()+"\n");

out.println(tf.getText());

tf.setText("");

}

}

public static void main(String[] args){

MyClient mct = new MyClient();

}

}

//MyServer.java

import java.io.*;

import java.net.*;

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class MyServer extends JFrame implements ActionListener{

JTextField tf;

JTextArea tx;

JButton bt;

JScrollPane jsp;

JPanel pan;

PrintWriter out;

public MyServer(){

tx=new JTextArea();

tx.setLineWrap(true);

tx.setWrapStyleWord(true);

jsp=new JScrollPane(tx);

tf=new JTextField(20);

bt=new JButton("SEND");

bt.addActionListener(this);

pan=new JPanel();

pan.add(tf);

pan.add(bt);

add(pan,"South");

add(jsp,"Center");

this.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){

System.exit(0);

}

});

setTitle("THE SERVER");

setSize(400,300);

setVisible(true);

try{

ServerSocket server = new ServerSocket(1680);

Socket socket = server.accept();

InputStreamReader in = new InputStreamReader(socket.getInputStream());

BufferedReader sin=new BufferedReader(in);

out=new PrintWriter(socket.getOutputStream(),true);

while(true){

String s=sin.readLine();

tx.append("@Client Said@: "+s+"\n");

}

}catch(Exception e){

e.printStackTrace();

}

}

public void actionPerformed(ActionEvent e){

if(e.getSource()==bt){

String st = tf.getText();

tx.append("#Server Said#: "+st+"\n");

out.println(st);

tf.setText("");

}

}

public static void main(String[] args){

MyServer msr = new MyServer();

}

}

急求一个关于UDP的JAVA实现多人聊天源代码

import java.io.InputStream;

import java.io.DataInputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.DataOutputStream;

import java.io.BufferedReader;

import java.net.ServerSocket;

import java.net.Socket;

import java.io.IOException;

import java.util.Date;

class Server

{

public Server()

{

try

{

ServerSocket s=new ServerSocket(8888);

Socket ss=s.accept();

OutputStream out=ss.getOutputStream();

DataOutputStream dout=new DataOutputStream(out);

InputStream in=ss.getInputStream();

DataInputStream din=new DataInputStream(in);

System.out.print(din.readUTF()+"!");

dout.writeUTF("你已经连接到服务器"+"\t"+"你的地址:"+ss.getInetAddress()+"\t"

+"你的链接端口:"+ss.getLocalPort()+"\n");

new ReadMessage(din).start();

new SendMessage(dout).start();

}

catch (IOException e)

{

e.printStackTrace();

}

}

public static void main(String[] args)

{

new Server();

}

}

//接受客户端信息

class ReadMessage extends Thread

{

private DataInputStream din;

public ReadMessage(DataInputStream din)

{

this.din=din;

}

public void run()

{

String str;

try

{

while (true)

{

str=din.readUTF();

System.out.println(new Date().toLocaleString()+"客户端说:"+str);

if (str.equals("bye"))

{

System.out.println("客户端下线!");

break;

}

}

}

catch (IOException e)

{

e.printStackTrace();

}

}

}

// 发出服务器信息

class SendMessage extends Thread

{

private DataOutputStream dout;

public SendMessage(DataOutputStream dout)

{

this.dout=dout;

}

public void run()

{

InputStreamReader inr=new InputStreamReader(System.in);

BufferedReader buf=new BufferedReader(inr);

String str;

try

{

while(true)

{

str=buf.readLine();

dout.writeUTF(str);

if (str.equals("bye"))

{

System.out.println("服务器退出!");

System.exit(1);

}

}

}

catch (IOException e)

{

e.printStackTrace();

}

}

}

import java.io.InputStream;

import java.io.DataInputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.DataOutputStream;

import java.io.BufferedReader;

import java.net.Socket;

import java.io.IOException;

import java.util.Date;

class Client

{

public Client()

{

try

{

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

InputStream in=s.getInputStream();

DataInputStream din=new DataInputStream(in);

OutputStream out=s.getOutputStream();

DataOutputStream dout=new DataOutputStream(out);

dout.writeUTF("服务器你好!我是客户端");

System.out.println(din.readUTF());

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

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

}

catch (IOException e)

{

e.printStackTrace();

}

}

public static void main(String[] args)

{

new Client();

}

}

class ReaderMessage implements Runnable

{

private DataInputStream din;

public ReaderMessage(DataInputStream din)

{

this.din=din;

}

public void run()

{

String str;

try

{

while(true)

{

str=din.readUTF();

System.out.println(new Date().toLocaleString()+"服务器说:"+str);

if (str.equals("bye"))

{

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

break;

}

}

}

catch (IOException e)

{

e.printStackTrace();

}

}

}

class SenderMessage implements Runnable

{

private DataOutputStream dout;

public SenderMessage(DataOutputStream dout)

{

this.dout=dout;

}

public void run()

{

String str;

InputStreamReader inf=new InputStreamReader(System.in);

BufferedReader buf=new BufferedReader(inf);

try

{

while (true)

{

str=buf.readLine();

dout.writeUTF(str);

if (str.equals("bye"))

{

System.out.println("客户端自己退出!");

System.exit(1);

}

}

}

catch (IOException e)

{

e.printStackTrace();

}

}

}

用Java实现一个人和几个不同的人私聊,用Socket实现

package API_Day09;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.Socket;

import java.util.Scanner;

/**

* 控制台聊天程序

* 客户端应用程序

* @author Jacob

*

*/

public class chatClient

{

//客户端用于与服务端连接的Socket

private Socket clientSocket;

/**

* 构造方法,客户端初始化

*/

public chatClient()

{

try

{

/*

* socket(String host, int port)

* 地址: IP地址,用来定位网络上的计算机

* 端口: 用来找到远端计算机上用来连接的服务端应用程序

*/

clientSocket = new Socket("localhost",12580);

}

catch (Exception e)

{

e.printStackTrace();

}

}

/**

* 客户端昵称验证方法

* @param 为Scanner

*/

private void inputNickName(Scanner scan) throws Exception

{

String nickName = null;

//创建输出流

PrintWriter pw = new PrintWriter(

new OutputStreamWriter(clientSocket.getOutputStream(),

"UTF-8"),true);

//创建输入流

BufferedReader br = new BufferedReader(

new InputStreamReader(

clientSocket.getInputStream(),"UTF-8"));

while(true)

{

System.out.println("请创建您的昵称:");

nickName = scan.nextLine();

if (nickName.trim().equals(""))

{

System.out.println("昵称不得为空");

}

else

{

pw.println(nickName);

String pass = br.readLine();

if(pass!=null!pass.equals("OK"))

{

System.out.println("昵称已经被占用,请更换!");

}

else

{

System.out.println("你好!"+nickName+"可以开始聊天了");

break;

}

}

}

}

/*

* 客户端启动的方法

*/

public void start()

{

try

{

/*

* 创建Scanner,读取用户输入内容

* 目的是设置客户端的昵称

*/

Scanner scanner = new Scanner(System.in);

inputNickName(scanner);

/*

* 将用于接收服务器端发送过来的信息的线程启动

*/

Runnable run = new GetServerMsgHandler();

Thread t = new Thread(run);

t.start();

/*

* 建立输出流,给服务端发信息

*/

OutputStream os = clientSocket.getOutputStream();

OutputStreamWriter osw = new OutputStreamWriter(os,"UTF-8");

PrintWriter pw = new PrintWriter(osw,true);

while(true)

{

pw.println(scanner.nextLine());

}

}

catch(Exception e)

{

e.printStackTrace();

}

finally

{

if(clientSocket !=null)

{

try

{

clientSocket.close();

}

catch(IOException e)

{

e.printStackTrace();

}

}

}

}

/**

* 该线程体用来循环读取服务端发送过来的信息

* 并输出到客户端的控制台

* @param args

*/

class GetServerMsgHandler implements Runnable

{

@Override

public void run()

{

try

{

InputStream is = clientSocket.getInputStream();

InputStreamReader isr = new InputStreamReader(is,"UTF-8");

BufferedReader br = new BufferedReader(isr);

String msgString = null;

while((msgString = br.readLine())!= null)

{

System.out.println("服务端提示:"+ msgString);

}

}

catch(Exception e)

{

e.printStackTrace();

}

}

}

public static void main(String[] args)

{

chatClient client = new chatClient();

client.start();

}

}

package API_Day09;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.HashMap;

import java.util.Map;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

/**

* 控制台聊天程序

* 服务端应用程序

* @author Jacob

*

*/

public class chatServer

{

/**

* ServerSocket 是运行在服务端的Socket

* 用来监听端口,等待客户端的连接,

* 一旦连接成功就会返回与该客户端通信的Socket

*/

private ServerSocket serverSocket;

/**

* 创建线程池来管理客户端的连接线程

* 避免系统资源过度浪费

*/

private ExecutorService threadPool;

/**

* 该属性用来存放客户端之间私聊的信息

*/

private MapString,PrintWriter allOut;

/**

* 构造方法,服务端初始化

*/

public chatServer()

{

try

{

/*

* 创建ServerSocket,并申请服务端口

* 将来客户端就是通过该端口连接服务端程序的

*/

serverSocket = new ServerSocket(12580);

/*

* 初始化Map集合,存放客户端信息

*/

allOut = new HashMapString, PrintWriter();

/*

* 初始化线程池,设置线程的数量

*/

threadPool = Executors.newFixedThreadPool(10);

/*

* 初始化用来存放客户端输出流的集合,

* 每当一个客户端连接,就会将该客户端的输出流存入该集合;

* 每当一个客户端断开连接,就会将集合中该客户端的输出流删除;

* 每当转发一条信息,就要遍历集合中的所有输出流(元素)

* 因此转发的频率高于客户端登入登出的频率,

* 还是应该使用ArrayList来存储元素,仅限群聊,私聊不行

* allOut = new ArrayListPrintWriter();

*/

}

catch (Exception e)

{

e.printStackTrace();

}

}

/*

* 将客户端的信息以Map形式存入集合中

*/

private void addOut(String key,PrintWriter value)

{

synchronized(this)

{

allOut.put(key, value);

}

}

/*

* 将给定的输出流从共享集合中删除

* 参数为客户端nickName,作为Map的key键

*/

private synchronized void removeOut(String key)

{

allOut.remove(key);

System.out.println("当前在线人数为:"+ allOut.size());

}

/*

* 将给定的消息转发给所有客户端

*/

private synchronized void sendMsgToAll(String message)

{

for(PrintWriter out: allOut.values())

{

out.println(message);

System.out.println("当前在线人数为:"+ allOut.size());

}

}

/*

* 将给定的消息转发给私聊的客户端

*/

private synchronized void sendMsgToPrivate(String nickname,String message)

{

PrintWriter pw = allOut.get(nickname); //将对应客户端的聊天信息取出作为私聊内容发送出去

if(pw!=null)

{

pw.println(message);

System.out.println("当前在线私聊人数为:"+ allOut.size());

}

}

/**

* 服务端启动的方法

*/

public void start()

{

try

{

while(true)

{

/*

* 监听10086端口

*/

System.out.println("等待客户端连接... ... ");

/*

* Socket accept() 这是一个阻塞方法,会一直在10086端口进行监听

* 直到一个客户端连接上,此时该方法会将与这个客户端进行通信的Socket返回

*/

Socket socket = serverSocket.accept();

System.out.println("客户端连接成功! ");

/*

* 启动一个线程,由线程来处理客户端的请求,这样可以再次监听

* 下一个客户端的连接了

*/

Runnable run = new GetClientMsgHandler(socket);

threadPool.execute(run); //通过线程池来分配线程

}

}

catch(Exception e)

{

e.printStackTrace();

}

}

/**

* 该线程体用来处理给定的某一个客户端的消息,循环接收客户端发送

* 的每一个字符串,并输出到控制台

* @author Jacob

*

*/

class GetClientMsgHandler implements Runnable

{

/*

* 该属性是当前线程处理的具体的客户端的Socket

* @see java.lang.Runnable#run()

*/

private Socket socket;

/*

* 获取客户端的地址信息

* private String hostIP;

*/

/*

* 获取客户端的昵称

*/

private String nickName;

/*

* 创建构造方法

*/

public GetClientMsgHandler(Socket socket)

{

this.socket = socket;

/*

* 获取远端客户的Ip地址信息

* 保存客户端的IP地址字符串

* InetAddress address = socket.getInetAddress();

* hostIP = address.getHostAddress();

*/

}

/*

* 创建内部类来获取昵称

*/

private String getNickName() throws Exception

{

try

{

//服务端的输入流读取客户端发送来的昵称输出流

InputStream iin = socket.getInputStream();

InputStreamReader isr =

new InputStreamReader(iin,"UTF-8");

BufferedReader bReader = new BufferedReader(isr);

//服务端将昵称验证结果通过自身的输出流发送给客户端

OutputStream out = socket.getOutputStream();

OutputStreamWriter iosw =

new OutputStreamWriter(out,"UTF-8");

PrintWriter ipw = new PrintWriter(iosw,true);

//读取客户端发来的昵称

String nameString = bReader.readLine();

while(true)

{

if(nameString.trim().length()==0)

{

ipw.println("FAIL");

}

if(allOut.containsKey(nameString))

{

ipw.println("FAIL");

}

else

{

ipw.println("OK");

return nameString;

}

nameString = bReader.readLine();

}

}

catch(Exception e)

{

throw e;

}

}

@Override

public void run()

{

PrintWriter pw = null;

try

{

/*

* 通过客户端的Socket获取客户端的输出流

* 用来将消息发送给客户端

*/

OutputStream os = socket.getOutputStream();

OutputStreamWriter osw = new OutputStreamWriter(os,"UTF-8");

pw = new PrintWriter(osw,true);

/*

* 将客户昵称和其所说的话作为元素存入共享集合HashMap中

*/

nickName = getNickName();

addOut(nickName, pw);

Thread.sleep(100);

/*

* 服务端通知所有客户端,某用户登录

*/

sendMsgToAll("[系统通知]:欢迎**"+nickName+"**登陆聊天室!");

/*

* 通过客户端的Socket获取输入流

* 读取客户端发送来的信息

*/

InputStream is = socket.getInputStream();

InputStreamReader isr = new InputStreamReader(is,"UTF-8");

BufferedReader br = new BufferedReader(isr);

String msgString = null;

while((msgString = br.readLine())!=null)

{

//验证是否是私聊

if(msgString.startsWith("@"))

{

/*

* 私聊格式:@昵称:内容

*/

int index = msgString.indexOf(":");

if(index =0)

{

//获取昵称

String name = msgString.substring(1,index);

String info = msgString.substring(index+1,msgString.length());

info = nickName + "对你说:"+ info;

//将私聊信息发送出去

sendMsgToPrivate(name, info);

//服务端不在广播私聊的信息

continue;

}

}

/*

* 遍历所有输出流,将该客户端发送的信息转发给所有客户端

*/

System.out.println(nickName+"说:"+ msgString);

sendMsgToAll(nickName+"说:"+ msgString);

}

}

catch (Exception e)

{

/*

* 因为Win系统用户的客户端断开连接后,br.readLine()方法读取

* 不到信息就会抛出异常,而Linux系统会持续发送null;

* 因此这里就不在将捕获的异常抛出了。

*/

}

finally

{

/*

* 当执行到此处时,说明客户端已经与服务端断开连接

* 则将该客户端存在共享集合中的输出流删除

*/

removeOut(nickName);

/*

* 通知所有客户端,某某客户已经下线

*/

sendMsgToAll("[系统通知]:"+nickName + "已经下线了。");

/*

* 关闭socket,则通过Socket获取的输入输出流也一同关闭了

*/

if(socket!=null)

{

try

{

socket.close();

}

catch(IOException e)

{

e.printStackTrace();

}

}

}

}

}

public static void main(String[] args)

{

chatServer server = new chatServer();

server.start();

}

}

我的作业,供你参考

Java如何使用UDP协议实现多人聊天?

UDP 是广播的,如果是做实时的聊天,就开两个线程、不需要服务器端。一个专门接收、一个做发送

分享题目:多人聊天java代码,java多人聊天室
地址分享:https://www.cdcxhl.com/article10/hoihgo.html

成都网站建设公司_创新互联,为您提供网站改版虚拟主机网站内链小程序开发商城网站搜索引擎优化

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

外贸网站建设