JAVA实现TCP通讯

1.服务器代码

import java.io.*;
import java.net.*;
import javax.swing.*;

public class Server {
	// 服务器端的输入流
	static BufferedReader br;
	// 服务器端的输出流
	static PrintStream ps;
	// 服务器相关的界面组件
	static JTextArea text;
	JFrame frame;

	public Server() {
		// 服务器端的界面的实例化
		JFrame frame = new JFrame("服务器端");
		text = new JTextArea();
		JScrollPane scroll = new JScrollPane(text);
		frame.add(scroll);
		frame.setVisible(true);
		frame.setSize(300, 400);
		// 这里设置服务器端的文本框是不可编辑的
		text.setEditable(false);
	}

	public static void main(String[] args) throws Exception {
		new Server(); // 生成服务器界面
		// 通过服务器端构造函数 ServerSocket(port) 实例化一个服务器端口
		ServerSocket server = new ServerSocket(2000);
		text.append("监听2000端口" + "\n");
		// 实例化一个接受服务器数据的对象
		Socket client = server.accept();
		br = new BufferedReader(new InputStreamReader(client.getInputStream()));
		ps = new PrintStream(client.getOutputStream());
		String msg;
		// 如果输入流不为空,将接受到的信息打印到相应的文本框中并反馈回收到的信息
		while ((msg = br.readLine()) != null) {
			text.append("服务器端收到:" + msg + "\n");
			ps.println(msg);
			if (msg.equals("quit")) {
				text.append("客户端“2000”已退出!" + "\n");
				text.append("服务器程序将退出!");
				break;
			}
		}
		ps.close();
		br.close();
		client.close();
	}
}
2.客户端代码
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import java.net.*;

public class Client implements ActionListener {
	// 这里有两个图形界面,一个是连接的frame,另一个和服务器通信的界面frame1
	private JFrame frame;
	private JLabel adress;
	private JLabel port;
	JTextField adresstext;
	JTextField porttext;
	JButton connect;

	private JFrame frame1;
	private JLabel shuru;
	private JPanel panel1;
	private JPanel panel2;
	private JLabel jieshou;
	JButton send;
	static JTextArea shurukuang;
	static TextArea jieshoukuang;

	// 从服务端接受的数据流
	static BufferedReader br1;
	// 从客户端输出的数据流
	static PrintStream ps;
	// 从通信界面中的输入框接受的数据流
	static BufferedReader br2;
	static Socket client;
	// 将输入框字符串转换为字符串流所需的字符串的输入流
	static ByteArrayInputStream stringInputStream;

	public Client() {
		// 连接界面的实例化
		frame = new JFrame();
		adress = new JLabel("IP 地址");
		port = new JLabel("端口号");
		adresstext = new JTextField("192.168.0.120", 10);
		porttext = new JTextField("8000", 10);
		connect = new JButton("连接");
		// 连接界面的布局
		frame.setLayout(new FlowLayout());
		frame.add(adress);
		frame.add(adresstext);
		frame.add(port);
		frame.add(porttext);
		frame.add(connect);
		frame.setVisible(true);
		frame.setSize(200, 150);
		connect.addActionListener(this);
		// 通信界面的实例化
		frame1 = new JFrame();
		shuru = new JLabel("请输入");
		shurukuang = new JTextArea("请输入····", 5, 40);

		panel1 = new JPanel();
		panel1.add(shuru);
		panel1.add(shurukuang);
		panel1.setLayout(new FlowLayout());

		send = new JButton("发送");
		panel2 = new JPanel();
		jieshou = new JLabel("已接受");

		jieshoukuang = new TextArea(8, 60);
		jieshoukuang.setEditable(false);

		panel2.add(jieshou);
		panel2.add(jieshoukuang);
		panel2.setLayout(new FlowLayout());
		frame1.setLayout(new FlowLayout());
		// 通信界面都的布局
		frame1.add(BorderLayout.NORTH, panel1);
		frame1.add(send);
		frame1.add(BorderLayout.SOUTH, panel2);
		// 连接时通信界面是处于看不到的
		frame1.setVisible(false);
		frame1.setSize(500, 350);
		send.addActionListener(this);
	}

	// 两个界面当中都有相应的按钮时间,为相应的时间添加动作
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == connect) {
			try {
				// 当触发连接按钮时,实例化一个客户端
				client = new Socket("192.168.0.120", 8000);
				// 隐藏连接界面,显示通信界面
				frame.setVisible(false);
				frame1.setVisible(true);
				jieshoukuang.append("已经连接上服务器!" + "\n");
			} catch (IOException e1) {
				System.out.println("链接失败!");
				e1.printStackTrace();
			}
		}
		// 通信界面中的发送按钮相应的时间处理
		if (e.getSource() == send) {
			// 将输入框中的字符串转换为字符串流
			stringInputStream = new ByteArrayInputStream((shurukuang.getText())
					.getBytes());
			br2 = new BufferedReader(new InputStreamReader(stringInputStream));
			String msg;
			try {
				while ((msg = br2.readLine()) != null) {
					ps.println(msg);// 将输入框中的内容发送给服务器端
					jieshoukuang.append("向服务器发送:" + msg + "\n");
					jieshoukuang.append("客户端接受相应:" + br1.readLine() + "\n");
					if (msg.equals("quit")) {
						jieshoukuang.append("客户端将退出!");
						br1.close();
						ps.close();
						client.close();
						frame1.setVisible(false);
						break;
					}
				}
			} catch (IOException e2) {
				System.out.println("读输入框数据出错!");
			}
			shurukuang.setText("");
		}
	}

	public static void main(String[] args) throws IOException {
		new Client(); // 实例化连接界面
		client = new Socket("192.168.0.120", 8000);
		// 从服务端接受的数据
		br1 = new BufferedReader(new InputStreamReader(client.getInputStream()));
		// 从客户端输出的数据
		ps = new PrintStream(client.getOutputStream());
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值