版权声明:本文为博主原创文章,未经博主赞成不得转载。 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());// 设置滚动栏本身主动滚动 } }