ServerSocket实现的聊天程序如何多人聊天? 我做了个聊天程序,一个服务器类(用线程处理客户对象),一个客户类,可以正常通信.现在的问题是:如何做到启动多个客户程序时,他们的话能够发给所有的人服务器应该如何转发? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 呵呵,记录用户这个我能做到,不过就是不知道如何转发,因为发送代码我是写在线程式中的:我的代码如下(请帮我修改一下或给一个model,谢谢):Server类:import java.net.*;import java.io.*;import java.util.Date;class server{ public static void main(String str[]) { try { ServerSocket server = new ServerSocket(3333); System.out.println("server ok"); while(true) { process p = new process(server.accept()); Thread t = new Thread(p); t.start(); } } catch (Exception ex) { System.out.println("err"+ex.toString()); } }} class process implements Runnable{ Socket s; PrintStream out; BufferedReader br; public process(Socket s) { this.s = s; } public void run() { try { out = new PrintStream(s.getOutputStream()); br = new BufferedReader(new InputStreamReader(s.getInputStream())); while(true) { out.println(br.readLine()); } } catch (SocketException sex) { try { out.close(); br.close(); s.close(); } catch (Exception ex) { System.out.println (ex.toString()); } } catch (Exception ex) { System.out.println("err"+ex.toString()); } }}Client类:import java.io.*;import java.net.*;class client{ public static void main(String strp[]) { Socket s=null; PrintStream out=null; BufferedReader br=null; try { s = new Socket("127.0.0.1",3333); out = new PrintStream(s.getOutputStream()); br = new BufferedReader(new InputStreamReader(s.getInputStream())); while(true) { out.println(new BufferedReader(new InputStreamReader(System.in)).readLine()); System.out.println (br.readLine()); } } catch (Exception ex) { System.out.println(ex.toString()); } finally { try { out.close(); br.close(); s.close(); } catch (Exception ex) { } } } } 我们的作业到是做出来了,不过功能还不全,转发到是可以,但是记录不了用户,功能还不全,我还在修改中Server端import java.net.*;import java.io.*;import java.util.*;public class ServerSocketDemo { public static void main(String[] args) throws Exception { ArrayList list=new ArrayList(); ServerSocket ss=new ServerSocket(8088); while(true) { Socket s=ss.accept(); list.add(s); new ReverseDemo(s,list); }// ss.close(); }}class ReverseDemo extends Thread{ BufferedReader in=null; PrintWriter out=null; String str="abc"; ArrayList list; Socket s; public ReverseDemo(Socket s,ArrayList list) { this.list=list; this.s=s; this.start(); } public void run() { System.out.println(s.getInetAddress().getHostAddress()+" connected-------"); try { in=new BufferedReader(new InputStreamReader( s.getInputStream())); out=new PrintWriter(new BufferedWriter( new OutputStreamWriter(s.getOutputStream()))); out.flush(); while(true) { str=in.readLine();// StringBuffer sb=new StringBuffer(str);// str=sb.reverse().toString(); System.out.println(str); Iterator iterator=list.iterator(); while(iterator.hasNext()) { PrintWriter o=new PrintWriter( new BufferedWriter( new OutputStreamWriter( ((Socket)(iterator.next())).getOutputStream())),true); o.println(str); } } // in.close(); // out.close(); // s.close(); } catch (Exception ex) { ex.printStackTrace(); } } }Client端import java.awt.*;import java.awt.event.*;import java.io.*;import java.net.*;public class ChatDemo2 extends Frame{ TextArea ta=new TextArea(); Panel p=new Panel(); TextField tf=new TextField(20); TextField tfIp=new TextField(15); Button btn=new Button("Send"); Socket s; BufferedReader in; PrintWriter out; String str; public ChatDemo2(String title) //throws Exception { super(title); try { s=new Socket("localhost",8088); in=new BufferedReader(new InputStreamReader( s.getInputStream())); out=new PrintWriter(new BufferedWriter( new OutputStreamWriter(s.getOutputStream())),true); } catch(IOException ex) { ex.printStackTrace(); } } public void init() { p.setLayout(new BorderLayout()); p.add(tf,BorderLayout.CENTER); p.add(btn,BorderLayout.EAST); p.add(tfIp,"West"); add(p,BorderLayout.SOUTH); add(ta); setSize(300,300); setVisible(true); btn.addActionListener(new Message_send()); tf.addActionListener(new Message_send()); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(1); } }); while(true) { try { str=in.readLine(); ta.append(str+"\r\n"); } catch (Exception ex) { } } } class Message_send implements ActionListener { public void actionPerformed(ActionEvent e) { if(e.getSource()==btn||e.getSource()==tf) { String s=tf.getText(); if(s.equals("")==false) { out.println(tf.getText()); tf.setText(""); } } } } public static void main(String[] args) //throws Exception { ChatDemo2 chat=new ChatDemo2("ChatDemo"); chat.init(); }} 看起来乱一点,关闭流的地方全注释掉了,还没有做中断死循环,这个我还在继续修改中我手上还有一个功能比较全的,客户端是用Applet做的,不过在不同的机器上连接的测试没有成功,单机上是好用的,多个客户端同时启动也是好用的,问题应该出在Applet上吧,这个东东安全性比较高,对网络支持不好。不过这个是四个类,代码相对比较长,这里帖不下,你要是想要给我发个短信留个E-mail给我 转发就是把所有客户端的Socket放在一个ArrayList里,把接收到的消息分别发个每个Socket,个人感觉用Map似乎更好 帮忙看看这个程序错在哪 非常简单的问题,看你会不会? 急!JTable里面有 很多数据,但是JScrollPane的滚动条却拉不到下面? 结果集的关闭问题! 如何在servlet 里控制页面跳转的target. 关于字符串中的" 大家來看一下我的程序,我是用GridBagLayout的,但為什麼不行?指點指點~! 哪位老兄有介绍服务器入门的资料,共享一份吧! 我用Apache建立一个Web服务,不知Index.html文件应该放到哪个目录下? 请问谁有oracle8.0.5的jdbc驱动程序!!!!! java bean放置位置? 如何实现行的拖动
我的代码如下(请帮我修改一下或给一个model,谢谢):Server类:import java.net.*;
import java.io.*;
import java.util.Date;class server
{
public static void main(String str[])
{
try
{
ServerSocket server = new ServerSocket(3333);
System.out.println("server ok");
while(true)
{
process p = new process(server.accept());
Thread t = new Thread(p);
t.start();
}
}
catch (Exception ex)
{
System.out.println("err"+ex.toString());
}
}
} class process implements Runnable
{
Socket s;
PrintStream out;
BufferedReader br;
public process(Socket s)
{
this.s = s;
}
public void run()
{
try
{
out = new PrintStream(s.getOutputStream());
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
while(true)
{
out.println(br.readLine());
}
}
catch (SocketException sex)
{
try
{
out.close();
br.close();
s.close();
}
catch (Exception ex)
{
System.out.println (ex.toString());
}
}
catch (Exception ex)
{
System.out.println("err"+ex.toString());
}
}
}Client类:import java.io.*;
import java.net.*;class client
{
public static void main(String strp[])
{
Socket s=null;
PrintStream out=null;
BufferedReader br=null;
try
{
s = new Socket("127.0.0.1",3333);
out = new PrintStream(s.getOutputStream());
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
while(true)
{
out.println(new BufferedReader(new InputStreamReader(System.in)).readLine());
System.out.println (br.readLine());
}
}
catch (Exception ex)
{
System.out.println(ex.toString());
}
finally
{
try
{
out.close();
br.close();
s.close();
}
catch (Exception ex) {
}
}
}
}
import java.net.*;
import java.io.*;
import java.util.*;public class ServerSocketDemo
{
public static void main(String[] args) throws Exception
{
ArrayList list=new ArrayList();
ServerSocket ss=new ServerSocket(8088);
while(true)
{
Socket s=ss.accept();
list.add(s);
new ReverseDemo(s,list);
}
// ss.close();
}
}
class ReverseDemo extends Thread
{
BufferedReader in=null;
PrintWriter out=null;
String str="abc";
ArrayList list;
Socket s;
public ReverseDemo(Socket s,ArrayList list)
{
this.list=list;
this.s=s;
this.start();
}
public void run()
{
System.out.println(s.getInetAddress().getHostAddress()+" connected-------");
try {
in=new BufferedReader(new InputStreamReader(
s.getInputStream()));
out=new PrintWriter(new BufferedWriter(
new OutputStreamWriter(s.getOutputStream())));
out.flush();
while(true)
{
str=in.readLine();
// StringBuffer sb=new StringBuffer(str);
// str=sb.reverse().toString();
System.out.println(str);
Iterator iterator=list.iterator();
while(iterator.hasNext())
{
PrintWriter o=new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(
((Socket)(iterator.next())).getOutputStream())),true);
o.println(str);
}
}
// in.close();
// out.close();
// s.close();
}
catch (Exception ex)
{
ex.printStackTrace();
} }
}Client端
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;public class ChatDemo2 extends Frame
{
TextArea ta=new TextArea();
Panel p=new Panel();
TextField tf=new TextField(20);
TextField tfIp=new TextField(15);
Button btn=new Button("Send");
Socket s;
BufferedReader in;
PrintWriter out;
String str;
public ChatDemo2(String title) //throws Exception
{
super(title);
try
{
s=new Socket("localhost",8088);
in=new BufferedReader(new InputStreamReader(
s.getInputStream()));
out=new PrintWriter(new BufferedWriter(
new OutputStreamWriter(s.getOutputStream())),true);
}
catch(IOException ex)
{
ex.printStackTrace();
}
}
public void init()
{
p.setLayout(new BorderLayout());
p.add(tf,BorderLayout.CENTER);
p.add(btn,BorderLayout.EAST);
p.add(tfIp,"West");
add(p,BorderLayout.SOUTH);
add(ta);
setSize(300,300);
setVisible(true);
btn.addActionListener(new Message_send());
tf.addActionListener(new Message_send()); this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(1);
}
});
while(true)
{
try
{
str=in.readLine();
ta.append(str+"\r\n");
}
catch (Exception ex)
{
}
}
}
class Message_send implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==btn||e.getSource()==tf)
{
String s=tf.getText();
if(s.equals("")==false)
{
out.println(tf.getText());
tf.setText("");
}
}
}
}
public static void main(String[] args) //throws Exception
{
ChatDemo2 chat=new ChatDemo2("ChatDemo");
chat.init();
}
}