基于javaSwing和Socket的网络编程
客户端代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.SocketException;
import static javax.swing.JFileChooser.FILES_ONLY;
public class ChatRoomClient extends JFrame {
private JPanel jPanel;
private JLabel jLabel1;
private JLabel jLabel2;
private JLabel jLabel3;
private JLabel jLabel4;
private JTextField jTextField1;
private JTextField jTextField2;
private JTextField jTextField3;
private JTextArea jTextArea;
private JScrollPane jScrollPane;
private JButton jButton1;
private JButton jButton2;
private JButton jButton3;
private myactionlistener actionlistener=null;
private JProgressBar jProgressBar;
ChatRoomClient(String title){
super(title);
setLayout(null);
setVisible(true);
setBounds(700,250,450,650);
setResizable(false);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
init();
}
private void init(){
jLabel1=new JLabel("聊天室客户端");
jLabel1.setBounds(125,0,300,50);
jLabel1.setFont(new Font("宋体",Font.BOLD,25));
jLabel2=new JLabel("IP:");
jLabel2.setBounds(10,60,40,30);
jLabel2.setFont(new Font("宋体",Font.BOLD,15));
jLabel3=new JLabel("端口:");
jLabel3.setBounds(210,60,50,30);
jLabel3.setFont(new Font("宋体",Font.BOLD,15));
jTextField1=new JTextField("");
jTextField1.setBounds(55,60,150,30);
jTextField2=new JTextField("");
jTextField2.setBounds(265,60,60,30);
jButton1=new JButton("连接");
jButton1.setBounds(330,60,80,30);
jButton1.setActionCommand("连接");
jTextArea=new JTextArea("");
jTextArea.setEditable(false);
jScrollPane=new JScrollPane(jTextArea);
jScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
jScrollPane.setBounds(10,100,400,400);
jTextField3=new JTextField("");
jTextField3.setBounds(10,510,310,30);
jButton2=new JButton("发送");
jButton2.setBounds(330,510,80,30);
jButton2.setActionCommand("发送");
jButton3=new JButton("传输文件");
jButton3.setBounds(330,550,80,30);
jButton3.setFont(new Font("宋体",Font.BOLD,10));
jButton3.setActionCommand("传输文件");
jProgressBar=new JProgressBar();
jProgressBar.setBounds(10,550,310,30);
jProgressBar.setMaximum(100);
jProgressBar.setMinimum(0);
jProgressBar.setValue(0);
jProgressBar.setStringPainted(true);
jLabel4=new JLabel("");
jLabel4.setBounds(220,640,80,30);
jLabel4.setFont(new Font("宋体",Font.BOLD,10));
jPanel=new JPanel();
jPanel.setBounds(0,0,450,650);
jPanel.setLayout(null);
jPanel.setVisible(true);
jPanel.add(jLabel1);
jPanel.add(jLabel2);
jPanel.add(jLabel3);
jPanel.add(jLabel4);
jPanel.add(jTextField1);
jPanel.add(jTextField2);
jPanel.add(jTextField3);
jPanel.add(jScrollPane);
jPanel.add(jButton1);
jPanel.add(jButton2);
jPanel.add(jButton3);
jPanel.add(jProgressBar);
add(jPanel);
actionlistener=new myactionlistener(jTextField1,jTextField2,jTextField3,jTextArea,this,jLabel4,jProgressBar);
actionlistener.setjButton3(jButton3);
jButton1.addActionListener(actionlistener);
jButton2.addActionListener(actionlistener);
jButton3.addActionListener(actionlistener);
}
public static void main(String[] args) {
new ChatRoomClient("聊天室客户端");
}
}
class myactionlistener implements ActionListener{
private JTextField jTextField1;
private JTextField jTextField2;
private JTextField jTextField3;
private JTextArea jTextArea;
private int port=0;
private String serveraddr=null;
private boolean action=false;
private ChatRoomClient chatRoomClient;
public Thread1 thread1=null;
private JButton jButton=null;
private FileThread1 fileThread1=null;
private JLabel jLabel;
private JProgressBar jProgressBar;
public void setaction(boolean action){
this.action=action;
}
public void setjButton3(JButton jButton){
this.jButton=jButton;
}
myactionlistener(JTextField jTextField1,JTextField jTextField2,JTextField jTextField3,JTextArea jTextArea,ChatRoomClient chatRoomClient,JLabel jLabel,JProgressBar jProgressBar){
this.jTextField1=jTextField1;
this.jTextField2=jTextField2;
this.jTextField3=jTextField3;
this.jTextArea=jTextArea;
this.chatRoomClient=chatRoomClient;
this.jLabel=jLabel;
this.jProgressBar=jProgressBar;
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("连接")){
if(jTextField1.getText().equals("")||jTextField2.getText().equals("")){
JOptionPane.showMessageDialog(chatRoomClient,"请输入服务器IP地址和端口号!");
}else{
jTextArea.setText("");
serveraddr=jTextField1.getText();
port=Integer.parseInt((jTextField2.getText()));
thread1=new Thread1(serveraddr,port,jTextField3,jTextArea,chatRoomClient,this,jButton);
thread1.start();
fileThread1=new FileThread1("192.168.0.104",port+1,jTextArea,chatRoomClient,this,jLabel,jProgressBar);
fileThread1.start();
}
}
else if(e.getActionCommand().equals("发送")){
if(jTextField1.getText().equals("")||jTextField2.getText().equals("")){
jTextField3.setText("");
JOptionPane.showMessageDialog(chatRoomClient,"请先输入服务器IP地址和端口号!");
}else if(!jTextField1.getText().equals("")&&!jTextField2.getText().equals("")&&action==false){
JOptionPane.showMessageDialog(chatRoomClient,"请先连接服务器!");
}else if(!jTextField1.getText().equals("")&&!jTextField2.getText().equals("")&&action==true&&jTextField3.getText().equals("")){
JOptionPane.showMessageDialog(chatRoomClient,"请输入发送内容!");
}else {
try {
thread1.SetSendValue(jTextField3.getText());
jTextField3.setText("");
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
}
else if(e.getActionCommand().equals("传输文件")){
if(action==true){
fileThread1.SendFile();
}
}
}
}
class Thread1 extends Thread{
private JTextArea jTextArea;
private JTextField jTextField;
private String addr;
private int port;
private Socket clientsocket=null;
private BufferedWriter out=null;
private BufferedReader in=null;
private String RecData;
private ChatRoomClient chatRoomClient;
private myactionlistener actionlistener;
private JButton jButton=null;
Thread1(String addr,int port,JTextField jTextField,JTextArea jTextArea,ChatRoomClient chatRoomClient,myactionlistener actionlistener,JButton jButton){
super();
this.addr=addr;
this.port=port;
this.jTextArea=jTextArea;
this.jTextField=jTextField;
this.chatRoomClient=chatRoomClient;
this.actionlistener=actionlistener;
this.jButton=jButton;
}
public void SetSendValue(String SendData) throws IOException {
out.write(SendData);
out.newLine();
out.flush();
jTextArea.append("客户机发送消息:"+SendData+"\n");
}
@Override
public void run() {
try{
clientsocket=new Socket();
SocketAddress remoteaddr=new InetSocketAddress(addr,port);
jTextArea.append("创建客户端套接字成功!\n");
clientsocket.connect(remoteaddr);
JOptionPane.showMessageDialog(chatRoomClient,"客户机连接成功!");
actionlistener.setaction(true);
jTextArea.append("客户机使用的地址和端口"+clientsocket.getLocalSocketAddress()+"\n");
in=new BufferedReader(new InputStreamReader(clientsocket.getInputStream()));
out=new BufferedWriter(new OutputStreamWriter(clientsocket.getOutputStream()));
while((RecData=in.readLine())!=null) {
jTextArea.append("客户机收到消息:"+RecData+"\n");
}
}
catch (IOException e){
JOptionPane.showMessageDialog(chatRoomClient,"服务器IP地址端口错误或服务器未开启,连接失败!");
jTextArea.setText("");
actionlistener.setaction(false);
}
try{
if(in!=null){
in.close();
}
if(out!=null){
out.close();
}
if(clientsocket!=null){
clientsocket.close();
}
}
catch (IOException e) {
}
}
}/*客户端文件传输线程*/
class FileThread1 extends Thread{
private Socket filesocket=null;
private DataOutputStream Dout=null;
private DataInputStream Din=null;
private JFileChooser jFileChooser=null;
private JTextArea jTextArea;
private String addr;
private int port;
private InetSocketAddress fileremotesocketaddr;
private ChatRoomClient chatRoomClient=null;
private myactionlistener Myactionlistener=null;
private JLabel jLabel;
private JProgressBar jProgressBar;
FileThread1(String addr,int port,JTextArea jTextArea,ChatRoomClient chatRoomClient,myactionlistener Myactionlistener,JLabel jLabel,JProgressBar jProgressBar){
this.addr=addr;
this.port=port;
this.jTextArea=jTextArea;
this.chatRoomClient=chatRoomClient;
this.Myactionlistener=Myactionlistener;
this.jLabel=jLabel;
this.jProgressBar=jProgressBar;
/*初始化数据*/
}
public void SendFile(){/*传输文件方法*/
jFileChooser=new JFileChooser();//文件传输弹出窗口
jFileChooser.setFileSelectionMode(FILES_ONLY);//设置为仅传输文件模式
jFileChooser.showDialog(chatRoomClient,"发送文件");
File f=jFileChooser.getSelectedFile();//获得选择文件对象
if(f!=null){
byte[] data=new byte[1024];
String filename=f.getName();
jLabel.setText((filename));
try{/*传输文件名和文件长度*/
Dout.writeUTF(filename);
Dout.flush();
Dout.writeLong(f.length());
Dout.flush();
} catch (IOException e) {
e.printStackTrace();
}
try{
jTextArea.append("开始传输文件数据···········\n");
Myactionlistener.thread1.SetSendValue("服务器正在向您传输文件··········");
FileInputStream fin=new FileInputStream(f);//创建文件输入流读取文件数据
int length=0;
long progress=0;
int progressrate=0;
while ((length=fin.read(data,0,data.length))!=-1){//将文件中的数据读到data字节数组中并判断是否到达文件末尾
Dout.write(data,0,length);//将字节数组中的读出数据写入传输数据流
Dout.flush();//刷新缓冲区
progress+=length;
progressrate=(int)(100*progress/f.length());
jProgressBar.setValue(progressrate);//调整进度条进度
}
JOptionPane.showMessageDialog(chatRoomClient,"文件传输完成!");
jTextArea.append("文件"+f.getName()+"传输完成\n");
jProgressBar.setValue(0);//进度重置
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void run() {
FileOutputStream fileOutputStream=null;
try {
fileremotesocketaddr=new InetSocketAddress(addr,port);
filesocket=new Socket();
filesocket.connect(fileremotesocketaddr);
jTextArea.append("客户机传输文件的地址和端口"+filesocket.getLocalSocketAddress()+"\n");
Dout=new DataOutputStream((filesocket.getOutputStream()));
Din=new DataInputStream((filesocket.getInputStream()));
while (filesocket.isConnected()&&!filesocket.isClosed()) {//判断当前是否处于连接状态,可持续监听文件传输
String filename = Din.readUTF();//监听阻塞读取文件名
long filelength = Din.readLong();//监听阻塞读取文件长度
File file = new File("/home/hgd/桌面/" + filename);//在客户端的相应路径下新建文件
if (!file.exists()) {
file.createNewFile();//判断文件对象是否在客户机中存在映射对象,若无则新建
}
jTextArea.append("正在接收文件:" + filename + "··········\n");
fileOutputStream = new FileOutputStream(file);
byte[] data = new byte[1024];
int length = 0;
int progress=0;
int progressrate=0;
while ((length = Din.read(data, 0, data.length)) != -1) {//不断读取发送过来的文件数据,直到传输完毕(无限制会阻塞)
fileOutputStream.write(data, 0, length);
fileOutputStream.flush();
progress+=length;
progressrate=(int)(100*progress/filelength);
jProgressBar.setValue(progressrate);//设置传输进度
if(progress==filelength)//传输完毕即退出当前循环,若无该限制则将陷入read的阻塞
break;
}
JOptionPane.showMessageDialog(chatRoomClient,"文件接收完成!");
jTextArea.append("文件"+file.getName()+"接收完成\n");
jProgressBar.setValue(0);//进度重置
}
} catch (IOException e) {
e.printStackTrace();
}
try{
if(fileOutputStream!=null){
fileOutputStream.close();
}
if (Din!=null){
Din.close();
}
if (Dout != null) {
Dout.close();
}
if (filesocket!=null){
filesocket.close();
}
}
catch (IOException e){
System.out.println("异常信息"+e.getMessage());
}
}
}
服务端代码:
import jdk.nashorn.internal.scripts.JO;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
import java.util.Date;
import static javax.swing.JFileChooser.FILES_ONLY;
public class ChatRoomServer extends JFrame {
private JPanel jPanel;
private JLabel jLabel1;
private JLabel jLabel2;
private JLabel jLabel3;
private JLabel jLabel4;
private JButton jButton1;
private JButton jButton2;
private JButton jButton3;
private JTextArea jTextArea;
private JTextField jTextField1;
private JTextField jTextField2;
private JProgressBar jProgressBar;
private mybuttonactionlistener buttonlistener;
public ChatRoomServer(String title){
super(title);
setLayout(null);
setVisible(true);
setBounds(700,250,510,500);
setResizable(false);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
init();
}
public void init(){
jPanel=new JPanel();
jPanel.setLayout(null);
jPanel.setBounds(0,0,510,500);
jPanel.setVisible(true);
jLabel1=new JLabel("聊天室服务端");
jLabel1.setBounds(150,0,300,50);
jLabel1.setFont(new Font("宋体",Font.BOLD,25));
jLabel2=new JLabel("端口号:");
jLabel2.setBounds(425,50,75,50);
jLabel2.setFont(new Font("宋体",Font.BOLD,15));
jLabel3=new JLabel("");
jLabel3.setBounds(415,165,90,30);
jLabel3.setFont(new Font("宋体",Font.BOLD,15));
jLabel4=new JLabel(":文件传输进度");
jLabel4.setBounds(415,410,85,30);
jLabel4.setFont(new Font("宋体",Font.BOLD,12));
jTextArea=new JTextArea();
jTextField1=new JTextField("");
jTextField2=new JTextField("");
jProgressBar=new JProgressBar();
jProgressBar.setBounds(10,410,400,30);
jProgressBar.setMaximum(100);
jProgressBar.setMinimum(0);
jProgressBar.setValue(0);
jProgressBar.setStringPainted(true);
jButton1=new JButton("开启");
jButton1.setBounds(415,120,65,30);
buttonlistener=new mybuttonactionlistener(this,jTextArea,jLabel3,jProgressBar);
buttonlistener.SetPortValue(jTextField1);
jButton1.setActionCommand("开启");
jButton1.addActionListener(buttonlistener);
jButton3=new JButton("传输文件");
jButton3.setBounds(415,200,80,30);
jButton3.setFont(new Font("宋体",Font.BOLD,10));
jButton3.setActionCommand("传输文件");
jButton3.addActionListener(buttonlistener);
jButton2=new JButton("发送");
jButton2.setBounds(415,370,65,30);
buttonlistener.SetSendValue(jTextField2);
jButton2.setActionCommand("发送");
jButton2.addActionListener(buttonlistener);
jTextArea.setLineWrap(true);
jTextArea.setEditable(false);
jTextArea.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
JScrollPane jScrollPane=new JScrollPane(jTextArea);
jScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
jScrollPane.setBounds(10,60,400,300);
jTextField1.setBounds(415,85,65,30);
jTextField2.setBounds(10,370,400,30);
jPanel.add(jLabel1);
jPanel.add(jLabel2);
jPanel.add(jLabel3);
jPanel.add(jLabel4);
jPanel.add(jTextField1);
jPanel.add(jScrollPane);
jPanel.add(jTextField2);
jPanel.add(jButton1);
jPanel.add(jButton2);
jPanel.add(jButton3);
jPanel.add(jProgressBar);
add(jPanel);
}
public static void main(String[] args) {
new ChatRoomServer("聊天室服务端");
}
}
class mybuttonactionlistener implements ActionListener {
private JTextField jTextField1;
private JTextField jTextField2;
private ChatRoomServer chatRoomServer;
private JTextArea jTextArea;
private boolean action=false;
public Thread2 thread2=null;
private FileThread2 fileThread2=null;
private JLabel jLabel;
private JProgressBar jProgressBar;
public void SetAction(boolean action){
this.action=action;
}
public void SetPortValue(JTextField jTextField){
this.jTextField1=jTextField;
}
public void SetSendValue(JTextField jTextField){
this.jTextField2=jTextField;
}
mybuttonactionlistener(ChatRoomServer chatRoomServer,JTextArea jTextArea,JLabel jLabel,JProgressBar jProgressBar){
super();
this.chatRoomServer=chatRoomServer;
this.jTextArea=jTextArea;
this.jLabel=jLabel;
this.jProgressBar=jProgressBar;
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("开启")){
String portvalueString=jTextField1.getText();
if(portvalueString.equals("")){
JOptionPane.showMessageDialog(chatRoomServer,"请输入端口值!");
}
else if(!portvalueString.equals("")&&action==false){
int portvalueInt=Integer.parseInt(portvalueString);
thread2=new Thread2(portvalueInt,jTextArea,chatRoomServer,jLabel,this);
thread2.start();
fileThread2=new FileThread2("192.168.0.104",portvalueInt+1,jTextArea,chatRoomServer,this,jLabel,jProgressBar);
fileThread2.start();
}
}
else if(e.getActionCommand().equals("发送")){
if(jTextField1.getText().equals("")){
JOptionPane.showMessageDialog(chatRoomServer,"请先输入端口值!");
}
else if(!jTextField1.getText().equals("") && jTextField2.getText().equals("")){
JOptionPane.showMessageDialog(chatRoomServer,"请输入发送内容!");
}
else if(!jTextField1.getText().equals("") && jTextField2.getText().equals("")&&action==false){
JOptionPane.showMessageDialog(chatRoomServer,"请先开启服务!");
}
else if(!jTextField1.getText().equals("") && !jTextField2.getText().equals("")&&action==false){
JOptionPane.showMessageDialog(chatRoomServer,"暂无客户机请求连接!");
}
else if(!jTextField1.getText().equals("") && !jTextField2.getText().equals("")&&action==true){
String sendvalue=jTextField2.getText();
try {
thread2.SetSendValue(sendvalue);
jTextArea.append("服务器发送消息:"+sendvalue+"\n");
jTextField2.setText("");
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
}else if(e.getActionCommand().equals("传输文件")){
if(action==true){
fileThread2.SendFile();
}else{
JOptionPane.showMessageDialog(chatRoomServer,"暂无客户机请求连接");
}
}
}
}
class Thread2 extends Thread{
private ChatRoomServer chatRoomServer=null;
private int port;
private JTextArea jTextArea;
private BufferedWriter Out=null;
private JLabel jLabel;
private mybuttonactionlistener Mybuttonactionlistener=null;
Thread2(int port,JTextArea jTextArea,ChatRoomServer chatRoomServer,JLabel jLabel,mybuttonactionlistener Mybuttonactionlistener){
super();
this.port=port;
this.jTextArea=jTextArea;
this.chatRoomServer=chatRoomServer;
this.jLabel=jLabel;
this.Mybuttonactionlistener=Mybuttonactionlistener;
}
public void SetSendValue(String value) throws IOException {
Out.write(value);
Out.newLine();
Out.flush();
}
@Override
public void run() {
ServerSocket linstensocket=null;
Socket clientsocket=null;
BufferedReader in=null;
BufferedWriter out=null;
String recvstr;
try{
linstensocket=new ServerSocket();
SocketAddress serveraddr=new InetSocketAddress("192.168.0.104",port);
linstensocket.bind(serveraddr);//绑定服务器地址
jTextArea.append("服务器启动成功!,开始在"+serveraddr.toString()+"监听数据!\n");
clientsocket=linstensocket.accept();//建立连接,阻塞等待
jTextArea.append("客户机连接成功!,客户端地址和数据端口:"+clientsocket.getRemoteSocketAddress()+"\n");
Mybuttonactionlistener.SetAction(true);
in=new BufferedReader(new InputStreamReader(clientsocket.getInputStream()));
out=new BufferedWriter(new OutputStreamWriter(clientsocket.getOutputStream()));
Out=out;
while ((recvstr=in.readLine())!=null){
jTextArea.append("服务器收到信息:"+recvstr+"\n");
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("传输异常!");
}
try{
if (in!=null){
in.close();
}
if (out != null) {
out.close();
}
if (linstensocket!=null){
linstensocket.close();
}
if (clientsocket!=null){
clientsocket.close();
}
JOptionPane.showMessageDialog(chatRoomServer,"客户端与服务器断开连接!");
jTextArea.setText("");
Mybuttonactionlistener.SetAction(false);
}
catch (IOException e){
System.out.println("异常信息"+e.getMessage());
}
}
}/*文件传输线程*/
class FileThread2 extends Thread{
private ServerSocket fileserversocket=null;
private Socket filesocket=null;
private DataOutputStream Dout=null;
private DataInputStream Din=null;
private JFileChooser jFileChooser=null;
private JTextArea jTextArea;
private String addr;
private int port;
private InetSocketAddress fileremotesocketaddr;
private ChatRoomServer chatRoomServer=null;
private mybuttonactionlistener Mybuttonactionlistener=null;
private JLabel jLabel;
private JProgressBar jProgressBar;
FileThread2(String addr,int port,JTextArea jTextArea,ChatRoomServer chatRoomServer,mybuttonactionlistener Mybuttonactionlistener,JLabel jLabel,JProgressBar jProgressBar){
this.addr=addr;
this.port=port;
this.jTextArea=jTextArea;
this.chatRoomServer=chatRoomServer;
this.Mybuttonactionlistener=Mybuttonactionlistener;
this.jLabel=jLabel;
this.jProgressBar=jProgressBar;
}
public void SendFile() {/*文件传输方法*/
jFileChooser=new JFileChooser();
jFileChooser.setFileSelectionMode(FILES_ONLY);
jFileChooser.showDialog(chatRoomServer,"发送文件");
File f=jFileChooser.getSelectedFile();
if(f!=null){
byte[] data=new byte[1024];
String filename=f.getName();
jLabel.setText((filename));
try{
Dout.writeUTF(filename);
Dout.flush();
Dout.writeLong(f.length());
Dout.flush();
} catch (IOException e) {
e.printStackTrace();
}
try{
jTextArea.append("开始传输文件数据···········\n");
Mybuttonactionlistener.thread2.SetSendValue("服务器正在向您传输文件··········");
FileInputStream fin=new FileInputStream(f);
int length=0;
long progress=0;
int progressrate=0;
while ((length=fin.read(data,0,data.length))!=-1){
Dout.write(data,0,length);
Dout.flush();
progress+=length;
progressrate=(int)(100*progress/f.length());
jProgressBar.setValue(progressrate);
}
JOptionPane.showMessageDialog(chatRoomServer,"文件传输完成!");
jTextArea.append("文件"+f.getName()+"传输完成\n");
jProgressBar.setValue(0);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void run(){
FileOutputStream fileOutputStream=null;
try {
fileserversocket=new ServerSocket();
fileremotesocketaddr=new InetSocketAddress(addr,port);
fileserversocket.bind(fileremotesocketaddr);
filesocket=fileserversocket.accept();//阻塞等待连接
jTextArea.append("客户机连接成功!,服务端地址和文件端口:"+fileremotesocketaddr.toString()+"\n");
jTextArea.append("客户机连接成功!,客户端地址和文件端口:"+filesocket.getRemoteSocketAddress()+"\n");
Dout=new DataOutputStream((filesocket.getOutputStream()));
Din=new DataInputStream((filesocket.getInputStream()));
while (filesocket!=null) {
String filename = Din.readUTF();//阻塞监听
long filelength = Din.readLong();//阻塞监听
File file = new File("C:\Users\Administrator\Desktop\" + filename);
if (!file.exists()) {
file.createNewFile();
}
jTextArea.append("正在接收文件" + filename + "········\n");
fileOutputStream = new FileOutputStream(file);
byte[] data = new byte[1024];
int length = 0;
int progress = 0;
int progressrate = 0;
while ((length = Din.read(data, 0, data.length)) != -1) {//阻塞监听文件数据读取
fileOutputStream.write(data, 0, length);
fileOutputStream.flush();
progress += length;
progressrate = (int) (100 * progress / filelength);
jProgressBar.setValue(progressrate);
if (progress == filelength)//传输完毕退出循环
break;
}
JOptionPane.showMessageDialog(chatRoomServer, "文件接收完成!");
jTextArea.append("文件"+file.getName()+"接收完成\n");
jProgressBar.setValue(0);//进度重置
}
} catch (IOException e) {
e.printStackTrace();
}
try{
if(fileOutputStream!=null){
fileOutputStream.close();
}
if (Din!=null){
Din.close();
}
if (Dout != null) {
Dout.close();
}
if (fileserversocket!=null){
fileserversocket.close();
}
if (filesocket!=null){
filesocket.close();
}
}
catch (IOException e){
System.out.println("异常信息"+e.getMessage());
}
}
}
服务器IP地址:192.168.0.104
消息传输测试端口号:5000
文件传输测试端口号:5001
服务器类型:Windows个人计算机
客户机类型:linux系统计算机
通信条件:同一网段或局域网
消息类型:字符串消息
文件传输类型:任意文件,图片