zoukankan      html  css  js  c++  java
  • java socket实现全双工通信

    版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/hzj9118/article/details/28419651

    单工、半双工和全双工的定义

    假设在通信过程的随意时刻,信息仅仅能由一方A传到还有一方B。则称为单工。

    假设在随意时刻,信息既可由A传到B,又能由B传A。但仅仅能由一个方向上的传输存在,称为半双工传输。

    假设在随意时刻,线路上存在A到B和B到A的双向信号传输,则称为全双工。


    用swing 做的简单界面 实现了client和server端全双工通信。

    Server端代码:

    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() + "
    Server:" + 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("
    Client:" + info);
    		}
    
    		jta.setCaretPosition(jta.getDocument().getLength());// 设置滚动栏自己主动滚动
    	}
    }
    



    Client端代码:

    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() + "
    Server:" + 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("
    Client:" + info);
    			}
    			jta.setCaretPosition(jta.getDocument().getLength());// 设置滚动栏自己主动滚动
    		}
    	
    }
    


  • 相关阅读:
    【CSP-S膜你考】不怕噩梦 (模拟)
    【CSP-S膜你考】 A
    【CSP-S膜你考】即时战略(模拟)
    【CSP-S膜你考】最近公共祖先 (数学)
    【题解】洛谷 P1449 后缀表达式
    【题解】 洛谷 P2649 游戏预言
    【题解】洛谷 P1083 借教室
    【题解】洛谷 P1080 国王游戏
    【题解】洛谷 P1079 Vigenère 密码
    Bzoj4558 [JLoi2016]方
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10549124.html
Copyright © 2011-2022 走看看