文章目录
前言
自己摸索写出来的,利用内网穿透可以实现不同局域网之间实现信息交换,还有一些小问题,待改进
提示:以下是本篇文章正文内容,下面案例可供参考
一、GUIServer
package socket;
import javax.swing.*;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;
import java.awt.*;
import java.awt.event.*;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 服务器端窗口,先运行这个
*/
public class GUIServer {
public static void main(String[] args) {
// 创建窗体
JFrame f = new JFrame("服务器");
f.setLayout(null);
// 设置大小和位置
f.setSize(400, 730);
f.setLocation(100, 200);
JButton b = new JButton("发送");
b.setBounds(290, 620, 80, 30);
f.add(b);
JTextField tf = new JTextField();
tf.setBounds(10, 620, 260, 30);
f.add(tf);
JTextArea ta = new JTextArea();
ta.setBounds(10, 40, 360, 400);
ta.setEditable(false);
JScrollPane scrollPane = new JScrollPane(ta);
scrollPane.setBounds(10, 40, 360, 400);
//f.add(ta);
f.add(scrollPane);
JLabel label = new JLabel("表情:");
label.setBounds(220, 520, 60, 40);
f.add(label);
JComboBox comboBox1 = new JComboBox();
comboBox1.setBounds(260, 520, 60, 40);
comboBox1.addItem("微笑地");
comboBox1.addItem("生气地");
comboBox1.addItem("开心地");
f.add(comboBox1);
JLabel label1 = new JLabel("发送至:");
label1.setBounds(10, 520, 60, 40);
f.add(label1);
JComboBox comboBox2 = new JComboBox();
comboBox2.setBounds(50, 520, 80, 40);
comboBox2.addItem("所有人");
comboBox2.addItem("我");
comboBox2.addItem("127.0.0.1");
comboBox2.addItem("流光");
f.add(comboBox2);
JComboBox comboBox3 = new JComboBox();
comboBox3.setBounds(200, 320, 80, 40);
comboBox3.addItem("127.0.0.1");
comboBox3.addItem("我");
comboBox3.addItem("流光");
JCheckBox checkBox1 = new JCheckBox("悄悄话");
checkBox1.setBounds(300, 560, 80, 40);
f.add(checkBox1);
JMenuBar menuBar = new JMenuBar();// 创建菜单栏对象
f.setJMenuBar(menuBar);// 将菜单栏对象添加到窗体的菜单栏中
JMenu menu = new JMenu("Menu");// 创建菜单对象
menuBar.add(menu);// 将菜单对象添加到菜单栏对象中
JMenuItem menuItem = new JMenuItem("菜单项名称");// 创建菜单项对象
// menuItem.addActionListener(new ItemListener());// 为菜单项添加事件监听器
menu.add(menuItem);// 将菜单项对象添加到菜单对象中
JMenu sonMenu = new JMenu("子菜单名称");// 创建菜单的子菜单对象
menu.add(sonMenu);// 将子菜单对象添加到上级菜单对象中
JMenuItem sonMenuItem = new JMenuItem("子菜单项名称");// 创建子菜单的菜单项对象
// sonMenuItem.addActionListener(new ItemListener());
sonMenu.add(sonMenuItem);// 将子菜单的菜单项对象添加到子菜单对象中
JMenu menu2 = new JMenu("File");// 创建菜单对象
menuBar.add(menu2);// 将菜单对象添加到菜单栏对象中
JMenuItem menuItem2 = new JMenuItem("菜单项名称2");// 创建菜单项对象
// menuItem2.addActionListener(new ItemListener());// 为菜单项添加事件监听器
menu2.add(menuItem2);// 将菜单项对象添加到菜单对象中
JMenu sonMenu2 = new JMenu("子菜单名称2");// 创建菜单的子菜单对象
menu2.add(sonMenu2);// 将子菜单对象添加到上级菜单对象中
JMenuItem sonMenuItem2 = new JMenuItem("子菜单项名称2");// 创建子菜单的菜单项对象
// sonMenuItem2.addActionListener(new ItemListener());// 为菜单项添加事件监听器
sonMenu2.add(sonMenuItem2);// 将子菜单的菜单项对象添加到子菜单对象中
JMenu menu3 = new JMenu("Tools");// 创建菜单对象
menuBar.add(menu3);// 将菜单对象添加到菜单栏对象中
JMenuItem menuItem3 = new JMenuItem("菜单项名称2");// 创建菜单项对象
// menuItem2.addActionListener(new ItemListener());// 为菜单项添加事件监听器
menu2.add(menuItem3);// 将菜单项对象添加到菜单对象中
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.setVisible(true);
tf.requestFocus();
try {
ServerSocket ss=new ServerSocket(8888);
//ServerSocket ss=new ServerSocket();
Socket s=ss.accept();
tf.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 获取输入文本
String text = tf.getText();
String text1 = comboBox1.getSelectedItem().toString();
String text2 = comboBox2.getSelectedItem().toString();
String text4 = "";
if (checkBox1.isSelected()) {
text4 = checkBox1.getText();
}
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("MM-dd HH:mm:ss");
String now = sdf.format(date);
String finalText = text4;
ta.append(now + "\r\n" + "系统消息" + text1 + finalText + "对" + text2 + "说:" + text + "\r\n");//text4
ta.setCaretPosition(ta.getText().length());
// 设置输入框为空
tf.setText("");
// 发送信息
try {
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
dos.writeUTF("系统消息" + text1 + finalText + "对" + text2 + "说:" + text);
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 获取输入文本
String text = tf.getText();
String text1 = comboBox1.getSelectedItem().toString();
String text2 = comboBox2.getSelectedItem().toString();
String text4 = "";
if (checkBox1.isSelected()) {
text4 = checkBox1.getText();
}
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("MM-dd HH:mm:ss");
String now = sdf.format(date);
String finalText = text4;
ta.append(now + "\r\n" + "系统消息" + text1 + finalText + "对" + text2 + "说:" + text + "\r\n");//text4
ta.setCaretPosition(ta.getText().length());
// 设置输入框为空
tf.setText("");
// 发送信息
try {
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
dos.writeUTF("系统消息" + text1 + finalText + "对" + text2 + "说:" + text);
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
// 接收信息线程
new Thread() {
Boolean online=true;
@Override
public void run() {
while (online) {
try {
// 获取其他用户的输入
DataInputStream dis = new DataInputStream(s.getInputStream());
String text = dis.readUTF();
//String ip = s.getInetAddress().getHostAddress();
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("MM-dd HH:mm:ss");
String now = sdf.format(date);
// 添加到页面上
// ta.append(now + "\r\n" + ip + ":" + text + "\r\n");
ta.append(now + "\r\n" + text + "\r\n");
ta.setCaretPosition(ta.getText().length());
} catch (IOException e) {
online=false;
e.printStackTrace();
}
}
}
}.start();
} catch(IOException e)
{
e.printStackTrace();
}
}
}
二、GUIClient
package socket;
import javax.swing.*;
import java.awt.event.*;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 客户端程序
*/
public class GUIClient {
public static <ServletRequestAttributes, HttpServletRequest> void main(String[] args) {
// 创建窗体
JFrame f = new JFrame("客户端");
f.setLayout(null);
// 设置大小和位置
f.setSize(400, 530);
f.setLocation(100, 200);
JButton b = new JButton("发送");
b.setBounds(290, 420, 80, 30);
f.add(b);
JTextField tf = new JTextField();
tf.setBounds(10, 420, 260, 30);
f.add(tf);
JTextArea ta = new JTextArea();
ta.setBounds(10, 40, 360, 200);
ta.setEditable(false);
JScrollPane scrollPane=new JScrollPane(ta);
scrollPane.setBounds(10,40,360,200);
//f.add(ta);
f.add(scrollPane);
JLabel label=new JLabel("表情:");
label.setBounds(280,320,60,40);
f.add(label);
JComboBox comboBox1=new JComboBox();
comboBox1.setBounds(320,320,60,40);
comboBox1.addItem("微笑地");
comboBox1.addItem("生气地");
comboBox1.addItem("开心地");
f.add(comboBox1);
JLabel label1=new JLabel("发送至:");
label1.setBounds(10,320,60,40);
f.add(label1);
JComboBox comboBox2=new JComboBox();
comboBox2.setBounds(50,320,80,40);
comboBox2.addItem("所有人");
comboBox2.addItem("我");
comboBox2.addItem("127.0.0.1");
comboBox2.addItem("流光");
f.add(comboBox2);
JLabel label2=new JLabel("选择用户:");
label2.setBounds(140,320,60,40);
f.add(label2);
JComboBox comboBox3=new JComboBox();
comboBox3.setBounds(200,320,80,40);
comboBox3.addItem("127.0.0.1");
comboBox3.addItem("我");
comboBox3.addItem("流光");
f.add(comboBox3);
JCheckBox checkBox1=new JCheckBox("悄悄话");
checkBox1.setBounds(300,360,80,40);
f.add(checkBox1);
JMenuBar menuBar = new JMenuBar();// 创建菜单栏对象
f.setJMenuBar(menuBar);// 将菜单栏对象添加到窗体的菜单栏中
JMenu menu = new JMenu("Menu");// 创建菜单对象
menuBar.add(menu);// 将菜单对象添加到菜单栏对象中
JMenuItem menuItem = new JMenuItem("菜单项名称");// 创建菜单项对象
// menuItem.addActionListener(new ItemListener());// 为菜单项添加事件监听器
menu.add(menuItem);// 将菜单项对象添加到菜单对象中
JMenu sonMenu = new JMenu("子菜单名称");// 创建菜单的子菜单对象
menu.add(sonMenu);// 将子菜单对象添加到上级菜单对象中
JMenuItem sonMenuItem = new JMenuItem("子菜单项名称");// 创建子菜单的菜单项对象
// sonMenuItem.addActionListener(new ItemListener());
sonMenu.add(sonMenuItem);// 将子菜单的菜单项对象添加到子菜单对象中
JMenu menu2 = new JMenu("File");// 创建菜单对象
menuBar.add(menu2);// 将菜单对象添加到菜单栏对象中
JMenuItem menuItem2 = new JMenuItem("菜单项名称2");// 创建菜单项对象
// menuItem2.addActionListener(new ItemListener());// 为菜单项添加事件监听器
menu2.add(menuItem2);// 将菜单项对象添加到菜单对象中
JMenu sonMenu2 = new JMenu("子菜单名称2");// 创建菜单的子菜单对象
menu2.add(sonMenu2);// 将子菜单对象添加到上级菜单对象中
JMenuItem sonMenuItem2 = new JMenuItem("子菜单项名称2");// 创建子菜单的菜单项对象
// sonMenuItem2.addActionListener(new ItemListener());// 为菜单项添加事件监听器
sonMenu2.add(sonMenuItem2);// 将子菜单的菜单项对象添加到子菜单对象中
JMenu menu3 = new JMenu("Tools");// 创建菜单对象
menuBar.add(menu3);// 将菜单对象添加到菜单栏对象中
JMenuItem menuItem3 = new JMenuItem("菜单项名称2");// 创建菜单项对象
// menuItem2.addActionListener(new ItemListener());// 为菜单项添加事件监听器
menu2.add(menuItem3);// 将菜单项对象添加到菜单对象中
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.setVisible(true);
tf.requestFocus();
try {
//Socket s = new Socket("127.0.0.1", 8888);
Socket s=new Socket("40p56s2784.qicp.vip",20237);
tf.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 获取输入文本
String text = tf.getText();
String text1 = comboBox1.getSelectedItem().toString();
String text2 = comboBox2.getSelectedItem().toString();
String text3=(String)comboBox3.getSelectedItem();
String text4 = "";
if (checkBox1.isSelected()) {
text4 = checkBox1.getText();
}
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("MM-dd HH:mm:ss");
String now = sdf.format(date);
String finalText = text4;
ta.append(now +"\r\n"+text3+ finalText +text1+"对"+text2 + "说:"+text + "\r\n");
ta.setCaretPosition(ta.getText().length());
// 设置输入框为空
tf.setText("");
// 发送信息
try {
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
dos.writeUTF(text3+text4+text1+"对"+text2 + "说:"+text );
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 获取输入文本
String text = tf.getText();
String text1= (String) comboBox1.getSelectedItem();
String text2=(String)comboBox2.getSelectedItem();
String text3=(String)comboBox3.getSelectedItem();
String text4="";
if(checkBox1.isSelected()){
text4=checkBox1.getText();}
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("MM-dd HH:mm:ss");
String now = sdf.format(date);
String finalText = text4;
ta.append(now +"\r\n"+text3+ finalText +text1+"对"+text2 + "说:"+text + "\r\n");
// 设置输入框为空
tf.setText("");
// 发送信息
try {
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
s.shutdownOutput();
dos.writeUTF(text3+text4+text1+"对"+text2 + "说:"+text );
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
try {
// 接收信息线程
new Thread() {
Boolean online=true;
@Override
public void run() {
while (online) {
try {
// 获取其他用户的输入
DataInputStream dis = new DataInputStream(s.getInputStream());
String text = dis.readUTF();
//String ip = s.getInetAddress().getHostAddress();
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("MM-dd HH:mm:ss");
String now = sdf.format(date);
// 添加到页面上
// ta.append(now + "\r\n" + ip + ":" + text + "\r\n");
ta.append(now + "\r\n" + text + "\r\n");
} catch (IOException e) {
// online=false;
e.printStackTrace();
}
}
}
}.start();
}catch (Exception e){
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}