网络编程-Socket客户端和服务器之间聊天与文件传输(GUI)

课程实验需要,在此记录

                           1.客户端与服务器局域网聊天室

package 网络编程;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import java.text.SimpleDateFormat;

//局域网聊天
class LANChat{
	
	//服务器聊天室
	public void ServeChat() throws IOException{
		
		//建立连接
		ServerSocket server = new ServerSocket(43166);
		Socket client = server.accept();
		//服务器的输入---客户端的输出
		BufferedReader in = new BufferedReader(
							new InputStreamReader(
									client.getInputStream()));
		//服务器的输出---客户端的输入
		PrintWriter out = new PrintWriter(client.getOutputStream());
		BufferedReader wt = new BufferedReader(
				new InputStreamReader(System.in));
		
		System.out.print("\n请输入你的服务器名字:");
		String name = wt.readLine();

		out.println(name);
		out.flush();
		String username = in.readLine();
		System.out.println(username + " 已经上线");
		out.println(name + "处于在线中");
		out.flush();
		while(true){
			String str = in.readLine();
			System.out.println("\n" + UserHint.df.format(new Date())+ "\n" +
									username+ ":" + str );
			System.out.print(name + " :");
			out.println(wt.readLine());
			out.flush();
			if(str == "退出对话")
				break;
			
		}
		System.out.println(in.readLine());
		out.println("对方已经退出聊天室");
		out.flush();
		client.close();
	}
	
	//客户端聊天室
	public void ClientChat() throws IOException{
		
		//建立连接
		Socket server = new Socket(InetAddress.getLocalHost(),43166);
		//客户端的输入---服务器的输出
		BufferedReader in = new BufferedReader(
							new InputStreamReader(
									server.getInputStream()));
		//客户端的输出---服务器的输入
		PrintWriter out = new PrintWriter(server.getOutputStream());
		//键盘输入流
		BufferedReader wt = new BufferedReader(
							new InputStreamReader(System.in));
		
		System.out.println("请输入你的聊天室昵称:");
		String name = wt.readLine();
		out.println(name);
		out.flush();
		String serveame = in.readLine();
		while(true){
			String str = in.readLine();
			System.out.println("\n" + UserHint.df.format(new Date())+ "\n" +
					serveame+ ":" + str );
			System.out.print(name + " :");
			out.println(wt.readLine());
			out.flush();
			
			if(str == "退出对话")
				break;
		}
		System.out.println(in.readLine());
		server.close();
	}
}

                                            2.文件传输

//1.main方法

package 网络编程;

import java.io.IOException;
import java.util.Scanner;

public class NetworkProgramming {

	public static void main(String[] args) throws IOException {
		//new UserHint().mianMenu();	//控制台菜单
		new UserHintGUI().mainMenu();	//控制台菜单--GUI版
	}
	
}

//2.开始界面

                                   

package 网络编程;

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.*;

public class UserHintGUI {
	
	private static MyMonitor myMonitor1 = new MyMonitor();
	
	public void mainMenu() {
		//容器声明
		JFrame f =new JFrame("服务器 or 客户端");
		JPanel jp1 = new JPanel();
		f.setLayout(new GridLayout(2, 1));
		jp1.setLayout(new GridLayout(1, 2));
		
		
		//组件声明
		JButton jb1 = new JButton("服务器");
		JButton jb2 = new JButton("客户端");
		JLabel jl1 = new JLabel("请选择开启服务器or客户端");
		jl1.setHorizontalAlignment(JTextField.CENTER);//居中
		jl1.setFont(new Font("宋体", 1, 25));
		jb1.setFont(new Font("宋体", 1, 20));
		jb2.setFont(new Font("宋体", 1, 20));

		
		//组件添加
		jp1.add(jb1);
		jp1.add(jb2);
		f.add(jl1);
		f.add(jp1);
		
		//监听器的绑定
		
		f.addWindowListener(myMonitor1);
		jb1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				//服务器的启动
				Sever();
				f.setVisible(false);
			}
		});
		jb2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				//客户端的启动
				Client();
				f.setVisible(false);
			}
		});
		//容器设置
		f.setLocationRelativeTo(null);	//窗口居中
		f.setResizable(false);			//窗口大小不可调
		f.setBounds(500, 500, 500, 200);
		f.setVisible(true);
	}
	
	static void Sever() {
		Sever_ClientGUI.GUI("服务器");
		
	}
	
	static void Client()  {
		Sever_ClientGUI.GUI("客户端");

	}
}

class MyMonitor extends WindowAdapter {

	public void windowClosing(WindowEvent e) {
		System.exit(0);
	}
}

3.服务器和客户端封装在了一起---次级界面

   通过参数进行判断

package 网络编程;

import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Sever_ClientGUI {
	
	public static void GUI(String name) {
		MyMonitor myMonitor1 = new MyMonitor();
		//容器声明
		JFrame frame = new JFrame(name);
		frame.setLayout(new GridLayout(2, 1));
		
		//组件声明
		JLabel jLabel = new JLabel("Mushroom - "+name);
		JButton jb1 = new JButton("聊天室");
		JButton jb2 = new JButton("上传文件");
		JButton jb3 = new JButton("下载文件");
		
		//组件设置
		jLabel.setFont(new Font("宋体", 1, 45));
		jLabel.setHorizontalAlignment(JTextField.CENTER);//居中
		jLabel.setForeground(Color.white);
		if(name.equals("客户端"))
			jLabel.setForeground(Color.BLACK);
		jb1.setFont(new Font("宋体", 1, 20));
		jb2.setFont(new Font("宋体", 1, 20));
		jb3.setFont(new Font("宋体", 1, 20));
		
		//容器设置
		frame.setLocationRelativeTo(null);	//窗口居中
		frame.setResizable(false);			//窗口大小不可调
		frame.setBounds(500, 500, 500, 200);
		frame.setVisible(true);
		
		//绑定监听器
		frame.addWindowListener(myMonitor1);
		jb1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				//聊天室
				
			}
		});
		jb2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				//上传文件
				new Upload_and_Download().Upload_or_Download("上传",name);
				
			}
		});
		jb3.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				//下载文件
				new Upload_and_Download().Upload_or_Download("下载",name);
				
			}
		});
		
		
		
		
		// 背景图片的路径。
		String path = "D:\\办公软件\\练习\\图片\\"+name+".jpg";
			
		// 背景图片
		ImageIcon background = new ImageIcon(path);
		
		// 把背景图片显示在一个标签里面
		JLabel label = new JLabel(background);
		
		// 把标签的大小位置设置为图片刚好填充整个面板
		label.setBounds(0, 0,frame.getWidth(), frame.getHeight()); 
		
		// 把内容窗格转化为JPanel,否则不能用方法setOpaque()来使内容窗格透明
		JPanel imagePanel = (JPanel)frame.getContentPane(); 
		imagePanel.setLayout(new GridLayout(2, 1,20,10));
		JPanel jp1 = new JPanel(new GridLayout(1, 3,20,30));
		jp1.setOpaque(false);
		imagePanel.setOpaque(false);
		// 把背景图片添加到分层窗格的最底层作为背景
		frame.getLayeredPane().add(label, new Integer(Integer.MIN_VALUE));
		
		//容器添加
		imagePanel.add(jLabel);
		jp1.add(jb1);
		jp1.add(jb2);
		//if(!name.equals("主界面"))
			jp1.add(jb3);
		imagePanel.add(jp1);
	}
}

4.次级子界面,路径的选择

package 网络编程;

import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Upload_and_Download extends WindowAdapter{
	
	MyMonitor myMonitor1 = new MyMonitor();
	public  void Upload_or_Download(String choose, String name) {
		String Route1 = "";	//源文件路径
		String Route2 = "";	//目标路径
		
		JFrame jFrame = new JFrame(choose);
		jFrame.setLayout(new GridLayout(2, 3,0,5));
		JPanel jp1 = new JPanel(new GridLayout(1,2));
		
		JButton jButton = new JButton(choose);
		String str = "";
		if(choose.equals("上传"))
			str = "源文件路径";
		else
			str = choose + "至路径:";
		JLabel jLabel1 = new JLabel(str);

		JTextField jt1 = new JTextField("a.txt");
		JTextField jt2 = new JTextField("D:\\办公软件\\练习\\");
		
		jLabel1.setFont(new Font("宋体", 1, 30));
		jt1.setFont(new Font("宋体", 0, 20));
		jt2.setFont(new Font("宋体", 0, 20));
		
		jp1.add(jLabel1);
		jp1.add(jt1);

		
		jButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				try {
						if(name.equals("服务器") && choose.equals("下载")) {
							Main_Code_Block.Sever("下载", jt1.getText());
						} 
						else if(name.equals("客户端") && choose.equals("上传")) {
							Main_Code_Block.Client("上传", jt1.getText());
						} 
						else if(name.equals("服务器") && choose.equals("上传")) {
							Main_Code_Block.Sever("上传", jt1.getText());
						} 
						else if(name.equals("客户端") && choose.equals("下载")) {
							Main_Code_Block.Client("下载", jt1.getText());
						}
						
				}catch (IOException e1) {
					e1.printStackTrace();
				}
			}
		});
		
		jFrame.add(jp1);
		jFrame.add(jButton);
		
		jFrame.addWindowListener(new WindowListener() {
			public void windowOpened(WindowEvent e) {}
			public void windowIconified(WindowEvent e) {}
			public void windowDeiconified(WindowEvent e) {}
			public void windowDeactivated(WindowEvent e) {}
			public void windowClosing(WindowEvent e) {
				jFrame.setVisible(false);
			}
			public void windowClosed(WindowEvent e) {}
			public void windowActivated(WindowEvent e) {}
		});
		
		jFrame.setVisible(true);
		jFrame.setBounds(800, 400, 500, 150);

	}
	
}

5.核心代码---文件传输

package 网络编程;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

import org.omg.CORBA.portable.OutputStream;

public class Main_Code_Block {
	

	//服务器
	static void Sever(String choose, String Route) throws IOException {
		System.out.println("服务器已开启");
		//建立连接
		ServerSocket server = new ServerSocket(43166);
		Socket client = server.accept();
		//服务器的输入---客户端的输出
		BufferedReader in = new BufferedReader(
							new InputStreamReader(
									client.getInputStream()));
		//服务器的输出---客户端的输入
		PrintWriter out = new PrintWriter(client.getOutputStream());
	
	    if(choose.equals("下载")) {
	    	System.out.println("服务器下载");
	    	//写文件
		    BufferedOutputStream bos = new BufferedOutputStream(
		    							new FileOutputStream("D:\\办公软件\\练习\\服务器文件\\"+Route));
	    	//判断是否读到文件末尾
		    int read;
		    while((read = in.read()) != -1) {  
		    	bos.write(read);   
		    }  
		    bos.close();
	    }else {
	    	System.out.println("服务器上传");
	    	//读文件流
	  		BufferedInputStream bis = new BufferedInputStream(
	  									new FileInputStream("D:\\办公软件\\练习\\服务器文件\\"+Route));
	    	//判断是否读到文件末尾
		    int read = 0; 
		    while((read = bis.read()) != -1){  
		    	out.write(read); 
		    	
		    }
		    out.flush();
	    	bis.close();
	    }
	    in.close();  
	}
	
	//客户端
	static void Client(String choose, String Route) throws UnknownHostException, IOException {
		System.out.println("客户端已开启");
		//建立连接
		Socket server = new Socket(InetAddress.getLocalHost(),43166);
		//客户端的输入---服务器的输出
		BufferedReader in = new BufferedReader(
							new InputStreamReader(
									server.getInputStream()));
		
		//从客户端本地读取文件,并写入socket的输出流中  
		PrintWriter out = new PrintWriter(server.getOutputStream()); 

		if(choose.equals("上传")) {
			System.out.println("客户端上传");
			//读文件流
			BufferedInputStream bis = new BufferedInputStream(
										new FileInputStream("D:\\办公软件\\练习\\客户端文件\\"+Route));
			//判断是否读到文件末尾
		    int read = 0; 
		    while((read = bis.read()) != -1){  
		    	out.write(read);  
		    } 
		    out.flush();
		    bis.close(); 
		}else {
			System.out.println("客户下载");

		    BufferedOutputStream bos = new BufferedOutputStream(
		    							new FileOutputStream("D:\\办公软件\\练习\\客户端文件\\"+Route));
			//判断是否读到文件末尾
		    int read;
		    while((read = in.read()) != -1) {  
		    	bos.write(read);
		    } 
		    bos.close();
		}
	    out.close();  
	}
}

6.聊天室UI版过两天再说

  • 4
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值