基于TCP的双向聊天

先运行服务端,再运行客户端。
效果图:
在这里插入图片描述
在这里插入图片描述

客户端

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;
import javax.swing.plaf.TextUI;

/* 基于TCP协议的Socket编程
 * 双向通信
 * 通过IO流传输数据
 */
//客户端
public class MyChat1 extends JFrame{
	
	private static final long serialVersionUID = 1L;
	
	private PrintWriter writer;  //输出流  
	private BufferedReader br;   //输入流 

	private ServerSocket server; //ServerSocket
	Socket socket;    //ServerSocket生成的Socket
	
	private JTextArea ta = new JTextArea();  
	private JTextArea tf = new JTextArea();
	
	Container cc;
	
	public MyChat1(String title) {
		
		super(title);
		
		//JFrame布局与一些组件的设置
		setLayout(new GridLayout(2,1));
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		cc = this.getContentPane();
		ta.setFocusable(false);
		ta.setLineWrap(true);
		tf.setLineWrap(true);
		
		Font f1 = new Font("等线", 50, 20);
		ta.setFont(f1);
		tf.setFont(f1);
		
		//设置聊天显示界面
		final JScrollPane scrollPane1 = new JScrollPane();
		scrollPane1.setBorder(new LineBorder(Color.gray,1));
		getContentPane().add(scrollPane1,BorderLayout.CENTER);
		scrollPane1.setViewportView(ta);
		
		//输入界面的一些设置:p = p1 + p2
		JPanel p = new JPanel();
		p.setLayout(new BorderLayout());
		JPanel p1 = new JPanel();
		JPanel p2 = new JPanel(new BorderLayout());
		
		p1.setBackground(Color.white);
		//发送按钮
		JButton btn1 = new JButton("发送");
		Color btnBag = new Color(71,200,248);
		btn1.setBackground(btnBag);
		btn1.setFont(new Font("宋体",15,15));
		btn1.setForeground(Color.white);
		
		//清空按钮
		JButton btn2 = new JButton("清空");
		btn2.setBackground(Color.white);
		btn2.setFont(new Font("宋体",15,15));
		
		JLabel lab1 = new JLabel("                                                                ");
		JLabel lab2 = new JLabel("                                                                ");
		
		//聊天输入界面布局
		p1.add(lab1);
		p1.add(lab2);
		p1.add(btn1);
		p1.add(btn2);
		
		p2.add(tf,BorderLayout.CENTER);
		
		p.add(p2,BorderLayout.CENTER);
		p.add(p1,BorderLayout.SOUTH);
		cc.add(p,BorderLayout.SOUTH);
		
		//绑定事件
		btn1.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				writer.println(tf.getText());
				if(!"".equals(tf.getText())) {	
					ta.append("我:"+tf.getText()+"\n");
				}
				ta.setSelectionEnd(ta.getText().length());
				tf.setText("");
			}
			
		});
		
		btn2.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				tf.setText("");
			}
		});
		
	}
	
	//等待连接 - 获取输入输出流 - 接收信息
	void getServer() throws IOException {
		server = new ServerSocket(8866);
		System.out.println("成功创建套接字连接");
		while(true) {
			System.out.println("等待客户端连接");
			socket = server.accept();
			br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			writer = new PrintWriter(socket.getOutputStream(),true);
			getClientMessage();
		}
	}
	
	//接收信息
	void getClientMessage() throws IOException {
		
		while(true) {
			String text = br.readLine();
			if(!"".equals(text)) {
				ta.append("对方:"+text+"\n");
			}
			if("exit".equals(text)) {
				break;
			}
		}
		
		if(br != null) {
			br.close();
		}
		if(socket != null) {
			socket.close();
		}
	}
	
	public static void main(String[] args) throws UnknownHostException, IOException {
		MyChat1  clien = new MyChat1("QQ");
		clien.setSize(610,630);
		clien.setVisible(true);
		clien.getServer();
	}
}

服务端

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.border.LineBorder;

public class MyChat2 extends JFrame {
	private PrintWriter writer;  //输出流
	private BufferedReader br;   //输入流

	Socket socket;    //ServerSocket生成的Socket
	
	private JTextArea ta = new JTextArea();  
	private JTextArea tf = new JTextArea();
	
	Container cc;
	
	public MyChat2(String title) {
		
super(title);
		
		//JFrame布局与一些组件的设置
		setLayout(new GridLayout(2,1));
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		cc = this.getContentPane();
		ta.setFocusable(false);
		ta.setLineWrap(true);
		tf.setLineWrap(true);
		
		Font f1 = new Font("等线", 50, 20);
		ta.setFont(f1);
		tf.setFont(f1);
		
		//设置聊天显示界面
		final JScrollPane scrollPane1 = new JScrollPane();
		scrollPane1.setBorder(new LineBorder(Color.gray,1));
		getContentPane().add(scrollPane1,BorderLayout.CENTER);
		scrollPane1.setViewportView(ta);
		
		//输入界面的一些设置:p = p1 + p2
		JPanel p = new JPanel();
		p.setLayout(new BorderLayout());
		JPanel p1 = new JPanel();
		JPanel p2 = new JPanel(new BorderLayout());
		
		p1.setBackground(Color.white);
		//发送按钮
		JButton btn1 = new JButton("发送");
		Color btnBag = new Color(71,200,248);
		btn1.setBackground(btnBag);
		btn1.setFont(new Font("宋体",15,15));
		btn1.setForeground(Color.white);
		
		//清空按钮
		JButton btn2 = new JButton("清空");
		btn2.setBackground(Color.white);
		btn2.setFont(new Font("宋体",15,15));
		
		JLabel lab1 = new JLabel("                                                                ");
		JLabel lab2 = new JLabel("                                                                ");
		
		//聊天输入界面布局
		p1.add(lab1);
		p1.add(lab2);
		p1.add(btn1);
		p1.add(btn2);
		
		p2.add(tf,BorderLayout.CENTER);
		
		p.add(p2,BorderLayout.CENTER);
		p.add(p1,BorderLayout.SOUTH);
		cc.add(p,BorderLayout.SOUTH);
		
		//绑定事件
		btn1.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				writer.println(tf.getText());
				if(!"".equals(tf.getText())) {	
					ta.append("我:"+tf.getText()+"\n");
				}
				ta.setSelectionEnd(ta.getText().length());
				tf.setText("");
			}
			
		});
		
		btn2.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				tf.setText("");
			}
		});
		
	}

	
	private void connect() throws UnknownHostException, IOException {
		ta.append("尝试连接\n");
		socket = new Socket("localhost",8866);
		writer = new PrintWriter(socket.getOutputStream(),true);
		ta.append("连接完成\n");
		br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		getClientMessage();
	}
	
	void getClientMessage() throws IOException {
		
		while(true) {
			String text = br.readLine();
			if("exit".equals(text)) {
				break;
			}
			if(!"".equals(text)) {
				ta.append("对方:"+text+"\n");
			}
			writer.println(tf.getText());
			
		}
		
		if(br != null) {
			br.close();
		}
		if(socket != null) {
			socket.close();
		}
	}
	
	public static void main(String[] args) throws UnknownHostException, IOException {
		MyChat2 mychat2 = new MyChat2("QQ");
		mychat2.setSize(600,500);
		mychat2.setVisible(true);
		mychat2.connect();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值