java socket实现全双工通信

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

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

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

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

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

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

Server端代码:

1package cn.cblue.net1; 2 3import java.awt.BorderLayout; 4import java.awt.event.ActionEvent; 5import java.awt.event.ActionListener; 6import java.awt.event.KeyEvent; 7import java.awt.event.KeyListener; 8import java.io.BufferedReader; 9import java.io.IOException; 10import java.io.InputStreamReader; 11import java.io.PrintWriter; 12import java.net.ServerSocket; 13import java.net.Socket; 14 15import javax.swing.JButton; 16import javax.swing.JFrame; 17import javax.swing.JPanel; 18import javax.swing.JScrollPane; 19import javax.swing.JTextArea; 20import javax.swing.JTextField; 21 22/** 23 * @Description: 服务端 24 * @author huangzjb cblue2013@126.com 25 * @Company Digital China 26 * @date 2014-6-4 下午02:18:06 27 * @version 1.0 28 */ 29 30public class MyServer extends JFrame implements ActionListener { 31 JTextArea jta = null; 32 JTextField jtf = null; 33 JButton jb = null; 34 JPanel jp1 = null; 35 JScrollPane jsp = null; 36 PrintWriter pw = null; 37 38 public static void main(String[] args) { 39 new MyServer(); 40 } 41 42 public MyServer() { 43 jta = new JTextArea(); 44 45 jsp = new JScrollPane(jta); 46 jtf = new JTextField(10); 47 // 注冊回车事件 48 jtf.addKeyListener(new KeyListener() { 49 50 @Override 51 public void keyTyped(KeyEvent e) { 52 } 53 54 @Override 55 public void keyReleased(KeyEvent e) { 56 } 57 58 @Override 59 public void keyPressed(KeyEvent e) { 60 if (e.getKeyCode() == KeyEvent.VK_ENTER) { 61 sendMessage(); 62 } 63 } 64 }); 65 jb = new JButton("发送"); 66 jb.addActionListener(this);// 注冊一个监听事件 67 68 jp1 = new JPanel(); 69 jp1.add(jtf); 70 jp1.add(jb); 71 this.add(jsp, BorderLayout.CENTER); 72 this.add(jp1, BorderLayout.SOUTH); 73 this.setTitle("chat server"); 74 this.setSize(300, 200); 75 this.setVisible(true); 76 77 // 接收从client发送过来的消息 78 try { 79 ServerSocket ss = new ServerSocket(2222); 80 Socket s = ss.accept(); 81 BufferedReader in = new BufferedReader(new InputStreamReader(s 82 .getInputStream())); 83 pw = new PrintWriter(s.getOutputStream(), true);// 写成pw = new PrintWriter(s.getOutputStream())会有问题 84 while (true) { 85 String info = in.readLine(); 86 String str = null; 87 if (jta.getText() == null || "".equals(jta.getText())) { 88 str = "Server:" + info; 89 } else { 90 str = jta.getText() + "\r\nServer:" + info; 91 } 92 jta.setText(str); 93 jta.setCaretPosition(jta.getDocument().getLength()); 94 } 95 96 } catch (IOException e) { 97 // TODO Auto-generated catch block 98 e.printStackTrace(); 99 } 100 101 } 102 103 // 把信息给client 104 @Override 105 public void actionPerformed(ActionEvent e) { 106 // TODO Auto-generated method stub 107 if (e.getSource() == jb) { 108 sendMessage(); 109 } 110 } 111 112 /** 113 * @Description: 发送消息给client 114 * @throws 115 */ 116 public void sendMessage() { 117 String info = jtf.getText(); 118 pw.println(info); 119 pw.flush(); 120 jtf.setText(""); 121 if (jta.getText() == null || "".equals(jta.getText())) { 122 jta.append("Client:" + info); 123 } else { 124 jta.append("\r\nClient:" + info); 125 } 126 127 jta.setCaretPosition(jta.getDocument().getLength());// 设置滚动栏自己主动滚动 128 } 129}

Client端代码:

1package cn.cblue.net1; 2 3import java.awt.BorderLayout; 4import java.awt.event.ActionEvent; 5import java.awt.event.ActionListener; 6import java.awt.event.KeyEvent; 7import java.awt.event.KeyListener; 8import java.io.BufferedReader; 9import java.io.IOException; 10import java.io.InputStreamReader; 11import java.io.PrintWriter; 12import java.net.Socket; 13 14import javax.swing.JButton; 15import javax.swing.JFrame; 16import javax.swing.JPanel; 17import javax.swing.JScrollPane; 18import javax.swing.JTextArea; 19import javax.swing.JTextField; 20 21/** 22 * @Description: client 23 * @author huangzjb cblue2013@126.com 24 * @Company Digital China 25 * @date 2014-6-4 下午02:18:24 26 * @version 1.0 27 */ 28 29public class MyClient extends JFrame implements ActionListener { 30 31 JTextArea jta = null; 32 JTextField jtf = null; 33 JButton jb = null; 34 JPanel jp1 = null; 35 JScrollPane jsp = null; 36 PrintWriter pw = null; 37 38 public static void main(String[] args) { 39 new MyClient(); 40 } 41 42 public MyClient() { 43 jta = new JTextArea(); 44 jsp = new JScrollPane(jta); 45 jtf = new JTextField(10); 46 // 注冊回车事件 47 jtf.addKeyListener(new KeyListener() { 48 @Override 49 public void keyTyped(KeyEvent e) { 50 51 } 52 53 @Override 54 public void keyReleased(KeyEvent e) { 55 56 } 57 58 @Override 59 public void keyPressed(KeyEvent e) { 60 if (e.getKeyCode() == KeyEvent.VK_ENTER) { 61 sendMessage(); 62 } 63 } 64 }); 65 66 jb = new JButton("发送"); 67 jb.addActionListener(this);// 注冊一个监听事件 68 69 jp1 = new JPanel(); 70 jp1.add(jtf); 71 jp1.add(jb); 72 this.add(jsp, BorderLayout.CENTER); 73 this.add(jp1, BorderLayout.SOUTH); 74 this.setTitle("chat client"); 75 this.setSize(300, 200); 76 this.setVisible(true); 77 78 // 接收从服务端发送过来的消息 79 try { 80 Socket s = new Socket("127.0.0.1", 2222); 81 BufferedReader in = new BufferedReader(new InputStreamReader(s 82 .getInputStream())); 83 pw = new PrintWriter(s.getOutputStream(), true); 84 while (true) { 85 String info = in.readLine(); 86 String str = null; 87 if (jta.getText() == null || "".equals(jta.getText())) { 88 str = "Server:" + info; 89 } else { 90 str = jta.getText() + "\r\nServer:" + info; 91 } 92 jta.setText(str); 93 jta.setCaretPosition(jta.getDocument().getLength()); 94 } 95 96 } catch (IOException e) { 97 e.printStackTrace(); 98 } 99 100 } 101 102 // 把信息给server端 103 @Override 104 public void actionPerformed(ActionEvent e) { 105 if (e.getSource() == jb) { 106 sendMessage(); 107 108 } 109 } 110 111 112 /** 113 * @Description: 发送消息给server端 114 * @throws 115 */ 116 public void sendMessage() { 117 String info = jtf.getText(); 118 pw.println(info); 119 pw.flush(); 120 jtf.setText(""); 121 if (jta.getText() == null || "".equals(jta.getText())) { 122 jta.append("Client:" + info); 123 } else { 124 jta.append("\r\nClient:" + info); 125 } 126 jta.setCaretPosition(jta.getDocument().getLength());// 设置滚动栏自己主动滚动 127 } 128 129}
点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )