欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

网络画图板(一)

程序员文章站 2024-02-01 13:18:28
...

 

网络画图板;客户端在向服务器发送信息的时候需要定义发送的协议, 简称通信协议

 

形状类型   int type;  0直线   1矩形   2椭圆

形状数据  int x1,y1,x2,y2;

 

服务器;只需要不停的接受客户端,转发给另外的客户端

客户端;需要有界面,通信协议,

 

服务器
网络画图板(一)
            
    
    博客分类: JAVA网络编程与通信协议 网络编程通信协议 
 

 客户端一上面画


网络画图板(一)
            
    
    博客分类: JAVA网络编程与通信协议 网络编程通信协议 
 

客户端二上面也会有
网络画图板(一)
            
    
    博客分类: JAVA网络编程与通信协议 网络编程通信协议 
 

 

 

服务器:

package 远程演示服务器;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

/**
 * 服务器的主类
 * 
 * @author Administrator
 * 
 */
public class ServerMain {
	// static不能定义在main方法里面
	public static ArrayList<Socket> socketlis = new ArrayList<Socket>();

	public static void main(String[] args) {
		boolean islive = true;
		try {
			ServerSocket server = new ServerSocket(9090);
			System.out.println("等待连接客户端...");

			while (islive) {
				Socket socket = server.accept();
				ServerThread th = new ServerThread(socket);
				th.start();
				socketlis.add(socket);
				System.out.println(socket.getInetAddress().getHostName()
						+ "连上服务器");

			}
		} catch (IOException e) {
			islive = false;
			System.out.println("端口不存在,,");

		}
	}
}

 

服务器线程来转发数据

package 远程演示服务器;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
 * 使用线程将绘制的内容发给其他的客户端
 * 
 * @author Administrator
 * 
 */
public class ServerThread extends Thread {

	private Socket socket;

	public ServerThread(Socket socket) {
		this.socket = socket;
	}

	@Override
	public void run() {
		try {
			//获取输入流
			InputStream is = socket.getInputStream();
			DataInputStream dis = new DataInputStream(is);
			while (true) {
				int type = dis.readInt();
				int x1 = dis.readInt();
				int y1 = dis.readInt();
				int x2 = dis.readInt();
				int y2 = dis.readInt();

				// 转发给其它客户端

				for (int i = 0; i < ServerMain.socketlis.size(); i++) {
					Socket sc = ServerMain.socketlis.get(i);
					if (sc != socket) {
						OutputStream os = sc.getOutputStream();
						DataOutputStream dos = new DataOutputStream(os);

						dos.writeInt(type);
						dos.writeInt(x1);
						dos.writeInt(y1);
						dos.writeInt(x2);
						dos.writeInt(y2);
						dos.flush();

					}
				}

			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

 

 

 

 

 

客户端主界面

package 远程演示客户端;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.Socket;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
 * 远程演示客户端
 * 
 * @author Administrator
 * 
 */
public class DrawUI extends JFrame {
	public static void main(String[] args) {
		new DrawUI();
	}

	private JTextField ipFiled;
	private JTextField portFiled;
	private JButton Btn;
	private JPanel centenr;
	private Socket socket;

	public DrawUI() {
		this.setTitle("远程演示");
		this.setSize(500, 500);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLayout(new BorderLayout());

		// 绘制区域
		centenr = new JPanel();
		this.add(centenr,BorderLayout.CENTER);
		// 右边聊天区域
		JPanel right = new JPanel();
		right.setPreferredSize(new Dimension(100, 100));
		right.setBackground(Color.lightGray);
		this.add(right, BorderLayout.EAST);
		// 下边ip设置
		JPanel bottom = new JPanel();
		bottom.setPreferredSize(new Dimension(500, 50));
		bottom.setBackground(Color.lightGray);
		this.add(bottom, BorderLayout.SOUTH);

		// 设置默认的ip和端口
		JLabel iplabel = new JLabel("IP");
		ipFiled = new JTextField("127.0.0.1", 15);
		JLabel portlabel = new JLabel("port");
		portFiled = new JTextField("9090", 10);

		Btn = new JButton("连接服务器");

		// 创建监听器对象
		BtnLisetenr blis = new BtnLisetenr();
		Btn.addActionListener(blis);
		// 将组件添加到窗体下部
		bottom.add(iplabel);
		bottom.add(ipFiled);
		bottom.add(portlabel);
		bottom.add(portFiled);
		bottom.add(Btn);
  
		this.setResizable(false);
		this.setVisible(true);

		//创建监听器对象
		ClientLis lis = new ClientLis(this, centenr);
		centenr.addMouseListener(lis);

	}

	// 获得客户端

	public Socket getSocket() {
		return socket;
	}

	// 添加链接服务器的监听器
	class BtnLisetenr implements ActionListener {

		

		@Override
		public void actionPerformed(ActionEvent e) {
			String str = e.getActionCommand();
			if (str.equals("连接服务器")) {
				// 获得输入框中的ip和端口
				String ip = ipFiled.getText().trim();
				String ports = portFiled.getText().trim();
				// 在客户端的创建中端口是整型的,所以需要将端口字符串转换成整形
				int port = Integer.parseInt(ports);
				try {
					socket = new Socket(ip, port);
					//启动接收消息的线程
					receiveThread th = new receiveThread(socket, centenr);
					th.start();

					Btn.setText("已经连接上服务器..");
				} catch (Exception e1) {
					e1.printStackTrace();
				}
			}
		}
	}

}

 

客户端监听器类

package 远程演示客户端;

/*
 * 监听器类
 */
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

import javax.swing.JPanel;

public class ClientLis extends MouseAdapter {

	private int x1, y1, x2, y2;
	private JPanel centenr;
	private DrawUI ui;
	Graphics g;

	public ClientLis(DrawUI ui, JPanel centenr) {
		this.ui = ui;
		this.centenr = centenr;
	}

	// 按下
	public void mousePressed(MouseEvent e) {
		// 获得画布和按下的坐标
		g = centenr.getGraphics();
		x1 = e.getX();
		y1 = e.getY();

	}

	// 释放
	public void mouseReleased(MouseEvent e) {

		// 获得释放时的坐标
		x2 = e.getX();
		y2 = e.getY();

		g.drawLine(x1, y1, x2, y2);
		Send();

	}

	// 将绘制的消息发送给服务器
	public void Send() {
		// 获得socket
		Socket socket = ui.getSocket();
		if (socket != null) {
			try {
				OutputStream os = socket.getOutputStream();
				DataOutputStream oos = new DataOutputStream(os);
				oos.writeInt(0);
				oos.writeInt(x1);
				oos.writeInt(y1);
				oos.writeInt(x2);
				oos.writeInt(y2);
				oos.flush();

			} catch (IOException e) {
				e.printStackTrace();
			}

		} else {
			javax.swing.JOptionPane.showMessageDialog(null, "网络不通!!!");
		}

	}

}

 

客户端线程类,定义通信协议

package 远程演示客户端;

import java.awt.Graphics;
import java.io.DataInputStream;
import java.io.InputStream;
import java.net.Socket;

import javax.swing.JPanel;

/**
 * 处理客户端接受服务器的消息
 * 
 * @author Administrator
 * 
 */
public class receiveThread extends Thread {

	private JPanel centenr;
	private Socket socket;
	boolean islive = true;
	private DataInputStream dis;
	private Graphics g;

	public receiveThread(Socket socket, JPanel centenr) {
		this.socket = socket;
		this.centenr = centenr;

		try {
			// 创建输入流
			InputStream is = socket.getInputStream();
			dis = new DataInputStream(is);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	@Override
	public void run() {
		while (islive) {
			try {
				int type = dis.readInt();
				int x1 = dis.readInt();
				int y1 = dis.readInt();
				int x2 = dis.readInt();
				int y2 = dis.readInt();
				g = centenr.getGraphics();
				if (type == 0) {
					g.drawLine(x1, y1, x2, y2);
				}

			} catch (Exception ef) {
				islive = false;
				ef.printStackTrace();
			}

		}

	}
}

 

 

 

 

  • 网络画图板(一)
            
    
    博客分类: JAVA网络编程与通信协议 网络编程通信协议 
  • 大小: 35.5 KB
  • 网络画图板(一)
            
    
    博客分类: JAVA网络编程与通信协议 网络编程通信协议 
  • 大小: 79.4 KB
  • 网络画图板(一)
            
    
    博客分类: JAVA网络编程与通信协议 网络编程通信协议 
  • 大小: 79.4 KB