一、窗口的制作;因为有了myeclipse所以窗口界面的制作就不需要手工写代码了。下面是我做的效果图:
二、界面做出来了,接下来就是写实现功能的代码了。
首先,整理下思路,我们想实现点对点的聊天,功能像QQ那样随意的发信息(这是想实现的功能)。要传输数据就涉及到网络编程。这里我是通过JAVA的socket实现。我们想发送信息,我们就得有发送信息的代码;
我的代码如下:
String host=txtF1.getText();
int port=Integer.parseInt(txtF2.getText());
try {
Socket client=new Socket(host,port);
Writer wt=new OutputStreamWriter(client.getOutputStream());
wt.write(txtare2.getText());
wt.flush();
wt.close();
client.close();
txtare2.setText(null);
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
System.out.println("服务器连接失败!");
}
我们还想接收消息,我们就得监听端口将发送过来的信息读取出来然后传给textare控件;我的代码如下:
int port ;
port =Integer.parseInt(txtF.getText());
ServerSocket server;
Socket socket;
String line;
BufferedReader br;
try {
server = new ServerSocket(port);
do{
System.out.println("服务已启动!");
socket = server.accept();
br = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
line = br.readLine();
txtare.append("客户端:"+line+"\n");
txtare.paintImmediately(txtare.getBounds());
if(line.equals("exit")){
server.close();
System.out.println("服务已关闭!");
break;
}
}while(true);
socket.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
上面就是我实现这两个功能的代码;下面是所有的代码。
主类代码:
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.net.*;
import java.io.*;
public class ChatRooms {
private JFrame frame;
private JTextField txtF1;
private JTextField txtF2;
private JTextArea txtare1;
private JTextArea txtare2;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ChatRooms window = new ChatRooms();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public ChatRooms() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
JLabel lblNewLabel = new JLabel("IP\u5730\u5740\uFF1A");
lblNewLabel.setBounds(10, 10, 54, 15);
frame.getContentPane().add(lblNewLabel);
txtF1 = new JTextField();
txtF1.setText("127.0.0.1");
txtF1.setBounds(55, 7, 90, 21);
frame.getContentPane().add(txtF1);
txtF1.setColumns(10);
JLabel lblNewLabel_1 = new JLabel("\u7AEF\u53E3\uFF1A");
lblNewLabel_1.setBounds(177, 10, 54, 15);
frame.getContentPane().add(lblNewLabel_1);
txtF2 = new JTextField();
txtF2.setText("8898");
txtF2.setBounds(215, 7, 66, 21);
frame.getContentPane().add(txtF2);
txtF2.setColumns(10);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(10, 36, 414, 274);
frame.getContentPane().add(scrollPane);
txtare1 = new JTextArea();
scrollPane.setViewportView(txtare1);
JScrollPane scrollPane_1 = new JScrollPane();
scrollPane_1.setBounds(10, 332, 414, 83);
frame.getContentPane().add(scrollPane_1);
txtare2 = new JTextArea();
scrollPane_1.setViewportView(txtare2);
JButton btnNewButton = new JButton("\u5173\u95ED");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
btnNewButton.setBounds(153, 428, 93, 23);
frame.getContentPane().add(btnNewButton);
JButton btnNewButton_1 = new JButton("\u53D1\u9001");
btnNewButton_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//------------------------------------------------------------------------------------------------
String host=txtF1.getText();
int port=Integer.parseInt(txtF2.getText());
try {
Socket client=new Socket(host,port);
Writer wt=new OutputStreamWriter(client.getOutputStream());
wt.write(txtare2.getText());
wt.flush();
wt.close();
client.close();
txtare2.setText(null);
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
System.out.println("服务器连接失败!");
}
}
//---------------------------------------------------------------------------------------------------------
});
btnNewButton_1.setBounds(294, 428, 93, 23);
frame.getContentPane().add(btnNewButton_1);
JButton btnNewButton_2 = new JButton("\u542F\u52A8\u670D\u52A1");
btnNewButton_2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ServerThread st=new ServerThread(txtare1,txtF2);
st.start();
}
});
btnNewButton_2.setBounds(331, 6, 93, 23);
frame.getContentPane().add(btnNewButton_2);
}
}
端口监听与信息的代码我放在创建的一个线程类里面;代码如下:
import java.io.*;
import java.net.*;
import javax.swing.*;
import javax.swing.JTextArea;
public class ServerThread extends Thread {
JTextArea txtare;
JTextField txtF;
public ServerThread(JTextArea txtare1,JTextField txtFile){
this.txtare=txtare1;
this.txtF=txtFile;
}
@Override
public void run() {
// TODO Auto-generated method stub
int port ;
port =Integer.parseInt(txtF.getText());
ServerSocket server;
Socket socket;
String line;
BufferedReader br;
try {
server = new ServerSocket(port);
do{
System.out.println("服务已启动!");
socket = server.accept();
br = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
line = br.readLine();
txtare.append("客户端:"+line+"\n");
txtare.paintImmediately(txtare.getBounds());
if(line.equals("exit")){
server.close();
System.out.println("服务已关闭!");
break;
}
}while(true);
socket.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
以上就是我学习JAVA的socket编程所制作的简易聊天室,新手程序猿。不足之处还望多多交流指导。
转载请注明出处!