java socket 二

借着上次回顾到socket的资料,这次完成一个c/s端的socket示例。主要回顾io、socket、swing、thread 。

下一个学习的重点是nio和mina框架,不知道各位同仁能否指点一二,或者在学习nio的时候有什么建议,或者学习的方法,谢谢大家了。

以前长期潜水,现在在写这些学生时代的代码,少不得拍砖,谢谢拍砖。



 

服务器端:

 

 

package com.jzpark.socket;

import java.awt.FileDialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import com.swtdesigner.SwingResourceManager;

/**
 * @author: antxuan
 * @createtime: 2010-5-29 下午08:40:18
 * @Description: socket客户端
 */
public class Server {
	private static final long serialVersionUID = 1L;

	JFrame jf = new JFrame("socket通信服务器端");
	// 在现人数
	// 连接到主机socket的ip地址列表
	// 客户端发送来的信息
	final JTextArea txtAMessage = new JTextArea();
	// 服务器端回复信息
	final JTextField txtRMessage = new JTextField();

	final JLabel lblMessage = new JLabel();

	// 得到操作系统平台下的文件分隔符
	final String separator = System.getProperty("line.separator");
	// 保存客户端发来的数据 记录ip地址和消息
	private List<String> list = new ArrayList<String>();
	
	SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd ss:hh:mm");
	SimpleDateFormat format2=new SimpleDateFormat("sshhmm");

	
	// 取得输入流
	DataInputStream dis = null;
	// 取得输出流
	DataOutputStream dos = null;

	// 服务器套接字
	ServerSocket serverSocket = null;
	// 套接字
	Socket socket = null;

	// 创建窗体
	private void createFrame() {

		jf.getContentPane().setLayout(null);
		jf.setSize(431, 395);
		JLabel jlmessage = new JLabel("当前连接服务器人数:");
		jf.add(jlmessage);

		final JLabel label = new JLabel();
		label.setBounds(35, 19, 66, 30);
		label.setText("启动状态:");
		jf.getContentPane().add(label);

		final JButton btnOn = new JButton();
		btnOn.setBounds(247, 20, 138, 29);
		btnOn.addActionListener(new ActionListener() {
			public void actionPerformed(final ActionEvent e) {
				// new ServerSocketThread();
				btnOn.setEnabled(false);

				new ServerSocketThread().start();   
				lblMessage.setText("已启动...");
				
				lblMessage.setIcon(SwingResourceManager.getIcon(Server.class, "ajax-loader.gif"));

				 
			}
		});
		btnOn.setText("启动服务器socket");
		jf.getContentPane().add(btnOn);

		final JLabel lblmessage = new JLabel();
		lblmessage.setName("");
		lblmessage.setText("");
		lblmessage.setBounds(292, 201, 66, 18);
		jf.getContentPane().add(lblmessage);

		final JLabel label_1 = new JLabel();
		label_1.setText("接收到的消息:");
		label_1.setBounds(10, 75, 91, 18);
		jf.getContentPane().add(label_1);

		txtAMessage.setEditable(false);
		txtAMessage.setBounds(107, 75, 278, 142);
		jf.getContentPane().add(txtAMessage);

		final JLabel label_3 = new JLabel();
		label_3.setText("回复信息:");
		label_3.setBounds(10, 256, 66, 18);
		jf.getContentPane().add(label_3);

		txtRMessage.setBounds(107, 254, 278, 22);
		jf.getContentPane().add(txtRMessage);

		lblMessage.setText("");
		lblMessage.setBounds(107, 15, 91, 39);
		jf.getContentPane().add(lblMessage);

		final JButton button_1 = new JButton();
		button_1.addActionListener(new ActionListener() {
			public void actionPerformed(final ActionEvent e) {
				
//				if(socket.isBound()){
//					JOptionPane.showMessageDialog(jf,"没有连接!:");
//
//				}
				
				String message = txtRMessage.getText();
				if(message.equals("")){
					JOptionPane.showMessageDialog(jf, "请输入回复信息");
					return;
				}
				// 当点击发送按钮后,将发送消息框清空
				txtRMessage.setText("");
				try {
					String date=format.format(new Date());
					txtAMessage.append(date+"您的回复:" + message + separator);
					dos.writeUTF(message );
					dos.flush();

				} catch (IOException e1) {

					e1.printStackTrace();
				}
			}
		});
		button_1.setText("发送");
		button_1.setBounds(152, 305, 102, 29);
		jf.getContentPane().add(button_1);

		final JButton btnClose = new JButton();
		btnClose.setText("关闭socket");
		btnClose.setBounds(23, 305, 102, 28);
		jf.getContentPane().add(btnClose);

		btnClose.addActionListener(new ActionListener() {
			public void actionPerformed(final ActionEvent e) {
				// ServerSockets sc=new ServerSockets(new Socket());
				btnOn.setEnabled(true);
				btnClose.setEnabled(false);
				lblMessage.setText("已关闭!");

				if (socket != null) {
					if (!socket.isClosed()) {
						try {
							socket.close();
						} catch (IOException e1) {
							e1.printStackTrace();
						}
					}
				}

			}
		});

		// 禁止用户设置窗体大小
		jf.setResizable(false);
		jf.addWindowListener(new WindowListener() {
			public void windowActivated(WindowEvent e) {
			}

			public void windowClosed(WindowEvent e) {
			}

			public void windowClosing(WindowEvent e) {
				Runtime.getRuntime().exit(0);
				try {
					if(socket!=null){
						if(!socket.isClosed()){
							socket.close();
						}
					}
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}

			public void windowDeactivated(WindowEvent e) {
			}

			public void windowDeiconified(WindowEvent e) {
			}

			public void windowIconified(WindowEvent e) {
			}

			public void windowOpened(WindowEvent e) {
			}
		});
		jf.show();

		final JButton button_1_1 = new JButton();
		button_1_1.addActionListener(new ActionListener() {
			public void actionPerformed(final ActionEvent e) {
				FileDialog fd=new FileDialog(jf,"保存聊天信息",FileDialog.SAVE );		   
 				fd.show();
				byte[] b= txtAMessage.getText().getBytes();
				try {
					String fileName=fd.getDirectory()+fd.getFile()+format2.format(new Date())+".txt"; 
					FileOutputStream fos=new FileOutputStream(fileName);
					fos.write(b);
					JOptionPane.showMessageDialog(jf, "对话信息已经保存在"+fileName+"中");
				} catch (FileNotFoundException e1) {
 					e1.printStackTrace();
				} catch (IOException e1) {
 					e1.printStackTrace();
				}
				
			}
		});
		button_1_1.setText("导出信息");
		button_1_1.setBounds(283, 305, 102, 29);
		jf.getContentPane().add(button_1_1);
	}

	class ServerSocketThread extends Thread {

		public void run() {
			try {
				serverSocket = new ServerSocket(3333);
				while (true) {
					socket = serverSocket.accept();
					dis = new DataInputStream(socket.getInputStream());
					dos = new DataOutputStream(socket.getOutputStream());
					txtAMessage.append(socket.getLocalAddress() + "说:"
							+ dis.readUTF() + separator);
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args) {

		Server server = new Server();
		server.createFrame();
	}

}

 

客户端:

 

    package com.jzpark.socket;

 

import java.awt.FileDialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/**
 * @author: antxuan
 * @createtime: 2010-5-29 下午08:40:11
 * @Description: socket服务器端
 */
public class Client {
	static JFrame jf = new JFrame();
	// 聊天记录
	final JTextArea txtARecode = new JTextArea();
	//发送消息
	final JTextField txtRMessage = new JTextField();
	// 得到操作系统平台下的文件分隔符
	final String separator = System.getProperty("line.separator");	
	//套接字
	private  Socket socket=null;
	// 取得输入流
	DataInputStream dis = null;
	// 取得输出流
	DataOutputStream dos = null;
	//ip地址
	String address;
	//端口
	int port;

	SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd ss:hh:mm");
	 
	SimpleDateFormat format2=new SimpleDateFormat("sshhmm");

	
	// 构建窗体
	public Client() {

		jf.setSize(440, 375);
		jf.getContentPane().setLayout(null);
		jf.setTitle("socket客户端连接工具");

		final JLabel label = new JLabel();
		label.setText("IP地址:");
		label.setBounds(26, 10, 50, 18);
		jf.getContentPane().add(label);

		final JLabel label_1 = new JLabel();
		label_1.setText("端口号:");
		label_1.setBounds(26, 34, 59, 18);
		jf.getContentPane().add(label_1);

		final JTextField txtAddress = new JTextField();
		txtAddress.setBounds(82, 8, 152, 22);
		jf.getContentPane().add(txtAddress);

		final JTextField txtPort = new JTextField();
		txtPort.setBounds(82, 32, 152, 22);
		jf.getContentPane().add(txtPort);

		final JButton btnConnect = new JButton(); 
		btnConnect.addActionListener(new ActionListener() {
			public void actionPerformed(final ActionEvent e) {
				
				//为ip地址和端口赋值 
				
				address=txtAddress.getText(); 
				if(address.equals("")){
					JOptionPane.showMessageDialog(jf,"请输入ip地址如:10.1.110.4");
					return;
				}
				try {
					if(txtPort.getText().equals("")){
						JOptionPane.showMessageDialog(jf,"请输入端口号");
						return;
					}
					port=Integer.parseInt(txtPort.getText());

				} catch (NumberFormatException e2) {
					JOptionPane.showMessageDialog(jf,"端口号必须为数字");
					return;
				}
				
				
				// 创建连接
				new ClientSocketThread().start();
				JOptionPane.showMessageDialog(jf,"已经连接到"+address+"的"+port+"端口");

				
			}
		});
		btnConnect.setText("连接");
		btnConnect.setBounds(292, 29, 87, 28);
		jf.getContentPane().add(btnConnect);

		final JLabel label_2 = new JLabel();
		label_2.setText("发送消息:");
		label_2.setBounds(10, 253, 66, 18);
		jf.getContentPane().add(label_2);

		txtRMessage.setBounds(82, 251, 297, 22);
		jf.getContentPane().add(txtRMessage);

		final JButton button = new JButton();
		button.addActionListener(new ActionListener() {
			public void actionPerformed(final ActionEvent e) {
				
				//取得发送信息
				String message=txtRMessage.getText();
				txtRMessage.setText("");
				if(message.equals("")){
					JOptionPane.showMessageDialog(jf,"发送消息不能为空");
					return;
				}
				
				String date=format.format(new Date());
				
				txtARecode.append(date+"您说:"+message+separator); 
				
				try {
					dos.writeUTF(message);
				} catch (IOException e1) {
 					e1.printStackTrace();
				}

			}
		});
		button.setText("发送");
		button.setBounds(100, 307, 87, 28);
		jf.getContentPane().add(button);

		final JLabel label_3 = new JLabel();
		label_3.setText("聊天记录:");
		label_3.setBounds(10, 73, 66, 18);
		jf.getContentPane().add(label_3);

		txtARecode.setBounds(82, 73, 297, 148);
		txtARecode.setAutoscrolls(true);
		jf.getContentPane().add(txtARecode);

		final JButton button_1 = new JButton(); 
		button_1.addActionListener(new ActionListener() {
			public void actionPerformed(final ActionEvent e) {
				FileDialog fd=new FileDialog(jf,"保存聊天信息",FileDialog.SAVE );		   
 				fd.show();
				String message=txtARecode.getText();
 				try { 
 					String fileName=fd.getDirectory()+fd.getFile()+format2.format(new Date())+".txt"; 
 					FileOutputStream fos = new FileOutputStream(fileName);
					fos.write(message.getBytes());
					JOptionPane.showMessageDialog(jf,"对话信息已经保存在"+fileName+"中");
				} catch (FileNotFoundException e1) { 
 					e1.printStackTrace();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				 
			}
		});
		button_1.setText("导出聊天记录");
		button_1.setBounds(218, 307, 125, 28);
		jf.getContentPane().add(button_1); 

		txtARecode.setEditable(false);
		
		jf.setResizable(false);
		jf.setLocation(220, 220);

		jf.show();
		
		jf.addWindowListener(new WindowListener() {
			public void windowActivated(WindowEvent e) {
			}

			public void windowClosed(WindowEvent e) {
			}

			public void windowClosing(WindowEvent e) {
				Runtime.getRuntime().exit(0);
				try {
					if(socket!=null){
						if(!socket.isClosed()){
							socket.close();
						}
					}
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}

			public void windowDeactivated(WindowEvent e) {
			}

			public void windowDeiconified(WindowEvent e) {
			}

			public void windowIconified(WindowEvent e) {
			}

			public void windowOpened(WindowEvent e) {
			}
		});
		
	}

	public static void main(String[] args) {
		new Client();
	}
	
	
	class ClientSocketThread extends Thread {

		public void run() {
			try {
				 
				while (true) {
					 socket=new Socket(address,port);
					 dis = new DataInputStream(socket.getInputStream());
					 dos = new DataOutputStream(socket.getOutputStream());
					 //服务器端返回数据
					 String message=dis.readUTF();
					 txtARecode.append("服务器返回:"+message+separator);
				}
			} catch (Exception e) {
				e.printStackTrace();
				JOptionPane.showMessageDialog(jf,"不能连接目标主机或端口:"+e.getMessage());
				try {
					if(socket!=null){
						if(!socket.isClosed()){
							socket.close();
						}
					}
 				} catch (IOException e1) {
 					e1.printStackTrace();
				}
			}
		}
	}
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值