程序例子
package com.baidu.imSwing;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import java.awt.event.ActionListener;
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.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.awt.event.ActionEvent;
import javax.swing.JTextField;
import javax.swing.JTextArea;
import javax.swing.JList;
/**
* 这个函数的作用是监听所有客户端发送过来的信息,可以将服务端发送过来的信息转发给所有的客户端
* 不能实现客户端之间的通信只能是客户端与服务器之间的通信
* @author Administrator
*
*/
public class MyServer extends JFrame {
private JPanel contentPane;
private Socket socket;
private JTextArea textArea;
private DefaultListModel<String> model;
private ArrayList<Socket> sockets;
private JList list;
private boolean isRuning;
public boolean isRuning() {
return isRuning;
}
public void setRuning(boolean isRuning) {
this.isRuning = isRuning;
}
/**
* 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, 451, 445);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
/**
* 启动服务器,并等待客户端的链接将客户端的端口地址放入ArrayList数组内方便调用
* 并为每个端口创建一个新的线程用于监听该端口发送过来的信息
*/
JButton btnNewButton = new JButton("启动服务");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
isRuning=true;
new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println("服务器启动");
ServerSocket server=new ServerSocket(8080);
sockets=new ArrayList<>();
while(isRuning){
Socket socket= server.accept();
sockets.add(socket);
System.out.println("有连接进入服务器");
Thread myRead=new Thread(new MyServerRead(MyServer.this,socket));
myRead.start();
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
}).start();;
}
});
btnNewButton.setBounds(27, 10, 243, 70);
contentPane.add(btnNewButton);
JButton btnNewButton_1 = new JButton("发送");
btnNewButton_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
try {
model.addElement(InetAddress.getLocalHost().getHostAddress()+textArea.getText());
} catch (UnknownHostException e) {
e.printStackTrace();
}
write();
}
});
btnNewButton_1.setBounds(306, 340, 93, 57);
contentPane.add(btnNewButton_1);
/**
* 创建一个文本输入区,可以通过调用textArea.getText()方法获得文本内容
*/
textArea= new JTextArea();
textArea.setBounds(27, 340, 243, 57);
contentPane.add(textArea);
/**
* 创建一个列表并用默认的DefaultListModel来维护列表
*/
model=new DefaultListModel<>();
list= new JList();
list.setModel(model);
list.setBounds(27, 92, 243, 226);
contentPane.add(list);
}
/**
* 用来读取监听端口的内容
* 将监听到的信息添加到列表上
* @param socket
*/
public void read(Socket socket){
if (socket.isConnected()) {
try {
InputStream is=socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String line=br.readLine();
model.addElement(socket.getInetAddress().getHostAddress() + " " + line);
System.out.println("客户端:"+line);
} catch (IOException e) {
e.printStackTrace();
}
}else{
sockets.remove(socket);
}
}
/**
* 这个方法发送给所有的端口利用了foreach语句
*/
public void write(){
OutputStream os;
try {
for (Socket socket : sockets) {
os = socket.getOutputStream();
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os));
String words=textArea.getText();
bw.write(words+"\n");
bw.flush();
}
textArea.setText("");
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.baidu.imSwing;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import java.awt.event.ActionListener;
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.awt.event.ActionEvent;
import javax.swing.JTextArea;
import javax.swing.JList;
/**
* 这个函数的作用是
* @author Administrator
*
*/
public class MyClient extends JFrame {
private JPanel contentPane;
private Socket socket;
private DefaultListModel<String> modle;
private JTextArea textArea;
private JList list;
/**
* 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, 558);
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) {
write();
}
});
btnNewButton.setBounds(311, 458, 113, 52);
contentPane.add(btnNewButton);
/**
* 文本输入区,可以从调用textArea.getText()方法得到当前输入的文本
*/
textArea= new JTextArea();
textArea.setBounds(21, 458, 260, 52);
contentPane.add(textArea);
/**
* 创建显示列表并建立维护列表的DefaultListModel的模型
*/
list = new JList();
list.setBounds(21, 44, 260, 386);
modle=new DefaultListModel<>();
list.setModel(modle);
contentPane.add(list);
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.113", 8080);
Thread myRead=new Thread(new MyClientRead(MyClient.this));
myRead.start();
} catch (UnknownHostException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
btnNewButton_1.setBounds(311, 41, 113, 52);
contentPane.add(btnNewButton_1);
}
/**
* 从服务器上读取内容并在列表上显示
*/
public void read(){
try {
InputStream is=socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String line=br.readLine();
modle.addElement("服务器说"+line);
System.out.println(line);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 向服务器发送内容并在列表上显示
*/
public void write(){
OutputStream os;
try {
os = socket.getOutputStream();
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os));
String words=textArea.getText();
bw.write(words+"\n");
modle.addElement("客户端说"+words);
textArea.setText("");
bw.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.baidu.imSwing;
import java.net.Socket;
public class MyServerRead implements Runnable{
private Socket socket;
private MyServer server;
public MyServerRead(MyServer server,Socket socket) {
this.server=server;
this.socket=socket;
}
@Override
public void run() {
while(true){
server.read(socket);
}
}
}
package com.baidu.imSwing;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import java.awt.event.ActionListener;
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.awt.event.ActionEvent;
import javax.swing.JTextArea;
import javax.swing.JList;
/**
* 这个函数的作用是
* @author Administrator
*
*/
public class MyClient extends JFrame {
private JPanel contentPane;
private Socket socket;
private DefaultListModel<String> modle;
private JTextArea textArea;
private JList list;
/**
* 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, 558);
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) {
write();
}
});
btnNewButton.setBounds(311, 458, 113, 52);
contentPane.add(btnNewButton);
/**
* 文本输入区,可以从调用textArea.getText()方法得到当前输入的文本
*/
textArea= new JTextArea();
textArea.setBounds(21, 458, 260, 52);
contentPane.add(textArea);
/**
* 创建显示列表并建立维护列表的DefaultListModel的模型
*/
list = new JList();
list.setBounds(21, 44, 260, 386);
modle=new DefaultListModel<>();
list.setModel(modle);
contentPane.add(list);
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.113", 8080);
Thread myRead=new Thread(new MyClientRead(MyClient.this));
myRead.start();
} catch (UnknownHostException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
btnNewButton_1.setBounds(311, 41, 113, 52);
contentPane.add(btnNewButton_1);
}
/**
* 从服务器上读取内容并在列表上显示
*/
public void read(){
try {
InputStream is=socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String line=br.readLine();
modle.addElement("服务器说"+line);
System.out.println(line);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 向服务器发送内容并在列表上显示
*/
public void write(){
OutputStream os;
try {
os = socket.getOutputStream();
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os));
String words=textArea.getText();
bw.write(words+"\n");
modle.addElement("客户端说"+words);
textArea.setText("");
bw.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}