求一个用java socket编写的聊天室程序,能运行的附带源码,有客户端和服务器端

作者&投稿:陶致 (若有异议请与网页底部的电邮联系)
求一个用java socket编写的聊天室程序,能运行的附带源码,要有教程一起发过来吧,邮箱hogsdi112@163.com~

import java.net.*;
import java.io.*;
import java.util.*;
public class ChatRoomServer {
public static void main(String[] args) throws Exception{
ServerSocket ss=new ServerSocket(8000);
List sockets=new ArrayList();
while(true){
Socket s=ss.accept();
sockets.add(s);
Thread t=new ServerThread1(s,sockets);
t.start();
}
}
}
class ServerThread1 extends Thread{
Socket s;
List sockets;
public ServerThread1(Socket s,List sockets) {
super();
this.s = s;
this.sockets=sockets;
}
public void run(){
try {
BufferedReader in=new BufferedReader(
new InputStreamReader(s.getInputStream()) );
while(true){
String text=in.readLine();
if (text==null) return;
for(int i=0;i<sockets.size();i++){
Socket s2=(Socket)sockets.get(i);
PrintWriter out=new PrintWriter(s2.getOutputStream());
out.println(text);
out.flush();
}

}
} catch (IOException e) {}
finally{
this.sockets.remove(s);
}
}
}






import javax.swing.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
public class ChatRoomClient {
JFrame frame;
JTextField jtf;
JTextArea jta;
Socket s;
BufferedReader in;
PrintWriter out;

public static void main(String[] args) {
ChatRoomClient c=new ChatRoomClient();
c.receive();
}

public ChatRoomClient(){
frame=new JFrame("Chat Room");
frame.setSize(400,300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

jta=new JTextArea();
JScrollPane jsp=new JScrollPane(jta);
frame.add(jsp);

jta.setEditable(false);

jtf=new JTextField();
frame.add(jtf,"South");

frame.setVisible(true);

try {
s=new Socket("localhost",8000);
in=new BufferedReader(new InputStreamReader(s.getInputStream()));
out=new PrintWriter(s.getOutputStream());
} catch (UnknownHostException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}

jtf.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
String text=jtf.getText();
jtf.setText("");
out.println(text);
out.flush();
}
});
}

public void receive(){
try {
while(true){
String text=in.readLine();
jta.append(text+"
");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}


先运行ChatRoomServer ,再运行ChatRoomClient

//聊天室的客户端
import java.applet.*;
import java.awt.*;
import java.io.*;
import java.net.*;
import java.awt.event.*;

public class ChatClient extends Applet{
protected boolean loggedIn;//登入状态
protected Frame cp;//聊天室框架
protected static int PORTNUM=7777; //缺省端口号7777
protected int port;//实际端口号
protected Socket sock;
protected BufferedReader is;//用于从sock读取数据的BufferedReader
protected PrintWriter pw;//用于向sock写入数据的PrintWriter
protected TextField tf;//用于输入的TextField
protected TextArea ta;//用于显示对话的TextArea
protected Button lib;//登入按钮
protected Button lob;//登出的按钮
final static String TITLE ="Chatroom applet>>>>>>>>>>>>>>>>>>>>>>>>";
protected String paintMessage;//发表的消息
public ChatParameter Chat;

public void init(){
paintMessage="正在生成聊天窗口";
repaint();
cp=new Frame(TITLE);
cp.setLayout(new BorderLayout());
String portNum=getParameter("port");//呢个参数勿太明
port=PORTNUM;
if (portNum!=null) //书上是portNum==null,十分有问题
port=Integer.parseInt(portNum);

//CGI

ta=new TextArea(14,80);
ta.setEditable(false);//read only attribute
ta.setFont(new Font("Monospaced",Font.PLAIN,11));
cp.add(BorderLayout.NORTH,ta);

Panel p=new Panel();
Button b;

//for login button
p.add(lib=new Button("Login"));
lib.setEnabled(true);
lib.requestFocus();
lib.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
login();
lib.setEnabled(false);
lob.setEnabled(true);
tf.requestFocus();//将键盘输入锁定再右边的文本框中
}
});

//for logout button
p.add(lob=new Button ("Logout"));
lob.setEnabled(false);
lob.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
logout();
lib.setEnabled(true);
lob.setEnabled(false);
lib.requestFocus();
}
});


p.add(new Label ("输入消息:"));
tf=new TextField(40);
tf.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(loggedIn){
//pw.println(Chat.CMD_BCAST+tf.getText());//Chat.CMD....是咩野来?
int j=tf.getText().indexOf(":");
if(j>0) pw.println(Chat.CMD_MESG+tf.getText());

else
pw.println(Chat.CMD_BCAST+tf.getText());
tf.setText("");//勿使用flush()?
}
}
});

p.add(tf);
cp.add(BorderLayout.SOUTH,p);

cp.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
//如果执行了setVisible或者dispose,关闭窗口
ChatClient.this.cp.setVisible(false);
ChatClient.this.cp.dispose();
logout();
}
});

cp.pack();//勿明白有咩用?
//将Frame cp放在中间
Dimension us=cp.getSize(),
them=Toolkit.getDefaultToolkit().getScreenSize();
int newX=(them.width-us.width)/2;
int newY=(them.height-us.height)/2;
cp.setLocation(newX,newY);
cp.setVisible(true);
paintMessage="Window should now be visible";
repaint();

}



//登录聊天室
public void login(){
if(loggedIn) return;

try{
sock=new Socket(getCodeBase().getHost(),port);
is=new BufferedReader(new InputStreamReader(sock.getInputStream()));
pw=new PrintWriter(sock.getOutputStream(),true);
}catch(IOException e){
showStatus("Can't get socket: "+e);
cp.add(new Label("Can't get socket: "+e));
return;}

//构造并且启动读入器,从服务器读取数据,输出到文本框中
//这里,长成一个线程来避免锁住资源(lockups)
new Thread (new Runnable(){
public void run(){
String line;
try{
while(loggedIn &&((line=is.readLine())!=null))
ta.appendText(line+"
");
}catch(IOException e){
showStatus("我的天啊,掉线了也!!!!");
return;
}
}
}).start();


//假定登录(其实只是打印相关信息,并没有真正登录)
// pw.println(Chat.CMD_LOGIN+"AppletUser");
pw.println(Chat.CMD_LOGIN+"AppletUser");
loggedIn =true;

}


//模仿退出的代码
public void logout(){
if(!loggedIn)
return;

loggedIn=false;
try{
if(sock!=null)
sock.close();
}catch(IOException ign){
// 异常处理哦
}

}



//没有设置stop的方法,即使从浏览器跳到另外一个网页的时候
//聊天程序还可以继续运行

public void paint(Graphics g){
Dimension d=getSize();
int h=d.height;
int w=d.width;
g.fillRect(0,0,w,2);
g.setColor(Color.black);
g.drawString(paintMessage,10,(h/2)-5);

}


}


聊天室服务器端
import java.net.*;
import java.io.*;
import java.util.*;

public class ChatServer{
//聊天室管理员ID
protected final static String CHATMASTER_ID="ChatMaster";
//系统信息的分隔符
protected final static String SEP=": ";
//服务器的Socket
protected ServerSocket servSock;
//当前客户端列表
protected ArrayList clients;
//调试标记
protected boolean DEBUG=false;
public ChatParameter Chat;

//主方法构造一个ChatServer,没有返回值
public static void main(String[] argv){
System.out.println("Chat server0.1 starting>>>>>>>>>>>>>>>>");
ChatServer w=new ChatServer();
w.runServer();
System.out.println("***ERROR*** Chat server0.1 quitting");

}


//构造和运行一个聊天服务
ChatServer(){
Chat=new ChatParameter();
clients=new ArrayList();
try{
servSock=new ServerSocket(7777);//实有问题拉,不过可能是他自己定义既一个class.
System.out.println("Chat Server0.1 listening on port:"+7777);
}catch(Exception e){
log("IO Exception in ChatServer.");
System.exit(0);
}
}

public void runServer(){
try{
while(true){
Socket us=servSock.accept();
String hostName=us.getInetAddress().getHostName();
System.out.println("Accpeted from "+hostName);
//一个处理的线程
ChatHandler cl=new ChatHandler(us,hostName);
synchronized(clients){
clients.add(cl);
cl.start();
if(clients.size()==1)
cl.send(CHATMASTER_ID,"Welcome!You are the first one here");
else{
cl.send(CHATMASTER_ID,"Welcome!You are the latest of"+
clients.size()+" users.");
}
}
}
}catch(Exception e){
log("IO Exception in runServer:"+e);
System.exit(0);
}
}


protected void log(String s){
System.out.println(s);
}


//处理会话的内部的类
protected class ChatHandler extends Thread {
//客户端scoket
protected Socket clientSock;
//读取socket的BufferedReader
protected BufferedReader is ;
//在socket 上发送信息行的PrintWriter
protected PrintWriter pw;
//客户端出主机
protected String clientIP;
//句柄
protected String login;

public ChatHandler (Socket sock,String clnt)throws IOException {
clientSock=sock;
clientIP=clnt;
is=new BufferedReader(
new InputStreamReader(sock.getInputStream()));
pw=new PrintWriter (sock.getOutputStream(),true);

}

//每一个ChatHandler是一个线程,下面的是他的run()方法
//用于处理会话
public void run(){
String line;

try{
while((line=is.readLine())!=null){
char c=line.charAt(0);//我顶你老母啊 ,果只Chat.CMD咩xx冇定义 扑啊///!!!
line=line.substring(1);
switch(c){
//case Chat.CMD_LOGIN:
case 'l':
if(!Chat.isValidLoginName(line)){
send(CHATMASTER_ID,"LOGIN"+line+"invalid");
log("LOGIN INVALID from:"+clientIP);
continue;
}

login=line;
broadcast(CHATMASTER_ID,login+" joins us,for a total of"+
clients.size()+" users");
break;

// case Chat.CMD_MESG:
case 'm':
if(login==null){
send(CHATMASTER_ID,"please login first");
continue;
}

int where =line.indexOf(Chat.SEPARATOR);
String recip=line.substring(0,where);
String mesg=line.substring (where+1);
log("MESG: "+login+"--->"+recip+": "+mesg);
ChatHandler cl=lookup(recip);
if(cl==null)
psend(CHATMASTER_ID,recip+"not logged in.");
else
cl.psend(login,mesg);

break;


//case Chat.CMD_QUIT:
case 'q':
broadcast(CHATMASTER_ID,"Goodbye to "+login+"@"+clientIP);
close();
return;//ChatHandler结束


// case Chat.CMD_BCAST:
case 'b':
if(login!=null)
broadcast(login,line);
else
log("B<L FROM"+clientIP);
break;

default:
log("Unknow cmd"+c+"from"+login+"@"+clientIP);
}
}
}catch(IOException e){
log("IO Exception :"+e);
}finally{
//sock 结束,我们完成了
//还不能发送再见的消息
//得有简单的基于命令的协议才行
System.out.println(login+SEP+"All Done");
synchronized(clients){
clients.remove(this);
if(clients.size()==0){
System.out.println(CHATMASTER_ID+SEP+
"I'm so lonely I could cry>>>>>");
}else if(clients.size()==1){
ChatHandler last=(ChatHandler)clients.get(0);
last.send(CHATMASTER_ID,"Hey,you are talking to yourself again");
}
else{
broadcast(CHATMASTER_ID,"There are now"+clients.size()+" users");
}
}
}
}




protected void close(){
if(clientSock==null){
log("close when not open");
return;
}
try{
clientSock.close();
clientSock=null;
}catch(IOException e){
log("Failure during close to "+clientIP);
}
}


//发送一条消息给用户
public void send(String sender,String mesg){
pw.println(sender+SEP+"*>"+mesg);
}

//发送私有的消息
protected void psend(String sender ,String msg){
send("",msg);
}



//发送一条消息给所有的用户
public void broadcast (String sender,String mesg){
System.out.println("Broadcasting"+sender+SEP+mesg);
for(int i=0;i<clients.size();i++){
ChatHandler sib=(ChatHandler)clients.get(i);
if(DEBUG)
System.out.println("Sending to"+sib);
sib.send(sender,mesg);
}

if(DEBUG) System.out.println("Done broadcast");
}


protected ChatHandler lookup(String nick){
synchronized(clients){
for(int i=0;i<clients.size();i++){
ChatHandler cl=(ChatHandler)clients.get(i);
if(cl.login.equals(nick))
return cl;
}
}
return null;
}


//将ChatHandler对象转换成一个字符串
public String toString(){
return "ChatHandler["+login+"]";
}


}


}


public class ChatParameter {
public static final char CMD_BCAST='b';
public static final char CMD_LOGIN='l';
public static final char CMD_MESG='m';
public static final char CMD_QUIT='q';
public static final char SEPARATOR=':';//?????
public static final int PORTNUM=7777;

public boolean isValidLoginName(String line){
if (line.equals("CHATMASTER_ID"))
return false;
return true;
}


public void main(String[] argv){
}
}
由于界面原因 所以比较乱 全部复制出去 重新整理一下就行了/

也不知道怎么说怎么用,我写的代码,很久了,用的是awt,感觉Java在应用程序上没前景所以就没在深入了……现在主攻J2ee,代码给你,你自己感觉吧
服务端:
import java.io.*;
import java.net.*;
import java.util.*;
public class ChatServer {
boolean started = false;
ServerSocket ss = null;
List<Client> clients = new ArrayList<Client>();
public static void main(String[] args) {
new ChatServer().start();
}
public void start() {
try {
ss = new ServerSocket(8888);
started = true;
} catch (BindException e) {
System.out.println("端口使用中....");
System.out.println("请关掉相关程序并重新运行服务器!");
System.exit(0);
} catch (IOException e) {
e.printStackTrace();
}
try {
while(started) {
Socket s = ss.accept();
Client c = new Client(s);
System.out.println("a client connected!");
new Thread(c).start();
clients.add(c);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

class Client implements Runnable {
private Socket s;
private DataInputStream dis = null;
private DataOutputStream dos = null;
private boolean bConnected = false;

public Client(Socket s) {
this.s = s;
try {
dis = new DataInputStream(s.getInputStream());
dos = new DataOutputStream(s.getOutputStream());
bConnected = true;
} catch (IOException e) {
e.printStackTrace();
}
}

public void send(String str) {
try {
dos.writeUTF(str);
} catch (IOException e) {
e.printStackTrace();
}
}

public void run() {
try {
while(bConnected) {
String str = dis.readUTF();
System.out.println(str);
for(int i=0; i<clients.size(); i++) {
Client c = clients.get(i);
c.send(str);
}
}
} catch (EOFException e) {
System.out.println("Client closed!");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(dis != null) dis.close();
if(dos != null) dos.close();
if(s != null) {
s.close();
//s = null;
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
}

}
}
客户端,开两个就能聊了……
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

public class ChatClient extends Frame {
Socket s = null;
DataOutputStream dos = null;
DataInputStream dis = null;
private boolean bConnected = false;
TextField tfTxt = new TextField();
TextArea taContent = new TextArea();
Thread tRecv = new Thread(new RecvThread());
public static void main(String[] args) {
new ChatClient().launchFrame();
}

public void launchFrame() {
setLocation(400, 300);
this.setSize(300, 300);
add(tfTxt, BorderLayout.SOUTH);
add(taContent, BorderLayout.NORTH);
pack();
this.addWindowListener(new WindowAdapter() {

@Override
public void windowClosing(WindowEvent arg0) {
disconnect();
System.exit(0);
}

});
tfTxt.addActionListener(new TFListener());
setVisible(true);
connect();

tRecv.start();
}

public void connect() {
try {
s = new Socket("127.0.0.1", 8888);
dos = new DataOutputStream(s.getOutputStream());
dis = new DataInputStream(s.getInputStream());
System.out.println("connected!");
bConnected = true;
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

}

public void disconnect() {
try {
dos.close();
dis.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}

}

private class TFListener implements ActionListener {

public void actionPerformed(ActionEvent e) {
String str = tfTxt.getText().trim();
tfTxt.setText("");

try {
dos.writeUTF(str);
dos.flush();
} catch (IOException e1) {
e1.printStackTrace();
}

}

}

private class RecvThread implements Runnable {

public void run() {
try {
while(bConnected) {
String str = dis.readUTF();

taContent.setText(taContent.getText() + str + '\n');
}
} catch (SocketException e) {
System.out.println("�˳��ˣ�bye!");
} catch (IOException e) {
e.printStackTrace();
}

}

}
}

这样的,有 的

你要做什么?我这有一个

俺有 怎么给 see my  name

你好,带着你这个问题,百度搜一下,有很多下载的。


海伦市13912632002: JAVA 问题,用socket编写一个客户端程序 -
骑货二十: 给你一个我写的示例,用的是基于TCP的Socket技术,你锻炼一下,改一改,不会改再找我!客户端:import java.net.Socket; import java.io.InputStream; import java.io.OutputStream; import java.io.InputStreamReader; import java.io....

海伦市13912632002: 通过java编程中socket应用,编写一个基于c/s架构的局域网通信软件, -
骑货二十: // 服务器端 import java.io.*; import java.net.*; import java.util.*; public class ChatServer { boolean started = false; ServerSocket ss = null; Socket socket = null; List clients = new ArrayList(); public static void main(String[] args) { new ChatServer().start()...

海伦市13912632002: 利用Java编写一个程序利用Socket和ServerSocket类,实现网络的点对点文件传输 -
骑货二十: 客户端代码:package net; import java.net.*; import java.io.*; public class Client { private Socket clientEndPoint; private InputStream in; private OutputStream out; public void connectToService() throws IOException, InterruptedException { ...

海伦市13912632002: 大家给我写一个java socket的简单例子 -
骑货二十: 客户端的.String ip = "172.31.1.130";ip = "127.0.0.1";int port = 10004;try {Socket socket = new Socket(ip, port);socket.setSoTimeout(5539900);java.io.OutputStream out = socket.getOutputStream(); byte[] date = "hello world"....

海伦市13912632002: java socket 帮写一个将字符串写入服务器的例子,不要System.in -
骑货二十: 字符更简单啊;BufferedReader line = new BufferedReader(new InputStreamReader(System.in)); out.println(line.readLine()); 这个表示从命令行输入.如果要直接发送字符.直接将上面替换成这样:String str=""; out.println(str); 就可以了

海伦市13912632002: 用java写一个socket的服务器在电脑上运行 -
骑货二十: 理论上可以,同在一个局域网,

海伦市13912632002: 求一个简单JAVA, socket 客户端 . -
骑货二十: 给你一个简单的示例代码吧.服务器,客户端的都有.客户端:import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; import java.util.Date; public class ...

海伦市13912632002: 求一个用java socket编写的聊天室程序,能运行的附带源码,要有教程一起发过来吧,邮箱hogsdi112@163.com -
骑货二十: import java.net.*; import java.io.*; import java.util.*; public class ChatRoomServer { public static void main(String[] args) throws Exception{ ServerSocket ss=new ServerSocket(8000); List sockets=new ArrayList(); while(true){ Socket s=ss.accept(); ...

海伦市13912632002: 求一个用java socket编写的聊天室程序,能运行的附带源码,有客户端和服务器端 -
骑货二十: 也不知道怎么说怎么用,我写的代码,很久了,用的是awt,感觉Java在应用程序上没前景所以就没在深入了……现在主攻J2ee,代码给你,你自己感觉吧服务端:import java.io.*;import java.net.*;import java.util.*;public class ChatServer { ...

海伦市13912632002: 求一个Java socket写的邮件收发,实现真实的邮件收发, 不要javamail!急求大神解答~ -
骑货二十: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; import java.net....

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网