为了实现简单的聊天程序,本文使用了JFrame界面框架,IO输入、输出流,以及相应的socket和监听事件。
首先编写一个具有通信功能的简单界面程序,具体如下:
package chart;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ChatFrame extends JFrame implements ActionListener {
JTextField tf;
JTextArea ta;
JScrollPane sp;
JButton send;
JPanel p;
int port;
String s = "";
String myID;
Date date;
ServerSocket server;
Socket mySocket;
BufferedReader is;
PrintWriter os;
String line;
public ChatFrame(String ID,String remoteID,String IP,int port, boolean isServer){
super(ID);
myID = ID;
this.port= port;
ta = new JTextArea();
ta.setEditable(false);
sp = new JScrollPane(ta);
//设置窗口大小
this.setSize(330,400);
//窗口大小不改变
this.setResizable(false);
try{
//设置显示风格
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch (Exception e){
System.out.println("UI error");
}
//将滚动面板放置在界面的中间位置
this.getContentPane().add(sp,"Center");
//创建一个新的面板p
p = new JPanel();
//p放置在界面的南部
this.getContentPane().add(p,"South");
//创建一个发送按钮
send = new JButton("发送");
//初始化文本区域
tf = new JTextField(20);
tf.requestFocus();
p.add(tf);
p.add(send);
//设置面板是可以退出的
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
//设置整个窗口可显示
this.setVisible(true);
//注册监听器
send.addActionListener(this);
tf.addActionListener(this);
if(isServer){
try{
//充当服务端
server = null;
try{
server = new ServerSocket(port);
}catch (Exception e){
System.out.println("can not listen to:"+e);
}
mySocket =null;
try{
mySocket = server.accept();
}catch(Exception e){
System.out.println("Error:"+e);
}
is = new BufferedReader(new InputStreamReader(mySocket.getInputStream()));
os = new PrintWriter(mySocket.getOutputStream());
}catch(Exception e){
System.out.println("Error:in ser client socket"+e);
}
}else{
try{
//充当客户端
mySocket = new Socket(IP,port);
os = new PrintWriter(mySocket.getOutputStream());
is = new BufferedReader(new InputStreamReader(mySocket.getInputStream()));
}catch (Exception e){
System.out.println("Error;in client socket"+e);
}
}
while(true){
try{
line = is.readLine();
date = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH;mm:ss");
String currentTime = formatter.format(date);
s += currentTime + ""+remoteID+"说:\n"+line+"\n";
ta.setText(s);
}catch (Exception e){
System.out.println("Error:in receive remote information"+e);
}
}
}
@Override
public void actionPerformed(ActionEvent e){
date = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String currentTime = formatter.format(date);
s += currentTime +""+myID+"说:\n"+tf.getText()+"\n";
ta.setText(s);
os.println(tf.getText());
os.flush();
tf.setText("");
tf.requestFocus();
}
}
新建一个服务器程序,具体如下:
package chart;
public class ChatServerFrame {
public static void main(String[] args) {
ChatFrame csever = new ChatFrame("Cat","Dog","127.0.0.1",2009,true);
}
}
新建一个客户端程序,具体如下:
package chart;
public class ChatClientFrame {
public static void main(String[] args) {
ChatFrame cclient = new ChatFrame("Dog","Cat","127.0.0.1",2009,false);
}
}
先运行服务端程序,然后在运行客户端,执行结果如下: