这是一个使用Java实现,使用Socket技术实现的简单的聊天工具
使用了简单的IO技术。
package test;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.net.InetAddress;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class ChatWindow extends JFrame {
private JButton sendButton;
private JButton cancelButton;
private JButton receiveButton;
private JTextArea receiveText;
private JTextField sendText;
private JLabel localPort;
private JTextField remoteAddress;
private JTextField remotePort;
private SendThread sendThread;
private ReceiveThread receiveThread;
private void GUIini(){
Container c = this.getContentPane();
c.setLayout(new GridLayout(4, 1));
setSize(400, 500);
//第一个panel
JPanel panel1 = new JPanel(new GridLayout(4, 2));
panel1.setSize(400, 75);
panel1.add(new JLabel("当前机器的IP地址是:"));
try {
panel1.add(new JLabel(InetAddress.getLocalHost().getHostAddress()));
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
panel1.add(new JLabel("当前机器的IP地址是:" + "Unknown"));
}
panel1.add(new JLabel("当前对话的端口是:"));
panel1.add(localPort = new JLabel(""+0));
panel1.add(new JLabel("Remote Host IP Address:"));
remoteAddress = new JTextField();
remoteAddress.setColumns(0);
panel1.add(remoteAddress);
panel1.add(new JLabel("Remote Host Port:"));
remotePort = new JTextField();
remotePort.setColumns(0);
panel1.add(remotePort);
c.add(panel1);
//第二个panel
JPanel panel2 = new JPanel();
panel2.setSize(400,200);
receiveText = new JTextArea(18,30);
receiveText.setEditable(false);
receiveText.setAutoscrolls(true);
panel2.add(receiveText);
c.add(panel2);
//第三个panel
JPanel panel3 = new JPanel();
sendText = new JTextField(18);
sendText.setAutoscrolls(true);
panel3.add(sendText);
c.add(panel3);
//第四个panel
JPanel panel4 = new JPanel(new GridLayout(1, 0));
panel4.setSize(400,20);
receiveButton = new JButton("开始接受数据");
sendButton = new JButton("发送");
cancelButton = new JButton("取消");
panel4.add(receiveButton);
panel4.add(cancelButton);
panel4.add(sendButton);
c.add(panel4);
//四个面板内容设置完毕
setVisible(true);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
private void ActionIni() {
//取消按钮的动作
cancelButton.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
sendText.setText("");
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
});
sendButton.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {
//发送文本
sendThread.senMessage(remoteAddress.getText(), Integer.parseInt(remotePort.getText()), sendText.getText());
receiveText.setText(receiveText.getText() + "\n" + "SEND:" + sendText.getText());
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
});
}
private void ThreadIni() {
// TODO Auto-generated method stub
sendThread = new SendThread(0, this);
receiveThread = new ReceiveThread(this);
}
//构造函数
public ChatWindow() {
GUIini();
ActionIni();
ThreadIni();
}
public void printError(String err){
System.out.println("Error occur:" + err);
}
//回调函数,用于接受从线程中返回的数据
public void setReceive(String receive){
receiveText.setText(receiveText.getText() + "\n" + "RECEIVE:" + receive);
}
//当接受数据的线程开始工作以后,就调用该回调函数,设置当前聊天窗口使用的端口是哪个
public void setLocalPort(int localPortText){
localPort.setText(""+localPortText);
}
//放远,这个是整个程序的起点
public static void main(String[] args) {
// TODO Auto-generated method stub
new ChatWindow();
}
}
package test;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class ReceiveThread extends Thread {
private ServerSocket server;
private ChatWindow window;
public ReceiveThread(ChatWindow window) {
this.window = window;
try {
server = new ServerSocket(0);
window.setLocalPort(server.getLocalPort());
start();
} catch (IOException e) {
// TODO Auto-generated catch block
window.printError("连接出错");
}
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
Socket socket;
try {
socket = server.accept();
InputStreamReader reader = new InputStreamReader(socket.getInputStream());
int c;
StringBuilder sb = new StringBuilder();
while((c = reader.read()) != -1){
sb.append((char)c);
}
window.setReceive(sb.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("线程将接受到的数据写入对话框出错");
}
}
}
}
package test;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
public class SendThread {
ChatWindow chatWindow;
private String remoteIP = "";
private int port = 0;
private String message = "";
public SendThread(int port,ChatWindow window) {
chatWindow = window;
}
public void notRun() {
InetSocketAddress isa = new InetSocketAddress(remoteIP, port);
try {
Socket socket = new Socket();
socket.connect(isa);
OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream());
writer.write(message);
writer.flush();
writer.close();
System.out.println("将数据写入到流中");
} catch (IOException e) {
e.printStackTrace();
}finally{
message = "";
}
}
public void senMessage(String host,int port,String message){
remoteIP = host;
this.port = port;
this.message = message;
notRun();
}
}