客户端与客户端之间的通信 可显示时间 发送ip 接收ip
package com.donghe.test;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.EmptyBorder;
import net.sf.json.JSONObject;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JTextArea;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JList;
import javax.swing.JLabel;
import java.awt.Label;
public class MyServer extends JFrame {
private DefaultListModel<String> model;
private JPanel contentPane;
private HashMap<String, Socket> sockets;
JTextArea textArea;
private boolean isRunning = true;
public boolean isRunning() {
return isRunning;
}
public void setRunning(boolean isRunning) {
this.isRunning = isRunning;
}
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MyServer frame = new MyServer();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public MyServer() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JButton button = new JButton("启动服务器");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
isRunning = true;
Runnable run = new Runnable() {
@Override
public void run() {
try {
System.out.println("服务器启动");
ServerSocket server = new ServerSocket(8080);
sockets = new HashMap<>();
while (isRunning) {
Socket socket = server.accept();
System.out.println("客户端连接" + socket.getInetAddress().getHostAddress());
String ip = socket.getInetAddress().getHostAddress();
sockets.put(ip, socket);
MyServerReadThread msr = new MyServerReadThread(socket, MyServer.this);
Thread t = new Thread(msr);
t.start();
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
};
Thread t = new Thread(run);
t.start();
}
});
button.setBounds(312, 103, 99, 34);
contentPane.add(button);
textArea = new JTextArea();
textArea.setBounds(10, 228, 292, 24);
contentPane.add(textArea);
JButton button_1 = new JButton("发给客户端");
button_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
button_1.setBounds(312, 228, 99, 24);
contentPane.add(button_1);
JList list = new JList();
list.setBounds(10, 10, 292, 212);
model = new DefaultListModel<>();
list.setModel(model);
JScrollPane scroll = new JScrollPane(list);
scroll.setBounds(10, 10, 292, 212);
contentPane.add(scroll);
}
public void readLine(String line) {
System.out.println("开始解析" + line);
JSONObject obj = JSONObject.fromObject(line);
String type = obj.getString("type");
model.addElement(line);
if (type.equals("toSingle")) {
String to = obj.getString("to");
String msg = obj.getString("message");
String from = obj.getString("from");
String time = obj.getString("time");
Socket toSocket = sockets.get(to);
try {
OutputStream os = toSocket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
bw.write(line + "\n");
System.out.println("服务器推送出去信息");
bw.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
/**
* 服务器发送的信息
*/
package com.donghe.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
public class MyServerReadThread implements Runnable{
private Socket socket;
private MyServer myserver;
public MyServerReadThread(Socket socket,MyServer myserver){
this.socket=socket;
this.myserver=myserver;
}
@Override
public void run() {
while(true){
try {
InputStream is=socket.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
String line=br.readLine();
myserver.readLine(line);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package com.donghe.test;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.EmptyBorder;
import javax.swing.plaf.basic.DefaultMenuLayout;
import net.sf.json.JSONObject;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JTextArea;
import javax.swing.JList;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Calendar;
import java.awt.event.ActionEvent;
import javax.swing.JTextField;
import javax.swing.JTable;
import javax.swing.JLabel;
public class MyClient extends JFrame {
private JPanel contentPane;
private Socket socket;
private JTextArea textArea;
private DefaultListModel<String> model;
private JList list;
private JTextField textField;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MyClient frame = new MyClient();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public MyClient() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JButton btnNewButton = new JButton("发送");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String msg = createMessage();
write(msg);
}
});
btnNewButton.setBounds(314, 216, 93, 36);
contentPane.add(btnNewButton);
textArea = new JTextArea();
textArea.setBounds(10, 216, 283, 36);
/**
* 添加滚动条
*/
JScrollPane scroll2 = new JScrollPane(textArea);
scroll2.setBounds(10, 216, 283, 36);
contentPane.add(scroll2);
textArea.setSelectionEnd(textArea.getText().length());
/**
* 回车发送功能
*/
textArea.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
if (e.getKeyChar() == KeyEvent.VK_ENTER) {
String msg = createMessage();
write(msg);
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
}
});
list = new JList();
list.setBounds(10, 10, 283, 196);
model = new DefaultListModel<>();
list.setModel(model);
JScrollPane scroll = new JScrollPane(list);
scroll.setBounds(32, 10, 261, 183);
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
contentPane.add(scroll);
JButton btnNewButton_1 = new JButton("连接服务器");
btnNewButton_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
System.out.println("连接服务器");
socket = new Socket("192.168.0.52", 8080);
System.out.println("服务器连接成功");
Thread t = new Thread(new MyClientReadThread(MyClient.this, socket));
t.start();
} catch (UnknownHostException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
btnNewButton_1.setBounds(314, 26, 93, 44);
contentPane.add(btnNewButton_1);
textField = new JTextField();
textField.setBounds(320, 185, 87, 21);
contentPane.add(textField);
textField.setColumns(10);
JLabel lblTo = new JLabel("to");
lblTo.setBounds(303, 188, 12, 15);
contentPane.add(lblTo);
}
JSONObject obj = new JSONObject();
public String createMessage() {
String msg = textArea.getText();
obj.put("message", msg);
obj.put("type", "toSingle");
Calendar calendar = Calendar.getInstance();
long time = calendar.getTimeInMillis();
obj.put("time", "" + time);
obj.put("from", socket.getInetAddress().getHostAddress());
obj.put("to", textField.getText());
System.out.println(obj.toString());
return obj.toString();
}
public void readLine(String line) {
JSONObject obj = JSONObject.fromObject(line);
String time = obj.getString("time");
long time1 = Long.parseLong(time);
String msg = obj.getString("message");
String from = obj.getString("from");
String to = obj.getString("to");
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(time1);
model.addElement(calendar.get(Calendar.YEAR) + "/" + calendar.get(Calendar.MONTH) + "/"
+ calendar.get(Calendar.DAY_OF_MONTH) + " " + calendar.get(Calendar.HOUR_OF_DAY) + ":"
+ calendar.get(Calendar.MINUTE) + ":" + calendar.get(Calendar.SECOND) + " " + from + "对" + to + "说"
+ msg);
}
/**
* 发送给服务器
*/
public void write(String msg) {
try {
OutputStream os = socket.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
bw.write(msg + "\n");
Calendar calendar = Calendar.getInstance();
model.addElement(calendar.get(Calendar.YEAR) + "/" + calendar.get(Calendar.MONTH) + "/"
+ calendar.get(Calendar.DAY_OF_MONTH) + " " + calendar.get(Calendar.HOUR_OF_DAY) + ":"
+ calendar.get(Calendar.MINUTE) + ":" + calendar.get(Calendar.SECOND) + " " +socket.getInetAddress().getHostAddress() + "☞☞☞☞☞说" + textArea.getText());
textArea.setText("");
bw.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.donghe.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class MyClientReadThread implements Runnable{
private MyClient myclient;
private Socket socket;
public MyClientReadThread(MyClient myclient,Socket socket){
this.myclient=myclient;
this.socket=socket;
}
@Override
public void run() {
while(true){
try {
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line=br.readLine();
myclient.readLine(line);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}