版權聲明:本文爲博主原創文章,未經博主贊成不得轉載。 https://blog.csdn.net/hzj9118/article/details/28419651
單工、半雙工和全雙工的定義html
假設在通訊過程的隨意時刻,信息僅僅能由一方A傳到還有一方B。則稱爲單工。java
假設在隨意時刻,信息既可由A傳到B,又能由B傳A。但僅僅能由一個方向上的傳輸存在,稱爲半雙工傳輸。git
假設在隨意時刻,線路上存在A到B和B到A的雙向信號傳輸,則稱爲全雙工。app
用swing 作的簡單界面 實現了client和server端全雙工通訊。jsp
Server端代碼:
ide
package cn.cblue.net1; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; /** * @Description: 服務端 * @author huangzjb cblue2013@126.com * @Company Digital China * @date 2014-6-4 下午02:18:06 * @version 1.0 */ public class MyServer extends JFrame implements ActionListener { JTextArea jta = null; JTextField jtf = null; JButton jb = null; JPanel jp1 = null; JScrollPane jsp = null; PrintWriter pw = null; public static void main(String[] args) { new MyServer(); } public MyServer() { jta = new JTextArea(); jsp = new JScrollPane(jta); jtf = new JTextField(10); // 註冊回車事件 jtf.addKeyListener(new KeyListener() { @Override public void keyTyped(KeyEvent e) { } @Override public void keyReleased(KeyEvent e) { } @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) { sendMessage(); } } }); jb = new JButton("發送"); jb.addActionListener(this);// 註冊一個監聽事件 jp1 = new JPanel(); jp1.add(jtf); jp1.add(jb); this.add(jsp, BorderLayout.CENTER); this.add(jp1, BorderLayout.SOUTH); this.setTitle("chat server"); this.setSize(300, 200); this.setVisible(true); // 接收從client發送過來的消息 try { ServerSocket ss = new ServerSocket(2222); Socket s = ss.accept(); BufferedReader in = new BufferedReader(new InputStreamReader(s .getInputStream())); pw = new PrintWriter(s.getOutputStream(), true);// 寫成pw = new PrintWriter(s.getOutputStream())會有問題 while (true) { String info = in.readLine(); String str = null; if (jta.getText() == null || "".equals(jta.getText())) { str = "Server:" + info; } else { str = jta.getText() + "\r\nServer:" + info; } jta.setText(str); jta.setCaretPosition(jta.getDocument().getLength()); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // 把信息給client @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if (e.getSource() == jb) { sendMessage(); } } /** * @Description: 發送消息給client * @throws */ public void sendMessage() { String info = jtf.getText(); pw.println(info); pw.flush(); jtf.setText(""); if (jta.getText() == null || "".equals(jta.getText())) { jta.append("Client:" + info); } else { jta.append("\r\nClient:" + info); } jta.setCaretPosition(jta.getDocument().getLength());// 設置滾動欄本身主動滾動 } }
Client端代碼:this
package cn.cblue.net1; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; /** * @Description: client * @author huangzjb cblue2013@126.com * @Company Digital China * @date 2014-6-4 下午02:18:24 * @version 1.0 */ public class MyClient extends JFrame implements ActionListener { JTextArea jta = null; JTextField jtf = null; JButton jb = null; JPanel jp1 = null; JScrollPane jsp = null; PrintWriter pw = null; public static void main(String[] args) { new MyClient(); } public MyClient() { jta = new JTextArea(); jsp = new JScrollPane(jta); jtf = new JTextField(10); // 註冊回車事件 jtf.addKeyListener(new KeyListener() { @Override public void keyTyped(KeyEvent e) { } @Override public void keyReleased(KeyEvent e) { } @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) { sendMessage(); } } }); jb = new JButton("發送"); jb.addActionListener(this);// 註冊一個監聽事件 jp1 = new JPanel(); jp1.add(jtf); jp1.add(jb); this.add(jsp, BorderLayout.CENTER); this.add(jp1, BorderLayout.SOUTH); this.setTitle("chat client"); this.setSize(300, 200); this.setVisible(true); // 接收從服務端發送過來的消息 try { Socket s = new Socket("127.0.0.1", 2222); BufferedReader in = new BufferedReader(new InputStreamReader(s .getInputStream())); pw = new PrintWriter(s.getOutputStream(), true); while (true) { String info = in.readLine(); String str = null; if (jta.getText() == null || "".equals(jta.getText())) { str = "Server:" + info; } else { str = jta.getText() + "\r\nServer:" + info; } jta.setText(str); jta.setCaretPosition(jta.getDocument().getLength()); } } catch (IOException e) { e.printStackTrace(); } } // 把信息給server端 @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == jb) { sendMessage(); } } /** * @Description: 發送消息給server端 * @throws */ public void sendMessage() { String info = jtf.getText(); pw.println(info); pw.flush(); jtf.setText(""); if (jta.getText() == null || "".equals(jta.getText())) { jta.append("Client:" + info); } else { jta.append("\r\nClient:" + info); } jta.setCaretPosition(jta.getDocument().getLength());// 設置滾動欄本身主動滾動 } }