课程实验需要,在此记录
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版过两天再说