① java中做客户与客户的聊天对话,利用socket实现了客户的群发功能,怎么利用map给指定的客户发消息
Socket非常类似于电话插座。以一个国家级电话网为例,电话的通话双方相当于相互通信的2个进程,区号是它的网络地址;区内一个单位的交换机相当于一台主机,主机分配给每个用户的局内号码相当于Socket号。任何用户在通话之前,首先要占有一部电话机,相当于申请一个Socket;同时要知道对方的号码,相当于对方有一个固定的Socket。然后向对方拨号呼叫,相当于发出连接请求(假如对方不在同一区内,还要拨对方区号,相当于给出网络地址)。假如对方在场并空闲(相当于通信的另一主机开机且可以接受连接请求),拿起电话话筒,双方就可以正式通话,相当于连接成功。双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向Socket发送数据和从socket接收数据。通话结束后,一方挂起电话机相当于关闭Socket,撤消连接。
在电话系统中,一般用户只能感受到本地电话机和对方电话号码的存在,建立通话的过程,话音传输的过程以及整个电话系统的技术细节对他都是透明的,这也与Socket机制非常相似。Socket利用网间网通信设施实现进程通信,但它对通信设施的细节毫不关心,只要通信设施能提供足够的通信能力,它就满足了。
至此,我们对Socket进行了直观的描述。抽象出来,Socket实质上提供了进程通信的端点。进程通信之前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的。正如打电话之前,双方必须各自拥有一台电话机一样。
在网间网内部,每一个Socket用一个半相关描述:(协议,本地地址,本地端口)。
一个完整的Socket有一个本地唯一的Socket号,由操作系统分配。
最重要的是,Socket是面向客户/服务器模型而设计的,针对客户和服务器程序提供不同的Socket系统调用。客户随机申请一个Socket(相当于一个想打电话的人可以在任何一台入网电话上拨号呼叫),系统为之分配一个Socket号;服务器拥有全局公认的Socket,任何客户都可以向它发出连接请求和信息请求(相当于一个被呼叫的电话拥有一个呼叫方知道的电话号码)。
Socket利用客户/服务器模式巧妙地解决了进程之间建立通信连接的问题。服务器Socket半相关为全局所公认非常重要。读者不妨考虑一下,两个完全随机的用户进程之间如何建立通信?假如通信双方没有任何一方的Socket固定,就好比打电话的双方彼此不知道对方的电话号码,要通话是不可能的。
② java群聊功能是如何实现的
Java群聊功能可以通过网络编程实现,一般使用Socket和ServerSocket类来完成。具体实现步骤如下:
1. 创建一个服务器端程序,使用ServerSocket类创建一个ServerSocket对象,并指定监听的端口号。
2. 创建一个客户端程序,使用Socket类创建一个Socket对象,并指定连接的服务器IP地址和端口号。
3. 服务器端接收客户端连接后,使用accept()方法获取到与该客户端通信的Socket对象。
4. 服务器端开启一个新的线程,唤瞎使用该线程与客户端进行通信,并且将该线程添加到一个线程集合中。
5. 客户端向服务器端发送消姿纯息时,使用Socket对象的OutputStream将消息发送给服务器端。
6. 服务器端从线程集合中获取每个线程,遍历并向每个客户端发送消息,使用Socket对象的OutputStream将消息发送给客户端。
7. 客户端使用Socket对象的InputStream读取服务器端发送的消息。
8. 当客户端或服务器端任意一方关闭连接时,另一方也需要关闭连接。
以上是简要的Java群聊实现步骤,当然还有其他细节需要考虑,比如消息的格式迹链咐、多线程同步等问题,但总体上这些步骤可以帮助你实现Java群聊功能。
③ java编写多人聊天室中,如何在群聊里@xx,然后这条消息只发送给xx,其他人看不到
私聊功能跟你截屏的这段代码没有关系,首先你是多人聊天室,肯定要开连接池来解决线程问题,每个客户端都有自己对象创建的流,正常大家在公共聊天时,socket服务器向所有对象的流同一发送消息,当私聊时需要先找到对应对象的流,服务器单独向该流发送消息就可以实现私聊功能了。
建议你在创建对象时,将每个对象的昵称和流存入一个map集合,私聊时通过昵称来找到对应的流。
④ 急需一个用java 语言写的聊天程序
客户端:
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时写的,是个在线聊天室只有群聊,私聊,上下线提示,搞不好里面还有错误- -其他功能自己看着加吧,你要的功能实在是很好很强大.
⑤ 用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 Map<String,PrintWriter> allOut;
/**
* 构造方法,服务端初始化
*/
public chatServer()
{
try
{
/*
* 创建ServerSocket,并申请服务端口
* 将来客户端就是通过该端口连接服务端程序的
*/
serverSocket = new ServerSocket(12580);
/*
* 初始化Map集合,存放客户端信息
*/
allOut = new HashMap<String, PrintWriter>();
/*
* 初始化线程池,设置线程的数量
*/
threadPool = Executors.newFixedThreadPool(10);
/*
* 初始化用来存放客户端输出流的集合,
* 每当一个客户端连接,就会将该客户端的输出流存入该集合;
* 每当一个客户端断开连接,就会将集合中该客户端的输出流删除;
* 每当转发一条信息,就要遍历集合中的所有输出流(元素)
* 因此转发的频率高于客户端登入登出的频率,
* 还是应该使用ArrayList来存储元素,仅限群聊,私聊不行
* allOut = new ArrayList<PrintWriter>();
*/
}
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 socket编写的聊天室程序,能运行的附带源码,有客户端和服务器端
要多强大的版本。
1.1草图界面,主要实现功能。
1.2 +群聊。
1.3+上线提醒。
1.4+界面优化,仿照版QQ2012,+好友上线头像变亮权。
1.5+视屏,传文件,表情,装口震动,截图。
我先把1.1的发给你吧。。。
2013年5月31日 13:08:36已发。。
⑦ 用java编写一个多人聊天室可以 实现私聊,群聊,文件传送的功能
你这就整麻烦了,如果你只是想实现这些功能,不要求速度也不要存储空间,也不要求有界面那还比较简单,实体类序列化所有传送对象,在socket类中用object流直接传和接收所有的东西(包括聊天信息和文件)再用多线程实现群聊.大概两三天可以搞定.
如果你像做得类似于QQ一样,那就不是几天的事情了
⑧ java开发聊天功能用什么技术
Java开发聊天功能可以使用Socket和ServerSocket技术来实现。
在这种情况下,服务器端需要创建一个ServerSocket对象来监听客户端的连接请求槐伍。当有新的连接请求到达时,服务器会创建一个铅敏或新的Socket对象来与客户端进行通信,并将该Socket对象加入到线程池中。通过这种方式,服务器可拿御以同时处理多个客户端的连接请求和消息交互。
客户端需要创建一个Socket对象,并指定服务器端的IP地址和端口号来连接服务器。连接成功后,客户端可以向服务器发送消息,也可以接收来自服务器的消息。当客户端退出聊天室时,需要关闭Socket连接,并通知服务器该客户端已经离开。
在实际开发中,还需要考虑到消息的编码和解码、异常处理、线程安全等问题。可以使用现成的开源框架如Netty、Spring Boot等来简化聊天功能的开发。同时,还需要进行充分的测试和优化,以提高聊天功能的性能和用户体验。
⑨ java实现聊天室是怎么做到的
Java 实现聊天室可以分为以下几个步骤:
建立服务器端
首先需要建立一个服务器端,负责接收客户端的连接请求并处理客户端发送过来的消息。
建立客户端
然后需要建立册陆客户端,客户端通过正姿毕网络连接到服务器端,并向服务器端发送消息。
实现通信协议
为了实现聊天室功能,需要定义一个通信协议,规定客户端和服务器端之间的通信格式,例如消息的头部和内容等。
实现多线程处理
聊天室通常会有多个用户同时在线,因此需要使用多线程举芹来处理多个客户端的连接请求和消息传递。
实现GUI界面(可选)
为了方便用户使用,可以实现一个GUI界面,让用户可以方便地发送和接收消息。
以下是一个简单的 Java 聊天室的代码示例:
java
Copy code
// 服务器端代码
public class Server {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(8888);
while (true) {
Socket socket = serverSocket.accept();
new Thread(new ServerThread(socket)).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class ServerThread implements Runnable {
private Socket socket;
private BufferedReader reader;
private PrintWriter writer;
public ServerThread(Socket socket) {
this.socket = socket;
try {
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new PrintWriter(socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
try {
String msg;
while ((msg = reader.readLine()) != null) {
// 处理客户端发送过来的消息
System.out.println("接收到消息:" + msg);
// 将消息发送给所有客户端
for (Socket s : ServerThreadList.getList()) {
if (s != socket) {
PrintWriter w = new PrintWriter(s.getOutputStream());
w.println(msg);
w.flush();
}
}
}
// 关闭连接
socket.close();
ServerThreadList.removeThread(this);
} catch (IOException e) {
e.printStackTrace();
}
}
}
class ServerThreadList {
private static List
list = new ArrayList<>();
public static void addThread(ServerThread thread) {
list.add(thread);
}
public static void removeThread(ServerThread thread) {
list.remove(thread);
}
public static List
getList() {
return list;
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost", 8888);
new Thread(new ClientThread(socket)).start();
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
PrintWriter writer = new PrintWriter(socket.getOutputStream());
while (true) {
String msg = reader.readLine();
writer.println(msg);
writer.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class ClientThread implements Runnable {
private Socket socket;
private BufferedReader reader;
public ClientThread(Socket socket) {
this.socket = socket;
try {
reader
⑩ java聊天工具提问
你应该用
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
bis来读,bos来写,这是基于字节型的数据流,数据收到以后,都存放在字节数组中去,再按你的格式拆装起来。不管是string还是int还是boolean还是图片、声音谨锋或Object都可以.我的程序就是这样做的。消敏有空看看我的网络 空 间。
但要注意,字节流在tcp/ip连接中,可能会拿晌枝存在粘包的问题。这需要你自己设计数据包的格式,
比如:你的收包程序一起在收,每收一次就检查是否收到结束标志,收到了就表示此次数据接收完成。否则,就继续收,直到找到结束标志。