java socket实现全双工通信

Wesley13
• 阅读 782

版权声明:本文为博主原创文章,未经博主同意不得转载。 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() + "\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端代码:

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());// 设置滚动栏自己主动滚动
        }
    
}
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
3年前
Oracle一张表中实现对一个字段不同值和总值的统计(多个count)
需求:统计WAIT\_ORDER表中的工单总数、未处理工单总数、已完成工单总数、未完成工单总数。表结构:为了举例子方便,WAIT\_ORDER表只有两个字段,分别是ID、STATUS,其中STATUS为工单的状态。1表示未处理,2表示已完成,3表示未完成总数。 SQL:  1.SELECT   2
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这