JAVA通过Swing和socket编程实现简易点对点聊天

一、窗口的制作;因为有了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编程所制作的简易聊天室,新手程序猿。不足之处还望多多交流指导。

转载请注明出处!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值