请教一个java服务器端编程的问题。 要源码吗?很多的!是个聊天室来的!你要的话就留个Email!简单的思路是!你可以在服务中开一个线程来做!就是只要有人登录就这个登录的客户发给所有人客户端! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 import javax.swing.*;import java.awt.*;import java.net.*;import java.io.*;import java.util.*;class Server14 extends JFrame implements Runnable{ java.awt.List list = new java.awt.List(10); ServerSocket ss = null; Vector v = new Vector(); Server14(){ JPanel jpl = new JPanel(); this.getContentPane().add(jpl); jpl.add(new JLabel("已经上线的客户")); jpl.add(list); this.setSize(600,300); this.show(); try{ ss = new ServerSocket(5000); }catch(Exception e){} new Thread(this).start(); } public void run(){ try{ while(true){ Socket s = ss.accept(); PrintStream ps = new PrintStream( s.getOutputStream() ); BufferedReader br = new BufferedReader( new InputStreamReader(s.getInputStream()) ); String nick = br.readLine(); list.add(nick); //开辟一个线程,专门负责接收 //某一客户的信息 ClientThread ct = new ClientThread(s,ps,br,nick); v.addElement(ct);//存到Vector里面 //通知所有客户端,某人上线了 String people = ""; for(int i=0;i<list.getItemCount();i++){ people=people+"#"+list.getItem(i); } //#用户1#用户2... sendMsg("PEOPLE"+people); } }catch(Exception e){} } class ClientThread extends Thread{ Socket s=null; PrintStream ps = null; BufferedReader br = null; String nick=""; ClientThread(Socket s, PrintStream ps, BufferedReader br, String nick){ this.s = s; this.ps = ps; this.br = br; this.nick = nick; this.start(); } public void run(){ while(true){ try{ String str = br.readLine(); if(str.equals("LOGOUT")){ list.remove(nick); String people = ""; for(int i=0;i<list.getItemCount();i++){ people=people+"#"+list.getItem(i); } //#用户1#用户2... sendMsg("PEOPLE"+people); //通知所有客户端某人下线 /* code */ s.close(); ps.close(); br.close(); } else{ //将这句话发给所有客户端 sendMsg(str); } }catch(Exception e){} } } } public void sendMsg(String str){ for(int i=0;i<v.size();i++){ ClientThread ct = (ClientThread)v.elementAt(i); ct.ps.println(str); } } public static void main(String ar[]){ new Server14(); } } import javax.swing.*;import java.awt.*;import java.net.*;import java.io.*;import java.awt.event.ActionListener;import java.awt.event.ActionEvent;import java.util.StringTokenizer;class Client14 extends JFrame implements ActionListener,Runnable{ List list = new List(10); JTextArea jta = new JTextArea(10,20); JScrollPane jsp = new JScrollPane(jta); JButton jbt = new JButton("连结服务器"); JButton jbt1 = new JButton("发送消息"); JButton jbt2 = new JButton("下线"); JTextField jtf = new JTextField(10); Socket s = null; String nick=""; PrintStream ps = null; BufferedReader br = null; Client14(){ JPanel jpl = new JPanel(); this.getContentPane().add(jpl); jpl.add(new JLabel("在线名单")); jpl.add(list); jpl.add(new JLabel("读取信息")); jpl.add(jsp); jpl.add(new JLabel("请输入发送的信息")); jpl.add(jtf); jpl.add(jbt); jpl.add(jbt1); jpl.add(jbt2); jbt.addActionListener(this); jbt1.addActionListener(this); jbt2.addActionListener(this); jta.setBackground(Color.pink); this.setSize(550,300); this.show(); nick = JOptionPane.showInputDialog( this,"请输入昵称" ); this.setTitle(nick); } public static void main(String ar[]){ new Client14(); } public void run(){ while(true){ try{ String str = br.readLine(); StringTokenizer st = new StringTokenizer(str,"#"); String head = st.nextToken(); if(head.equals("PEOPLE")){ list.removeAll(); while(st.hasMoreTokens()){ list.add(st.nextToken()); } } else{ jta.append(str+"\n"); } }catch(Exception e){} } } public void actionPerformed(ActionEvent parm1) { try{ if(parm1.getSource()==jbt){ s = new Socket("127.0.0.1",5000); ps = new PrintStream( s.getOutputStream() ); br = new BufferedReader( new InputStreamReader(s.getInputStream()) ); ps.println(nick); new Thread(this).start(); } if(parm1.getSource()==jbt1){ ps.println(nick+"说:"+jtf.getText()); } if(parm1.getSource()==jbt2){ //下线 ps.println("LOGOUT"); s.close(); ps.close(); br.close(); System.exit(0); } }catch(Exception e){} } } SERVER端利用多线程实现,先在端口监听,当有接入请求的时候,由线程产生一个SOCKET来处理请求,然后SERVER继续监听端口,SERVER返回给CLIENT的信息都放在线程里面,另外应注意处理异常,经常有的不能运行是因为没有处理好异常。若要实现像平常那种聊天室模式的话,可以在SERVER端加一段代码,把接收到任何一个CLIENT端发的信息,再还发给全部CLIENT。 谢谢大家了改天再找个机会给大家结分哈。。看到回复之前,我自己也作了一个server的demo,也想过对每个client connection新建一个线程来处理,如果有几千几万个用户来连接的话,server估计也要挂了。。目前是这样的:监听所有的client,在一个线程里面的接受所有client的数据,然后用一个线程来发送消息,两个线程采用命名管道进行通信。。结果效率同样很低。正在考虑折中的办法,比如把需要处理的工作分得更细,对连接的client分组之类的。大家有兴趣可以继续讨论。。 to heibai520(Crazy Java)my email is:[email protected] java 关闭当前窗体后刷新父窗体 问? 请教List遍历问题 做文字动画的时候,如何让图像不残留阿?急!急! 文件路径问题 请大家帮忙介绍些国内外好的JAVA技术的网站或者论坛!! 求助~~ 谁有Borland Optimizeit Enterprise 5.5的crack,高分相送 why my IE can not show the applet? 想学servlet,不知道要下什么工具,谁来拿分? 请问,如何判断一个汉字属于GB2312字符集? java中io流的flush()函数起的作用???
import java.awt.*;
import java.net.*;
import java.io.*;
import java.util.*;class Server14 extends JFrame
implements Runnable{
java.awt.List list = new java.awt.List(10);
ServerSocket ss = null;
Vector v = new Vector();
Server14(){
JPanel jpl = new JPanel();
this.getContentPane().add(jpl);
jpl.add(new JLabel("已经上线的客户"));
jpl.add(list);
this.setSize(600,300);
this.show();
try{
ss = new ServerSocket(5000);
}catch(Exception e){}
new Thread(this).start();
}
public void run(){
try{
while(true){
Socket s = ss.accept();
PrintStream ps = new PrintStream(
s.getOutputStream()
);
BufferedReader br = new BufferedReader(
new InputStreamReader(s.getInputStream())
);
String nick = br.readLine();
list.add(nick);
//开辟一个线程,专门负责接收
//某一客户的信息
ClientThread ct =
new ClientThread(s,ps,br,nick);
v.addElement(ct);//存到Vector里面
//通知所有客户端,某人上线了
String people = "";
for(int i=0;i<list.getItemCount();i++){
people=people+"#"+list.getItem(i);
} //#用户1#用户2...
sendMsg("PEOPLE"+people);
}
}catch(Exception e){}
}
class ClientThread extends Thread{
Socket s=null;
PrintStream ps = null;
BufferedReader br = null;
String nick="";
ClientThread(Socket s,
PrintStream ps,
BufferedReader br,
String nick){
this.s = s;
this.ps = ps;
this.br = br;
this.nick = nick;
this.start();
}
public void run(){
while(true){
try{
String str = br.readLine();
if(str.equals("LOGOUT")){
list.remove(nick);
String people = "";
for(int i=0;i<list.getItemCount();i++){
people=people+"#"+list.getItem(i);
} //#用户1#用户2...
sendMsg("PEOPLE"+people);
//通知所有客户端某人下线
/*
code
*/
s.close();
ps.close();
br.close();
}
else{
//将这句话发给所有客户端
sendMsg(str);
}
}catch(Exception e){}
}
}
}
public void sendMsg(String str){
for(int i=0;i<v.size();i++){
ClientThread ct = (ClientThread)v.elementAt(i);
ct.ps.println(str);
}
}
public static void main(String ar[]){
new Server14();
}
}
import java.awt.*;
import java.net.*;
import java.io.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.util.StringTokenizer;
class Client14 extends JFrame
implements ActionListener,Runnable{
List list = new List(10);
JTextArea jta = new JTextArea(10,20);
JScrollPane jsp = new JScrollPane(jta);
JButton jbt = new JButton("连结服务器");
JButton jbt1 = new JButton("发送消息");
JButton jbt2 = new JButton("下线");
JTextField jtf = new JTextField(10);
Socket s = null;
String nick="";
PrintStream ps = null;
BufferedReader br = null;
Client14(){
JPanel jpl = new JPanel();
this.getContentPane().add(jpl);
jpl.add(new JLabel("在线名单"));
jpl.add(list);
jpl.add(new JLabel("读取信息"));
jpl.add(jsp);
jpl.add(new JLabel("请输入发送的信息"));
jpl.add(jtf);
jpl.add(jbt);
jpl.add(jbt1);
jpl.add(jbt2);
jbt.addActionListener(this);
jbt1.addActionListener(this);
jbt2.addActionListener(this);
jta.setBackground(Color.pink);
this.setSize(550,300);
this.show();
nick = JOptionPane.showInputDialog(
this,"请输入昵称"
);
this.setTitle(nick);
} public static void main(String ar[]){
new Client14();
}
public void run(){
while(true){
try{
String str = br.readLine();
StringTokenizer st =
new StringTokenizer(str,"#");
String head = st.nextToken();
if(head.equals("PEOPLE")){
list.removeAll();
while(st.hasMoreTokens()){
list.add(st.nextToken());
}
}
else{
jta.append(str+"\n");
}
}catch(Exception e){}
}
} public void actionPerformed(ActionEvent parm1) {
try{
if(parm1.getSource()==jbt){
s = new Socket("127.0.0.1",5000);
ps = new PrintStream(
s.getOutputStream()
);
br = new BufferedReader(
new InputStreamReader(s.getInputStream())
);
ps.println(nick);
new Thread(this).start();
}
if(parm1.getSource()==jbt1){
ps.println(nick+"说:"+jtf.getText());
}
if(parm1.getSource()==jbt2){
//下线
ps.println("LOGOUT");
s.close();
ps.close();
br.close();
System.exit(0);
}
}catch(Exception e){}
}
}
看到回复之前,我自己也作了一个server的demo,也想过对每个client connection新建一个线程来处理,如果有几千几万个用户来连接的话,server估计也要挂了。。
目前是这样的:监听所有的client,在一个线程里面的接受所有client的数据,然后用一个线程来发送消息,两个线程采用命名管道进行通信。。
结果效率同样很低。
正在考虑折中的办法,比如把需要处理的工作分得更细,对连接的client分组之类的。大家有兴趣可以继续讨论。。
my email is:[email protected]