看了一些socket的文章,正好可以用JAVA来尝试,想写一个GUI的点对点聊天程序。
于是赶了两天,断断续续,其中出现一些小波折,毕竟写程序还是需要耐心。
刚写好的GUI界面,因为流传输的问题,而且界面也不是很满意,于是索性将两个写好的类删掉了。重新来写,感觉好了许多。
程序其实是C/S模型的,分为服务端和客户端,现在将代码贴上来,分享一下创作经历。
- //服务端程序
- import java.io.*;
- import java.net.*;
- import java.awt.*;
- import java.awt.event.*;
- import javax.swing.*;
- public class Server extends JFrame implements ActionListener {
- ServerSocket server;
- Socket socket;
- BufferedReader in;
- PrintWriter out;
- JTextField sendText = new JTextField();;
- JTextArea recieveText = new JTextArea(5, 20);
- JScrollPane scrollpane = new JScrollPane(recieveText);
- JLabel label1 = new JLabel("发送内容:");
- JLabel label2 = new JLabel("接收内容:");
- JButton btnSend = new JButton("发送");
- JButton btnClean = new JButton("清除内容");
- public Server() {
- // TODO Auto-generated constructor stub
- super("服务端");
- Container c = getContentPane();
- c.setLayout(new GridLayout(6, 1, 5, 5));
- c.add(label1);
- c.add(sendText);
- c.add(label2);
- c.add(scrollpane);
- c.add(btnSend);
- c.add(btnClean);
- btnSend.addActionListener(this);
- btnClean.addActionListener(this);
- setSize(400, 400);
- setDefaultCloseOperation(Server.EXIT_ON_CLOSE);
- setVisible(true);
- try {
- socket = new Socket();// 创建套接字
- server = new ServerSocket(5005);// 创建服务器端套接字,指定端口为5005
- socket = server.accept();// 让套接字侦听来自客户端的请求
- in = new BufferedReader(new InputStreamReader(socket
- .getInputStream()));// 封装来自套接字的输入流,使其变成字符流
- out = new PrintWriter(socket.getOutputStream());// 生成格式化的套接字输出流的对象
- while (true) {
- String s = in.readLine();// 读取套接字输入流的字符
- recieveText.append("客户机:" + s + "/n/r");
- }// 在文本框中追加服务器端发来的数据
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- new Server();
- }
- public void actionPerformed(ActionEvent e) {
- // TODO Auto-generated method stub
- if (e.getSource() == btnClean) {
- sendText.setText("");
- recieveText.setText("");// 清空文本框的内容
- } else if (e.getSource() == btnSend) {
- out.println(sendText.getText());// 向套接字输出流输入来自发送文本框的数据
- out.flush();// 刷新该缓冲流
- }
- }
- }
- //客户端程序
- import java.io.*;
- import java.net.InetAddress;
- import java.net.ServerSocket;
- import java.net.Socket;
- import java.awt.*;
- import java.awt.event.*;
- import javax.swing.*;
- public class Client extends JFrame implements ActionListener {
- Socket socket;
- BufferedReader in;
- PrintWriter out;
- JTextField sendText = new JTextField();;
- JTextArea recieveText = new JTextArea(5, 20);
- JScrollPane scrollpane = new JScrollPane(recieveText);
- JLabel label1 = new JLabel("发送内容:");
- JLabel label2 = new JLabel("接收内容:");
- JButton btnSend = new JButton("发送");
- JButton btnClean = new JButton("清除内容");
- public Client() {
- // TODO Auto-generated constructor stub
- super("客户端");
- Container c = getContentPane();
- c.setLayout(new GridLayout(6, 1, 5, 5));
- c.add(label1);
- c.add(sendText);
- c.add(label2);
- c.add(scrollpane);
- c.add(btnSend);
- c.add(btnClean);
- btnSend.addActionListener(this);
- btnClean.addActionListener(this);
- setSize(400, 400);
- setDefaultCloseOperation(Server.EXIT_ON_CLOSE);
- setVisible(true);
- try {
- socket = new Socket(InetAddress.getLocalHost(), 5005);// 创建套接字,指定地址和端口
- in = new BufferedReader(new InputStreamReader(socket
- .getInputStream()));// 封装来自套接字的输入流,使其变成字符流
- out = new PrintWriter(socket.getOutputStream());// 生成格式化的套接字输出流的对象
- while (true) {
- String s = in.readLine();// 读取套接字输入流的字符
- recieveText.append("服务器:" + s + "/n/r");// 在文本框中追加服务器端发来的数据
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- new Client();
- }
- public void actionPerformed(ActionEvent e) {
- // TODO Auto-generated method stub
- if (e.getSource() == btnClean) {
- sendText.setText("");// 清空文本框的内容
- recieveText.setText("");
- } else if (e.getSource() == btnSend) {
- out.println(sendText.getText());// 向套接字输出流输入来自发送文本框的数据
- out.flush();// 刷新该流的缓冲
- }
- }
- }