📄 66.txt
字号:
// 聊天器 可作 服务端 ,也可作客户端.
// 菜单 文件
// 菜单 设置:( 服务器) 建立连接 ----(客户端)连接服务器
// 可重用 网络输入、输出两个 线程
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.net.*;
import java.io.*;
import javax.swing.border.*;
//
public class TalkShow
{
public static void main(String[] args)
{
show = new JTextArea(8,24); // initiasize
box = new JComboBox();
message = new JTextField(20);
frame = new ChatFrame(message,show,box); // creat frame
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
menuBar menu = new menuBar();
menu.setFont(new Font("宋体",Font.PLAIN,16)); // create menu
frame.setJMenuBar(menu);
frame.setVisible(true);
frame.setResizable(false);
}
private static JFrame frame;
public static String ipAddress = "192.168.0.32";
public static final int PORT = 911;
private static JTextField message; // write msg
private static JTextArea show; // show talking context
private static JComboBox box; // talker
public static boolean sign; // flag to interrupt
public static void startThread(Socket socket) // start two Thread
{
sendTalk r1 = new sendTalk(socket,message,show,box); //r1 send msg
getTalk r2 = new getTalk(socket,message,show); //r2 show msg
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
}
public static void setHost()
{
ipAddress = JOptionPane.showInputDialog("设置主机IP:");
}
public static void newLink() // Server new a Link for waiting Client to link
{
TalkShow.sign=true;
ServerSocket s=null;
Socket socket=null;
try
{
s = new ServerSocket(PORT); // create ServerSocket
show.append("等待客户端.......");
socket = s.accept();
show.append("客户端已连入\n");
show.append("----- 聊天 开始 ----server---\n");
}catch(IOException e){
e.printStackTrace();
}
box.addItem("布什:");
box.addItem("萨达姆:");
startThread(socket); // start socket thread
try{
s.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
public static void linkServer() // link to server
{
TalkShow.sign=true;
Socket s=null;
try{
s = new Socket(ipAddress,PORT);
show.append("已连接服务端......");
show.append("\n------ 聊天 开始 ---client----\n");
}catch(IOException e){}
box.addItem("萨达姆:");
box.addItem("布什:");
startThread(s); // start socket thread
}
public static void interrupt() // interrupt chating
{
TalkShow.sign = false;
message.setText("");
box.removeAll();
}
public static void saveFile() // save chating records
{
FileDialog fd=new FileDialog(frame,"保存文件对话框",FileDialog.SAVE);
fd.setVisible(true);
String filename=fd.getDirectory()+fd.getFile();
File file = new File(filename);
try
{
StringTokenizer st = new StringTokenizer(show.getText(),"\n");
PrintWriter out = new PrintWriter(new FileWriter(file));
while(st.hasMoreElements())
{
out.println(st.nextToken());
}
out.close();
}catch (IOException e)
{
e.printStackTrace();
}
}
}
// define ChatFrame
class ChatFrame extends JFrame // frame style
{
public ChatFrame(JTextField message,JTextArea show,JComboBox box) // initialization Emailframe
{
this.setSize(WIDTH, HEIGHT);
this.setTitle("...局域网聊天 ... ");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocation(250,100);
this.setIconImage(Toolkit.getDefaultToolkit().getImage("about.gif"));
Container contentPane;
contentPane = getContentPane();
show.setFont(new Font("宋体",Font.PLAIN,20));
JScrollPane scroll = new JScrollPane(show);
contentPane.add(scroll,BorderLayout.CENTER);
show.setEditable(false);
show.setLineWrap(true);
msgPanel panel = new msgPanel(message,box);
Border border = BorderFactory.createEtchedBorder();
panel.setBorder(border);
contentPane.add(panel,BorderLayout.SOUTH);
}
public static final int WIDTH = 365;
public static final int HEIGHT = 400;
private JButton send; // set flag true
public static boolean flag = false; // if flag = true ,then send msg
class msgPanel extends JPanel
{
public msgPanel(JTextField message,JComboBox box)
{
this.add(box);
message.setFont(new Font("宋体",Font.PLAIN,20));
this.add(message);
send = new JButton("发送");
send.addActionListener(new
ActionListener()
{
public void actionPerformed(ActionEvent event)
{
ChatFrame.flag =true;
}
});
this.add(send);
}
}
}
class getTalk implements Runnable // Thread 1 read msg
{
Socket s;
JTextArea show;
JTextField message;
public getTalk(Socket s,JTextField message,JTextArea show)
{
this.s = s;
this.show=show;
this.message=message;
}
public void run()
{
try
{
DataInputStream in =new DataInputStream(s.getInputStream());
while (TalkShow.sign) // if sign is true , chating is interrupted
{
String str = in.readUTF();
show.append(str+"\n");
}
in.close();
s.close();
}catch(IOException e){}
show.append("关闭读入....\n");
}
}
class sendTalk implements Runnable //, ActionListener // Thread 2 send msg
{
Socket s;
private JTextField message;
private JTextArea show;
private JComboBox box;
public sendTalk(Socket s,JTextField message,JTextArea show,JComboBox box)
{
this.s = s;
this.message=message;
this.show=show;
this.box=box;
}
public void run()
{
try
{
DataOutputStream out = new DataOutputStream(s.getOutputStream());
while (TalkShow.sign) // if sign is true , chating is interrupted
{
if(ChatFrame.flag) // if sned button is pressed , send msg
{
String s =box.getSelectedItem()+ message.getText();
show.append(s+"\n");
out.writeUTF(s);
out.flush();
ChatFrame.flag=false;
message.setText("");
}
try{
Thread.sleep(700);
}catch(InterruptedException e){}
}
out.close();
s.close();
}catch(IOException e){}
show.append("关闭输出...\n");
}
}
class menuBar extends JMenuBar implements ActionListener // 菜单
{
public menuBar()
{
JMenu File = new JMenu ("文件"); //file menu
saveFile = new JMenuItem("保存记录");
saveFile.addActionListener(this);
File.add(saveFile);
File.addSeparator();
JMenuItem Exit = new JMenuItem ("退出(Exit)",'X');
Exit.addActionListener(this);
File.add(Exit);
this.add(File);
JMenu Option= new JMenu ("启动聊天");
newLink = new JMenuItem ("设为主机(As Server)",'S'); // as a Server
newLink.addActionListener(this);
Option.add(newLink);
Option.addSeparator();
setHost = new JMenuItem ("设置主机IP"); // as a Server
setHost.addActionListener(this);
Option.add(setHost);
linkServer = new JMenuItem ("连接主机(As Client)",'C'); // as a Client ,Link to server
linkServer.addActionListener(this);
Option.add(linkServer);
Option.addSeparator();
interrupt = new JMenuItem ("断开连接"); // as a Client ,Link to server
interrupt.addActionListener(this);
interrupt.setEnabled(false);
Option.add(interrupt );
this.add(Option);
}
JMenuItem setHost;
JMenuItem linkServer;
JMenuItem newLink;
JMenuItem saveFile;
JMenuItem interrupt;
public void actionPerformed(ActionEvent e) // menu Listener
{
String s = e.getActionCommand();
if(s.equals("保存记录"))
{
TalkShow.saveFile();
}
if(s.equals("退出(Exit)"))
{
TalkShow.interrupt();
System.exit(0);
}
if(s.equals("设置主机IP"))
TalkShow.setHost();
if(s.equals("设为主机(As Server)"))
new Thread()
{
public void run()
{
linkServer.setEnabled(false); // 使菜单“建立连接”不可用
newLink.setEnabled(false); // 使菜单"连接服务器”不可用
TalkShow.newLink(); // 创建 ServerSocket
interrupt.setEnabled(true);
}
}.start();
if(s.equals("连接主机(As Client)"))
new Thread()
{
public void run()
{
newLink.setEnabled(false); // 使菜单"连接服务器”不可用
linkServer.setEnabled(false); // 使菜单“建立连接”不可用
TalkShow.linkServer(); // 创建 socket ,连接 ServerSocket
interrupt.setEnabled(true);
}
}.start();
if(s.equals("断开连接"))
{
TalkShow.interrupt(); // 断开双方连接
linkServer.setEnabled(true); // 使菜单可用
newLink.setEnabled(true);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -