我寫了兩段ServerSocket及Socket的程式,但是卻只跑一半,兩個程式後面的部分都沒顯示出來。 Server的部分只顯示到 "從客戶端收到:" ,之後的txa.append(rec_str+"\n") 跟 txa.append("Transfer completed"+"\n") 就都沒有顯示。
另外在 Socket 的部分也是只顯示到 "從伺服端收到 : Honer shows the man." ,後面的程式 "txa.append("傳遞 Received 到伺服端..."+"\n")" 就沒有顯示了,可以請高手幫我看一下問題是錯在哪裡嗎 ? 謝謝喔 !
以下分別是兩段程式碼 :
import java.net.;
import java.io.;
import java.awt.;
import java.awt.event.;
public class Practice extends Frame implements ActionListener{
static Practice frm = new Practice();
static TextArea txa = new TextArea("",8,14,TextArea.SCROLLBARS_NONE);
static Button btn = new Button("連線");
public static void main(String args[]) {
frm.setBounds(700,450,200,150);
BorderLayout br = new BorderLayout(2,2);
frm.setLayout(br);
btn.addActionListener(frm);
txa.setEditable(false);
frm.add(txa, br.CENTER);
frm.add(btn, br.SOUTH);
frm.setVisible(true);
frm.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {System.exit(0);}});
}
public void actionPerformed(ActionEvent e) {
txa.setText("");
Button btn1 = (Button)e.getSource();
if(btn == btn1) {
try {
ServerSocket svs = new ServerSocket(2525);
txa.append("等候客戶端得請求中......"+"\n");
Socket s = svs.accept();
txa.append("客戶端已和本機連上線....."+"\n");
OutputStream out = s.getOutputStream();
String str = "Honer shows the man."; //取得輸出串流
txa.append("資料正在傳送中........."+"\n");
out.write(str.getBytes());
txa.append("資料傳送完畢..."+"\n");
InputStream in=s.getInputStream();
byte buff[]=new byte[2048];
int n=in.read(buff);
txa.append("從客戶端收到: ");
String rec_str=new String(buff,0,n);
txa.append(rec_str+"\n");
if(rec_str.equals("Received")) {
txa.append("Transfer completed"+"\n");
}
out.close();
in.close();
s.close();
}
catch(Exception ge) {
System.out.println("發生"+ge+"意外");
}
btn.setEnabled(false);
}
}
}
import java.net.;
import java.io.;
import java.awt.;
import java.awt.event.;
public class client extends Frame implements ActionListener {
static client frm = new client();
static Button btn=new Button("連線");
static TextArea txa=new TextArea("",8,14,TextArea.SCROLLBARS_NONE);
public static void main(String args[]) {
BorderLayout br=new BorderLayout(2,2);
frm.setLayout(br);
frm.setBounds(750,550,200,150);
btn.addActionListener(frm);
frm.add(btn,br.SOUTH);
frm.add(txa,br.CENTER);
frm.setVisible(true);
frm.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {System.exit(0);}});
}
public void actionPerformed(ActionEvent e) {
txa.setText("");
byte buff[] = new byte[2048];
try {
txa.append("正在與伺服器建立連線....."+"\n");
Socket s = new Socket("127.0.0.1", 2525);
txa.append("已經與伺服器取得連線....."+"\n");
InputStream in = s.getInputStream(); //建立輸入串流
int n = in.read(buff);
txa.append("從伺服端收到 : ");
String str=new String(buff,0,n);
txa.append(str+"\n");
if(str.equals("Honor shows the man.")) {
txa.append("傳遞 Received 到伺服端..."+"\n");
OutputStream out=s.getOutputStream();
String send_str="Received";
out.write(send_str.getBytes());
out.close();
}
in.close();
s.close();
}
catch(Exception ue) {
System.out.println("發生"+ue+"意外");
}
btn.setEnabled(false);
}
}
沒寫過java,但通訊類的通常用執行續或無限迴圈去跑,只有一行這樣寫下來不能保證它可以這麼有順序的回應。
很有可能在回應第一句時另一個程式已經跑完了。
不如在每個回應點加個print或Log來看執行到哪邊就能抓到問題。