您的位置:首页 > 编程语言

自学风雨路(代码学习,附上运行截图)《简易在线聊天系统》

2012-05-04 13:58 288 查看

ChatServer:

import java.net.*;
import java.util.*;
import java.io.*;

public class ChatServer {

DataInputStream is = null;
ServerSocket ss = null;
List<Client> Clients = new ArrayList<Client>();
DataOutputStream os = null;

public static void main(String[] args) {
new ChatServer().start();

}
//开启Server,准备接受连接
public void start() {

boolean started = false;

try {
ss = new ServerSocket(8888);
started = true;
int i = 0;
while (started) {
Socket s = ss.accept();
Client c = new Client(s);
Clients.add(c);
new Thread(c).start();
System.out.println("第" + ++i + "个Client connected!");

}
} catch (BindException e) {
System.out.println("Server is busy!");
System.out.println("请关掉程序重新启动服务器!");
System.exit(0);
} catch (IOException e) {
e.printStackTrace();
}

}

class Client implements Runnable {
private boolean connect = false;
private Socket s;

Client(Socket s) {
this.s = s;
connect = true;
try {
is = new DataInputStream(s.getInputStream());
os = new DataOutputStream(s.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
//发送接受到的消息到Client
public void send(String str) {
try {
os.writeUTF(str);
} catch (IOException e) {
e.printStackTrace();
}
}

public void run() {
int i = 0;
try {
while (connect) {
String str = is.readUTF();
System.out.println(str);
for (int j = 0; j < Clients.size(); j++) {
Client c = Clients.get(j);//把消息发到每一个连接到服务器的Client
c.send(str);
// System.out.println("Nomale!");
}
}
} catch (Exception e) {
// e.printStackTrace();
System.out.println("有" + ++i + "个Client is closed!");
} finally {
try {
if (ss != null)
ss.close();
if (is != null)
is.close();
if (os != null)
os.close();
} catch (EOFException e) {
System.out.println("第" + ++i + "个Client is closed!");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

}

}

}
}


ChatClient

import java.awt.*;
import java.io.*;
import java.awt.event.*;

import java.net.*;

public class ChatClient {
public static void main(String[] args) {
new MyChatFrame("MyChatTest");
}
}
//这里是new一个窗口出来,设置其参数
class MyChatFrame extends Frame {
TextField Text1 = new TextField("我是输入框");
TextArea Area1 = new TextArea("");
Button But1 = new Button("发送");
Socket soc = null;
DataOutputStream os = null;
DataInputStream is = null;
boolean bconnect = false;
Thread tRecv = new Thread(new Receve());

MyChatFrame(String s) {
int width, height;
width = Toolkit.getDefaultToolkit().getScreenSize().width;
height = Toolkit.getDefaultToolkit().getScreenSize().height;
setSize(500, 500);
this.setLocation((width - 500) / 2, (height - 500) / 2);
setBackground(Color.white);
setResizable(false);
add(Text1, BorderLayout.SOUTH);
add(Area1, BorderLayout.NORTH);
add(But1, BorderLayout.EAST);
Text1.addActionListener(new TextFieldListener());
// But1.addActionListener(new ButtonListener());
pack();
setVisible(true);
//设置监听,当点击红色×时能够退出
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
disconnect();
System.exit(0);
}

});
connect();
tRecv.start();
}
//监听TextField,如果有动作就写东西到Server
private class TextFieldListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
String s = Text1.getText();
// Area1.setText(s);
Text1.setText("");
try {
os.writeUTF(s);
os.flush();
// os.close();

} catch (IOException e1) {
e1.printStackTrace();
}
}

}
//以下是Button监听器
/*
* private class ButtonListener implements ActionListener { public void
* actionPerformed(ActionEvent e) { String s = Text1.getText();
* Area1.setText(s); Text1.setText(""); try {
*
* DataOutputStream os = new DataOutputStream( soc.getOutputStream());
* os.writeUTF(s); os.flush(); os.close();
*
* } catch (IOException e1) { e1.printStackTrace(); } }
*
* }
*/
//连接Server
public void connect() {
try {
soc = new Socket("127.0.0.1", 8888);
os = new DataOutputStream(soc.getOutputStream());
is = new DataInputStream(soc.getInputStream());
System.out.println("Client OK");
bconnect = true;
} catch (IOException e) {
e.printStackTrace();
}
}
//起线程,接受服务器发来的消息,应该是这里有问题
private class Receve implements Runnable {

public void run() {
try {
while (bconnect) {
String str = is.readUTF();
// System.out.println(str);
Area1.setText(Area1.getText() + str + '\n');
}

} catch (SocketException e) {
System.out.println("退出了,bye!");
} catch (IOException e) {
e.printStackTrace();
}

}

}
//断开链接
public void disconnect() {
try {
os.close();
soc.close();
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}







                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息