大二学生网络工程专业,网络编程小实验要求编写基于TCP Client/TCP Listener的聊天程序
为了复习上个学期学的Java顺便做了一下前端
代码写的挺屎 还望多多指教
Client部分:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.Socket;
public class SocketClient
{
static Socket socket = null;//socket内容
static Socket socket_file = null;//socket_file 用于传输文件
static JFrame jf = new JFrame("聊天窗口(客户端)");//Jframe 框架
static JPanel jp2 = new JPanel();
static final JTextArea jta_rec = new JTextArea(10,50);//接收文本区域
static final JTextArea jta = new JTextArea(10,30);//发送文本区域
static JButton jb = new JButton("发送");//发送文本按钮
static JButton jb2 = new JButton("发送文件");
static JScrollPane jsp = new JScrollPane(jta_rec);
static JFileChooser jfc = null;
static class FileInputThread implements Runnable //文件接收线程
{
@Override
public void run()
{
try
{
String fname;
byte[] inputbyte;
while(true)
{
InputStream ips = socket_file.getInputStream();
DataInputStream dis = new DataInputStream(ips);
fname = dis.readUTF();//获取文件名
jta_rec.append("收到来自Serve的文件:"+ fname+"\n");
System.out.println("./temp/"+fname);
File f = new File("./temp/"+fname);//前端显示
FileOutputStream fos = new FileOutputStream(f,false);
while(dis.read()!=-1)
{
if (!f.exists())//如果不存在则新建文件
{
f.createNewFile();
}
while(dis.read(inputbyte = new byte[dis.available()])>0)
{
fos.write(inputbyte);
fos.flush();
}
if(dis.available()==0)
{
break;
}
}
}
}
catch(Exception err)
{err.printStackTrace();}
}
}
static class InputThread implements Runnable //输入文本线程
{
@Override
public void run()
{
try
{
InputStream ips = socket.getInputStream();
final BufferedReader br = new BufferedReader(new InputStreamReader(ips));
while(br.read()!=-1)
{
char[] cubf = new char[256];
br.read(cubf);
String str = String.valueOf(cubf);
jta_rec.append("From Serve:"+"\n");
jta_rec.append(str+"\n");
}
}
catch(Exception e)
{e.printStackTrace();}
}
}
static ActionListener AL2 = new ActionListener() {//文件发送操作
@Override
public void actionPerformed(ActionEvent e)
{
try
{
jfc = new JFileChooser("./");
jfc.setVisible(true);
int flag = jfc.showOpenDialog(new JFrame());
if(flag == JFileChooser.APPROVE_OPTION)//确定选择了文件
{
File f = jfc.getSelectedFile();
String filename = f.getName();
FileInputStream fis = new FileInputStream(f);//新建文件流读取某个文件
DataOutputStream dos = new DataOutputStream(socket_file.getOutputStream());
dos.writeUTF(" "+filename);
dos.flush();
byte[] SendByte = new byte[fis.available()];
while(fis.read(SendByte)>0)
{
dos.write(0);
dos.write(SendByte);
dos.flush();
}
jta_rec.append("文件发送成功"+"\n");
}
}
catch(Exception er)
{er.printStackTrace();}
}
};
static ActionListener AL = new ActionListener()//文本输出按钮
{
@Override
public void actionPerformed(ActionEvent e)
{
try
{
if(jta.getText()=="")
{}
String temp = jta.getText();
jta.setText("");
jta_rec.append("From Client:"+"\n");
jta_rec.append(temp+"\n");
OutputStream os = socket.getOutputStream();//获取socket的输出流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));//利用bufferWrite
bw.write(" "+temp);
bw.flush();//写入并发送
System.out.println("发送成功");
}
catch(Exception E)
{E.printStackTrace();}
}
};
public static void initialize()//前端页面初始化
{
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
jf.setVisible(true);
jf.setSize(700,400);
jf.setLayout(new FlowLayout());
jf.setResizable(true);
Container c = jf.getContentPane();//jf的初始化
jsp.setVisible(true);
jp2.setLayout(new FlowLayout());
jta_rec.setEditable(false);
jta_rec.setVisible(true);
jta.setEditable(true);
jta.setVisible(true);
c.add(jsp);
c.add(jp2);
jp2.add(jta);
jp2.add(jb);
jp2.add(jb2);
jb.addActionListener(AL);
jb2.addActionListener(AL2);
}
public static void main(String[] args) throws Exception
{
try
{
initialize();
socket = new Socket("127.0.0.1",55533);//新建套接字 用于传输文本
socket_file = new Socket("127.0.0.1",55533);//新建套接字 用于传输文件
System.out.println("连接成功建立");
Thread it = new Thread(new InputThread());//新线程 用于监听文本
Thread fit = new Thread(new FileInputThread());//新线程 用于监听文件传输
it.start();
fit.start();
while(!socket.isClosed()&&!socket_file.isClosed())
{
Thread.sleep(1000);
}
}
catch(Exception e)
{
e.printStackTrace();
}
finally//关闭资源
{
socket.close();
socket_file.close();
}
}
}
Serve部分
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
public class SocketServe
{
static Socket socket_bind = null;//socket内容
static Socket socket_file = null;//传输文件
static JFrame jf = new JFrame("聊天窗口(服务器)");//Jframe 框架
static JPanel jp2 = new JPanel();
static final JTextArea jta_rec = new JTextArea(10,50);//接收文本区域
static final JTextArea jta = new JTextArea(10,30);//发送文本区域
static JButton jb = new JButton("发送");//发送文本按钮
static JButton jb2 = new JButton("发送文件");//发送文件按钮
static JScrollPane jsp = new JScrollPane(jta_rec);
static JFileChooser jfc = null;
public static void initialize()//前端页面初始化
{
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
jf.setVisible(true);
jf.setSize(700,400);
jf.setLayout(new FlowLayout());
jf.setResizable(true);
Container c = jf.getContentPane();//jf的初始化
jsp.setVisible(true);
jp2.setLayout(new FlowLayout());
jta_rec.setEditable(false);
jta_rec.setVisible(true);
jta.setEditable(true);
jta.setVisible(true);
c.add(jsp);
c.add(jp2);
jp2.add(jta);
jp2.add(jb);
jp2.add(jb2);
jb.addActionListener(AL);
jb2.addActionListener(AL2);
}
static class InputThread implements Runnable //输入文本线程
{
@Override
public void run()
{
try
{
InputStream ips = socket_bind.getInputStream();//获得输入流
final BufferedReader br = new BufferedReader(new InputStreamReader(ips));
while(br.read()!=-1)
{
char[] cubf = new char[256];
br.read(cubf);
String str = String.valueOf(cubf);
jta_rec.append("From Client:"+"\n");
jta_rec.append(str+"\n");
}
}
catch(Exception e)
{e.printStackTrace();}
}
}
static ActionListener AL2 = new ActionListener() //用于发送文件
{
@Override
public void actionPerformed(ActionEvent e)
{
try
{
jfc = new JFileChooser("./");
jfc.setVisible(true);
int flag = jfc.showOpenDialog(new JFrame());
if(flag == JFileChooser.APPROVE_OPTION)
{
File f = jfc.getSelectedFile();
String filename = f.getName();
FileInputStream fis = new FileInputStream(f);
DataOutputStream dos = new DataOutputStream(socket_file.getOutputStream());
dos.writeUTF(" "+filename);//先传送文件名字
dos.flush();
byte[] SendByte = new byte[fis.available()];
while(fis.read(SendByte)>0)//传输文件内容
{
dos.write(0);
dos.write(SendByte);
dos.flush();
}
jta_rec.append("文件发送成功");
}
}
catch(Exception er)
{er.printStackTrace();}
}
};
static ActionListener AL = new ActionListener() //发送文字
{
@Override
public void actionPerformed(ActionEvent e)
{
try
{
if(jta.getText()=="")
{}
String temp = jta.getText();
jta.setText("");
jta_rec.append("From Serve:\n");
jta_rec.append(temp+"\n");
OutputStream os = socket_bind.getOutputStream();
BufferedWriter bos = new BufferedWriter(new OutputStreamWriter(os));
bos.write(" "+temp);
bos.flush();
System.out.println("发送成功");
}
catch(Exception E)
{E.printStackTrace();}
}
};
static class FileInputThread_ser implements Runnable //文件输入线程
{
@Override
public void run()
{
try
{
String fname;
byte[] inputbyte;
while(true)
{
InputStream ips = socket_file.getInputStream();
DataInputStream dis = new DataInputStream(ips);
fname = dis.readUTF();//获取文件名
jta_rec.append("收到来自Client的文件:"+ fname+"\n");
System.out.println("./temp/"+fname);
File f = new File("./temp/"+fname);
FileOutputStream fos = new FileOutputStream(f,false);
while(dis.read()!=-1)
{
if (!f.exists())
{
f.createNewFile();
}
while(dis.read(inputbyte = new byte[dis.available()])>0)//写入数据
{
fos.write(inputbyte);
fos.flush();
}
if(dis.available()==0)
{
break;
}
}
}
}
catch(Exception err)
{err.printStackTrace();}
}
}
public static void main(String[] args) throws Exception
{
// 监听指定的端口
initialize();
int port = 55533;
ServerSocket server = new ServerSocket(port);//新建ServerSocket服务器端口
// server将一直等待连接的到来
jta_rec.append("server将一直等待连接的到来"+"\n");
socket_bind = server.accept();//和文本Socket建立连接
socket_file = server.accept();//和文件Socket建立连接
// 建立好连接后,从socket中获取输入流,并建立缓冲区进行读取
jta_rec.append("连接建立成功"+"\n");
try
{
Thread it_ser = new Thread(new InputThread());
Thread fit_ser = new Thread(new FileInputThread_ser());
it_ser.start();
fit_ser.start();
while(!socket_bind.isClosed()&&!socket_file.isClosed())
{
Thread.sleep(1000);
}
}
catch(Exception e)
{e.printStackTrace();}
finally//关闭资源
{
socket_bind.close();
socket_file.close();
server.close();
}
}
}
有些细节可能处理的不到位,经过本地测试应该没什么问题(至少功能实现了)