//【例10.2】 采用Socket通信实现的聊天室程序。
//① 聊天室的图形用户界面程序import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;public class ChatJFrame extends JFrame implements ActionListener
{
private JTextArea text_receiver; //显示对话内容的文本区
private JTextField text_sender; //输入发送内容的文本行
private PrintWriter cout; //字符输出流对象
private String name; //网名
public ChatJFrame(String name, String title, PrintWriter cout) //构造方法
{
super("聊天室 "+name+" "+title);
this.setSize(320,240);
this.setLocation(300,240);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.text_receiver = new JTextArea();
this.text_receiver.setEditable(false); //不可编辑
this.add(this.text_receiver);
JPanel panel = new JPanel();
this.add(panel,"South");
this.text_sender = new JTextField(12);
panel.add(this.text_sender);
this.text_sender.addActionListener(this); //注册单击事件监听器 JButton button_send = new JButton("发送");
panel.add(button_send);
button_send.addActionListener(this); JButton button_leave = new JButton("离线");
panel.add(button_leave);
button_leave.addActionListener(this); this.setVisible(true);
this.setWriter(cout);
this.name = name;
}
public ChatJFrame()
{
this("","",null);
} public void setWriter(PrintWriter cout) //设置字符输出流对象
{
this.cout = cout;//② Socket通信中的服务端程序import java.net.*;
import java.io.*;public class ChatServerSocket
{
private ChatJFrame chatframe; //聊天室的图形用户界面
private ServerSocket server; //提供TCP连接服务的ServerSocket对象
private Socket client; //与客户端通信的Socket对象
public ChatServerSocket(int port, String name) //约定端口号、网名
{
try
{
server = new ServerSocket(port); //创建ServerSocket对象,提供TCP连接服务
client = server.accept(); //等待接收一个客户端的连接申请
//连接成功后返回一个已连接的Socket对象
BufferedReader cin = new BufferedReader(new InputStreamReader(client.getInputStream()));
//获得Socket对象的输入流,创建字符输入流
PrintWriter cout = new PrintWriter(client.getOutputStream(), true);
//获得Socket对象的输出流,创建字符输出流 chatframe = new ChatJFrame(name," 服务端 端口"+port,cout); //创建聊天室的图形用户界面
chatframe.receive("连接 "+cin.readLine()); //接收并显示已连接的对方网名
cout.println(name); //将自己网名发送给对方
String aline = "";
do //从输入流接收对方发来的字符串
{
aline = cin.readLine(); //读取一行字符串,输入流结束时返回null
if (aline!=null && !aline.equals("bye")) //"bye"是约定离线信息
chatframe.receive(aline);
}while (aline!=null && !aline.equals("bye")); chatframe.setWriter(null); //设置聊天室界面的输出流对象为空 cin.close();
cout.close(); client.close(); //关闭Socket连接
server.close(); //停止等候客户端的连接请求
}
catch(IOException e) {}
} public static void main(String args[])
{
new ChatServerSocket(2001,"花仙子"); //约定端口号,指定网名
}
}
//③ Socket通信中的客户端程序import java.net.*;
import java.io.*;public class ChatSocket
{
private ChatJFrame chatframe; //聊天室的图形用户界面
private Socket client; //客户端Socket对象
public ChatSocket(String host, int port, String name) //主机名、端口号、网名
{
try
{
client = new Socket(host,port); //创建一个Socket对象时向指定主机的端口发出TCP连接请求
BufferedReader cin = new BufferedReader(new InputStreamReader(client.getInputStream()));
//获得Socket对象的输入流,创建字符输入流
PrintWriter cout = new PrintWriter(client.getOutputStream(),true);
//获得Socket对象的输出流,创建字符输出流
chatframe = new ChatJFrame(name," 客户端 主机"+host+" 端口"+port,cout);
//创建聊天室的图形用户界面
cout.println(name); //将自己网名发送给对方
chatframe.receive("连接 "+cin.readLine()); //接收并显示已连接的对方网名
String aline = "";
do //从输入流接收对方发来的字符串
{
aline = cin.readLine();
if (aline!=null && !aline.equals("bye")) //"bye"是约定的离线信息
chatframe.receive(aline);
}while (aline!=null && !aline.equals("bye")); chatframe.setWriter(null); //设置聊天室界面的输出流对象为空
cin.close();
cout.close();
client.close(); //关闭Socket连接
}
catch(IOException e) {}
} public static void main(String args[])
{
new ChatSocket("localhost",2001,"小蜜蜂"); //指定主机和端口号,指定网名
}
}问题:要求在此基础上在加入一个客服端。
修改例10.2聊天室程序,增加以下功能:
增加上线功能。离线后,将【离线】按钮变成【上线】,单击可再次申请建立连接。
将文本区中对方和己方的字符串以不同的字体区别显示。
发送带格式的字符串。
增加复制功能,将文本区中的若干选中字符串复制到文本行中。
增加若干图标作为表情,发送表情图标。那位仁兄帮帮忙啊
//① 聊天室的图形用户界面程序import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;public class ChatJFrame extends JFrame implements ActionListener
{
private JTextArea text_receiver; //显示对话内容的文本区
private JTextField text_sender; //输入发送内容的文本行
private PrintWriter cout; //字符输出流对象
private String name; //网名
public ChatJFrame(String name, String title, PrintWriter cout) //构造方法
{
super("聊天室 "+name+" "+title);
this.setSize(320,240);
this.setLocation(300,240);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.text_receiver = new JTextArea();
this.text_receiver.setEditable(false); //不可编辑
this.add(this.text_receiver);
JPanel panel = new JPanel();
this.add(panel,"South");
this.text_sender = new JTextField(12);
panel.add(this.text_sender);
this.text_sender.addActionListener(this); //注册单击事件监听器 JButton button_send = new JButton("发送");
panel.add(button_send);
button_send.addActionListener(this); JButton button_leave = new JButton("离线");
panel.add(button_leave);
button_leave.addActionListener(this); this.setVisible(true);
this.setWriter(cout);
this.name = name;
}
public ChatJFrame()
{
this("","",null);
} public void setWriter(PrintWriter cout) //设置字符输出流对象
{
this.cout = cout;//② Socket通信中的服务端程序import java.net.*;
import java.io.*;public class ChatServerSocket
{
private ChatJFrame chatframe; //聊天室的图形用户界面
private ServerSocket server; //提供TCP连接服务的ServerSocket对象
private Socket client; //与客户端通信的Socket对象
public ChatServerSocket(int port, String name) //约定端口号、网名
{
try
{
server = new ServerSocket(port); //创建ServerSocket对象,提供TCP连接服务
client = server.accept(); //等待接收一个客户端的连接申请
//连接成功后返回一个已连接的Socket对象
BufferedReader cin = new BufferedReader(new InputStreamReader(client.getInputStream()));
//获得Socket对象的输入流,创建字符输入流
PrintWriter cout = new PrintWriter(client.getOutputStream(), true);
//获得Socket对象的输出流,创建字符输出流 chatframe = new ChatJFrame(name," 服务端 端口"+port,cout); //创建聊天室的图形用户界面
chatframe.receive("连接 "+cin.readLine()); //接收并显示已连接的对方网名
cout.println(name); //将自己网名发送给对方
String aline = "";
do //从输入流接收对方发来的字符串
{
aline = cin.readLine(); //读取一行字符串,输入流结束时返回null
if (aline!=null && !aline.equals("bye")) //"bye"是约定离线信息
chatframe.receive(aline);
}while (aline!=null && !aline.equals("bye")); chatframe.setWriter(null); //设置聊天室界面的输出流对象为空 cin.close();
cout.close(); client.close(); //关闭Socket连接
server.close(); //停止等候客户端的连接请求
}
catch(IOException e) {}
} public static void main(String args[])
{
new ChatServerSocket(2001,"花仙子"); //约定端口号,指定网名
}
}
//③ Socket通信中的客户端程序import java.net.*;
import java.io.*;public class ChatSocket
{
private ChatJFrame chatframe; //聊天室的图形用户界面
private Socket client; //客户端Socket对象
public ChatSocket(String host, int port, String name) //主机名、端口号、网名
{
try
{
client = new Socket(host,port); //创建一个Socket对象时向指定主机的端口发出TCP连接请求
BufferedReader cin = new BufferedReader(new InputStreamReader(client.getInputStream()));
//获得Socket对象的输入流,创建字符输入流
PrintWriter cout = new PrintWriter(client.getOutputStream(),true);
//获得Socket对象的输出流,创建字符输出流
chatframe = new ChatJFrame(name," 客户端 主机"+host+" 端口"+port,cout);
//创建聊天室的图形用户界面
cout.println(name); //将自己网名发送给对方
chatframe.receive("连接 "+cin.readLine()); //接收并显示已连接的对方网名
String aline = "";
do //从输入流接收对方发来的字符串
{
aline = cin.readLine();
if (aline!=null && !aline.equals("bye")) //"bye"是约定的离线信息
chatframe.receive(aline);
}while (aline!=null && !aline.equals("bye")); chatframe.setWriter(null); //设置聊天室界面的输出流对象为空
cin.close();
cout.close();
client.close(); //关闭Socket连接
}
catch(IOException e) {}
} public static void main(String args[])
{
new ChatSocket("localhost",2001,"小蜜蜂"); //指定主机和端口号,指定网名
}
}问题:要求在此基础上在加入一个客服端。
修改例10.2聊天室程序,增加以下功能:
增加上线功能。离线后,将【离线】按钮变成【上线】,单击可再次申请建立连接。
将文本区中对方和己方的字符串以不同的字体区别显示。
发送带格式的字符串。
增加复制功能,将文本区中的若干选中字符串复制到文本行中。
增加若干图标作为表情,发送表情图标。那位仁兄帮帮忙啊
连接断开后,将button按钮的显示字符串改掉即可.推荐采用boolean(int也可以)表示离线和上线的两种状态,但处于离线状态的时候,可以干什么,处于上线状态的时候,可以干什么.将文本区中对方和己方的字符串以不同的字体区别显示。
给每个client加一个ID,发消息包的时候将ID含在其中发出去,那么收到包时先判断ID是否为自己,不为自己就换个颜色显示在文本域中发送带格式的字符串。
将字符串的格式信息加在包中,解析的时候多解析下.增加复制功能,将文本区中的若干选中字符串复制到文本行中。
windows的复制功能不够用么?要复制几行就从文本区中读几行出来然后保存在字符串数组里面就可以了.增加若干图标作为表情,发送表情图标。
增加表情库,一个字符串代码对应一个表情(类似于QQ的"/cy"表示笑脸这种)---当然实际上该字符串代码指向的是表情文件存放路径.然后在解析显示的时候,显示的是该路径所放置的图片.