ServerSocket实现的聊天程序如何多人聊天?

sysmaster 2005-10-19 04:28:33
我做了个聊天程序,一个服务器类(用线程处理客户对象),一个客户类,可以正常通信.现在的问题是:
如何做到启动多个客户程序时,他们的话能够发给所有的人

服务器应该如何转发?
...全文
865 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
tlowl 2005-10-26
  • 打赏
  • 举报
回复
转发就是把所有客户端的Socket放在一个ArrayList里,把接收到的消息分别发个每个Socket,个人感觉用Map似乎更好
tlowl 2005-10-26
  • 打赏
  • 举报
回复
看起来乱一点,关闭流的地方全注释掉了,还没有做中断死循环,这个我还在继续修改中

我手上还有一个功能比较全的,客户端是用Applet做的,不过在不同的机器上连接的测试没有成功,单机上是好用的,多个客户端同时启动也是好用的,问题应该出在Applet上吧,这个东东安全性比较高,对网络支持不好。不过这个是四个类,代码相对比较长,这里帖不下,你要是想要给我发个短信留个E-mail给我
tlowl 2005-10-26
  • 打赏
  • 举报
回复
我们的作业到是做出来了,不过功能还不全,转发到是可以,但是记录不了用户,功能还不全,我还在修改中

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();
}
}
dulang200x 2005-10-23
  • 打赏
  • 举报
回复
up下
ericqxg007 2005-10-23
  • 打赏
  • 举报
回复
mark
sysmaster 2005-10-23
  • 打赏
  • 举报
回复
我的天呀,没痣了!!!
tlowl 2005-10-22
  • 打赏
  • 举报
回复
下个星期就要学网络了,老师留了个作业就是做这个,这两天在家先做一下,回头在讨论
这个好象要用到多线程
sysmaster 2005-10-21
  • 打赏
  • 举报
回复
还有人吗?
sjjf 2005-10-19
  • 打赏
  • 举报
回复
要想达到高效,就用异步i/o
都转行吧 2005-10-19
  • 打赏
  • 举报
回复
ding
sysmaster 2005-10-19
  • 打赏
  • 举报
回复
呵呵,记录用户这个我能做到,不过就是不知道如何转发,因为发送代码我是写在线程式中的:
我的代码如下(请帮我修改一下或给一个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) {
}
}
}
}
believefym 2005-10-19
  • 打赏
  • 举报
回复
把客户放到容器里,收到消息后遍历容器进行转发(过滤掉主发客户)

62,629

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧