今天小小的弄了一個全雙工,加了一個簡單的界面,還是能夠基本完成相互發送信息的需求的
代碼如下:
服務器端:
//簡易全雙工
package ServerTest3;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
public class MyServer3 extends JFrame{
//先做一個簡單的界面
JButton sendButton = new JButton("發送");
JTextField sendField = new JTextField(10);
JTextArea showArea = new JTextArea();
JScrollPane scrollPane = new JScrollPane(showArea);
JPanel sendPanel = new JPanel();
PrintWriter pw;
public MyServer3(){
ActionListener sendActionListener = new ActionListener(){
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String sendinfo = sendField.getText();
pw.println(sendinfo);
sendField.setText("");
}
};
sendButton.addActionListener(sendActionListener);
sendPanel.add(sendField);
sendPanel.add(sendButton);
//爲了更加像一個顯示窗口 我讓禁止在內容顯示窗口的編輯
//屏蔽鍵盤事件或許更好些 不過小弟技術有限
showArea.setEditable(false);
this.add(scrollPane);
this.add(sendPanel,BorderLayout.SOUTH);
this.setSize(300, 200);
this.setTitle("服務器端");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
try {
//監聽本機端口9999
ServerSocket ss = new ServerSocket(9999);
Socket s = ss.accept();
showArea.append("連接成功\n");
//PrintWriter必須要和Socket在一塊哦 因爲這倆個是聯繫在一起的 不然發不對地方的
//不過爲了讓下面的sendActionListener使用
//可以定義成全局變量
pw = new PrintWriter(s.getOutputStream(),true);
//不斷接收來自客戶端的信息
InputStreamReader isr = new InputStreamReader(s.getInputStream());
BufferedReader br = new BufferedReader(isr);
while(true){
String getinfo = br.readLine();
showArea.append("客戶端發來信息:"+getinfo+"\n");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
MyServer3 ms3 = new MyServer3();
}
}
客戶端:
//簡易全雙工
package ClientTest3;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
public class MyClient3 extends JFrame{
//先做一個簡單的界面
JButton sendButton = new JButton("發送");
JTextField sendField = new JTextField(10);
JTextArea showArea = new JTextArea();
JScrollPane scrollPane = new JScrollPane(showArea);
JPanel sendPanel = new JPanel();
PrintWriter pw;
;
public MyClient3(){
//定義發送按鈕的事件
ActionListener sendActionListener = new ActionListener(){
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String sendinfo = sendField.getText();
pw.println(sendinfo);
sendField.setText("");
}
};
sendButton.addActionListener(sendActionListener);
sendPanel.add(sendField);
sendPanel.add(sendButton);
//爲了更加像一個顯示窗口 我讓禁止在內容顯示窗口的編輯
//屏蔽鍵盤事件或許更好些 不過小弟技術有限
showArea.setEditable(false);
this.add(scrollPane);
this.add(sendPanel,BorderLayout.SOUTH);
this.setSize(300, 200);
this.setTitle("客戶端");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
//連接本機端口9999
try {
Socket s = new Socket("127.0.0.1",9999);
showArea.append("連接成功\n");
pw = new PrintWriter(s.getOutputStream(),true);
//接受來自服務器的信息
InputStreamReader isr = new InputStreamReader(s.getInputStream());
BufferedReader br = new BufferedReader(isr);
while(true){
String getinfo = br.readLine();
showArea.append("服務器發來信息:"+getinfo+"\n");
}
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
MyClient3 ms3 = new MyClient3();
}
}
效果圖: