我是剛上大學的新手,JAVA課設做聊天室,可是我的檔案總是傳不過去
我是剛上大學的新手,課設做聊天室,可是我的檔案總是傳不過去
我不懂那個監聽器的介面怎麼用,就像我程式碼裡面那個
jbt.addActionListener(this);
我搞不明白this到底指的什麼,文字還可以傳,但是要傳檔案的時候就不可以,我就問了問同學他們直接寫的監聽器,我知道這個程式碼漏洞百出。求求各位幫我指點一下錯誤在哪,謝謝各位了。
下面是客戶端的程式碼:
package yigeshishi;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ClientChatMain extends JFrame implements ActionListener{
public static void main(String[] args){
new ClientChatMain();
}
//bw更改區域性變數定義
static BufferedWriter bw = null;
static private JTextArea jta;
static private JTextField jtf;
SimpleDateFormat sdf=new SimpleDateFormat("MM-dd HH:mm:ss");
Date date=new Date();
String now=sdf.format(date);
public ClientChatMain(){
//文字域
jta = new JTextArea();
jta.setEditable(false);//不可編輯
//滾動條
JScrollPane jsp = new JScrollPane(jta);
//輸入皮膚
JPanel jp = new JPanel();
//輸入文字框
jtf = new JTextField(17);
//傳送按鈕
JButton jbt = new JButton("傳送");
JButton jb = new JButton("檔案傳送");
jp.add(jtf);
jp.add(jbt);
jp.add(jb);
//加入窗體中
this.add(jsp, BorderLayout.CENTER);
this.add(jp,BorderLayout.SOUTH);
this.setTitle("客戶端");
this.setSize(400,400);
this.setLocation(900,400);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
//客戶端
try{
jbt.addActionListener(this);
//建立文字通訊客戶端Socket
Socket cs = new Socket(("127.0.0.1"),0113);
//輸入流
InputStream in = cs.getInputStream();//因為客戶端自動搜尋連線所以這裡和服務端不同,這裡getInputStream()方法歸屬於上面命名的cs
BufferedReader br = new BufferedReader(new InputStreamReader(in));
//輸出流
OutputStream out = cs.getOutputStream();
bw = new BufferedWriter(new OutputStreamWriter(out));
//迴圈讀取資料
String Line;
while((Line = br.readLine())!=null){
jta.append(now + "\n" + Line+System.lineSeparator());
}
//關閉
cs.close();
}catch(IOException e){
e.printStackTrace();
}
try {
//建立檔案傳輸Socket
Socket cs1 = new Socket("127.0.0.1", 1012);
//檔案傳輸監聽器
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new Thread(){
public void run(){
try{
File file = new File("D:\\upload\\hello.jpg");
if(!file.exists()){
file.createNewFile();
}else{
file.delete();
file.createNewFile();
}
RandomAccessFile raf = new RandomAccessFile(file,"rw");
InputStream is =cs1.getInputStream();
InputStream in = new DataInputStream(new BufferedInputStream(is));
byte[] buf = new byte[3072];
int num = in.read(buf);
while(num != -1){
raf.write(buf,0,num);
raf.skipBytes(num);
num = in.read(buf);
}
//關閉
raf.close();
}catch (IOException e1){
e1.printStackTrace();
}
}
}.start();
}
});
}catch(IOException e3){
e3.printStackTrace();
}
}
//傳送按鈕繫結監聽點選事件
@Override
public void actionPerformed(ActionEvent e){
//傳送內容
String text = jtf.getText();
text = "客戶端:" + text;
jta.append( now + "\n" + text + System.lineSeparator());
//傳送
try{
bw.write(text);
bw.newLine();
bw.flush();
}catch(IOException e1){
e1.printStackTrace();
}
jtf.setText("");
}
}
然後是服務端的程式碼:
package yigeshishi;
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.text.SimpleDateFormat;
import java.util.Date;
public class ServerChatMain extends JFrame implements ActionListener{
public static void main(String[] args) { new ServerChatMain(); }
//關於監聽器的重寫用到這三個變數,可是如果一開始在服務端的模組裡定義的的話就只能是區域性變數,需要在外面定義賦值。
static BufferedWriter bw = null;
static private JTextArea jta;
static private JTextField jtf;
SimpleDateFormat sdf=new SimpleDateFormat("MM-dd HH:mm:ss");
Date date=new Date();
String now=sdf.format(date);
public ServerChatMain(){
//介面搭建
//文字域
jta = new JTextArea();
jta.setEditable(false);//不可編輯
//滾動條
JScrollPane jsp = new JScrollPane(jta);
//輸入皮膚
JPanel jp = new JPanel();
//輸入文字框
jtf = new JTextField(17);
//傳送按鈕
JButton jbt = new JButton("傳送");
JButton jb = new JButton("檔案傳送");
jp.add(jtf);
jp.add(jbt);
jp.add(jb);
//加入窗體中
this.add(jsp, BorderLayout.CENTER);
this.add(jp,BorderLayout.SOUTH);
this.setTitle("服務端");
this.setSize(400,400);
this.setLocation(400,400);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
//服務端(多執行緒版本)
try {
jbt.addActionListener(this);
//建立服務端Socket
ServerSocket ss = new ServerSocket(0113);
while(true) {
//等待客戶端連線
Socket socket = ss.accept();
//多執行緒
new Thread(new Runnable(){
@Override
public void run(){
try{
//獲取Socket通道輸入流
InputStream in = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
//獲取Socket通道輸出流
OutputStream out = socket.getOutputStream();
bw = new BufferedWriter(new OutputStreamWriter(out));
//迴圈讀取資料
String Line;
while ((Line = br.readLine()) != null) {
jta.append( now + "\n " + Line + System.lineSeparator());
}
//關閉Socket通道
ss.close();
}catch(IOException e2){
e2.printStackTrace();
}
}
}).start();
}
}catch(IOException e){
e.printStackTrace();
}
try{
ServerSocket ss1 = new ServerSocket(1012);
Socket cs1 =ss1.accept();
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new Thread(){
public void run(){
try {
File file = new File("D:\\zhileng.jpg");
FileInputStream fis = new FileInputStream(file);
OutputStream os =cs1.getOutputStream();
OutputStream dos = new DataOutputStream(new BufferedOutputStream(os));
byte[] buf = new byte[3072];
int num = fis.read(buf);
while(num != -1){
dos.write(buf,0,num);
dos.flush();
num=fis.read(buf);
}
jta.append(file + "傳送成功\n");
fis.close();
}catch(IOException e1){
e1.printStackTrace();
}
}
}.start();
}
});
}catch(IOException e){
e.printStackTrace();
}
}
//傳送按鈕繫結監聽點選事件
@Override
public void actionPerformed(ActionEvent e) {
//文字框傳送的內容
String text = jtf.getText();
text = "服務端:" + text;
jta.append( now + "\n" + text + System.lineSeparator());
//傳送
try {
bw.write(text);
bw.newLine();
bw.flush();
}catch(IOException e1){
e1.printStackTrace();
}
//清空文字框的內容
jtf.setText("");
}
}
實在侍弄不懂到底為什麼了,謝謝各位。這個程式碼是我第一次寫漏洞肯定百出,在各位閒暇時間希望能幫幫小弟。
相關文章
- 我是個程式設計師 大學剛畢業去一家公司面試程式設計師面試
- 我是剛接觸java的,請教大家一問題!Java
- 剛做測試工作一年的時候,我是怎樣的?
- 剛收到了Facebook的Offer,我是這樣為面試做準備的面試
- 面試官:Java 反射是什麼?我回答不上來!面試Java反射
- 我是怎麼做開源的
- 上傳檔案時路徑總是C:\fakepath\的問題
- 我做“劍橋大學專案管理課程”專案的甜酸苦辣(轉)專案管理
- 我們是如何將一個專案做爛的
- 我試著用模式寫東西,可是總是不知道如何下手模式
- 我做過的最糟糕的專案
- 學校上課,是耽誤我學習了。。
- 我是如何做評論模組的?
- 我是如何使用freemarker生成Word檔案的?
- 學習風變程式設計,是我做過最正確的決定!程式設計
- 我是剛開學JAVA,想請教一個問題。Java
- 我用的是RedhatLinux,但是我的.htm檔案顯示出來的卻是HTML原始碼(轉)RedhatLinuxHTML原始碼
- 對不起,我不是針對你,我是說在座的各位都不會寫 Java!Java
- 我曾經是怎麼做面試官的面試
- 我是一個請求,我該何去何從
- 三七互娛殷天明:這是我們過去八年總結的遊戲出海經驗遊戲
- 我是程式設計師,我自豪程式設計師
- 誰能幫我做一下這個簡單的專案啊!我是初學者。
- 全鏈路灰度在資料庫上我們是怎麼做的?資料庫
- 超硬核的Java工程師分享,什麼是Java?為什麼我要做Java,我是如何學習Java的?Java工程師
- 不按傳統套路,我是這樣學習新程式語言的
- Glide總是報錯,我已經設定過映象了啊~~IDE
- 我的大學
- 那些年,我們一起做過的 Java 課後練習題(71 - 75)Java
- 那些年,我們一起做過的 Java 課後練習題(1 - 5)Java
- 這次的年終總結,我是認真的
- 關於男人 | 這是我聽過對於男人最好的總結!
- Java 中的 GraphQL 上傳檔案Java
- 看來我是真的不適合華為系的。。。
- 關於檔案上傳下載我所知道的全部內容
- 為什麼我是世界上最好的程式設計師?程式設計師
- 我是一個請求,我是如何被髮送的?
- 你是設計師? 幫我做個logo 隨便做就行....Go