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

如果在通信过程的任意时刻,信息只能由一方A传到另一方B,则称为单工。

如果在任意时刻,信息既可由A传到B,又能由B传A,但只能由一个方向上的传输存在,称为半双工传输。

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

用swing 做的简单界面 实现了客户端和服务器端全双工通信。

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);

// 接收从客户端发送过来的消息

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();

}

}

// 把信息给客户端

@Override

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

if (e.getSource() == jb) {

sendMessage();

}

}

/**

* @Description: 发送消息给客户端

* @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: 客户端

* @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();

}

}

// 把信息给服务器端

@Override

public void actionPerformed(ActionEvent e) {

if (e.getSource() == jb) {

sendMessage();

}

}

/**

* @Description: 发送消息给服务器端

* @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());// 设置滚动条自动滚动

}

}

java socket 全双工_java socket实现全双工通信相关推荐

  1. java socket 端口_Java Socket通信如何摆平自身端口问题

    Java Socket通信在使用的时候有不少的问题,在端口编程上来说是一个十分重要的.下面我们就看看Java Socket通信如何才能更好的使用相关的代码.希望大家有所帮助. 事实上网络编程简单的理解 ...

  2. java socket通信安全_Java Socket通信

    原理: 1.基于TCP协议,建立稳定连接的点对点的通信 a.实时,快速,安全性高,占用系统资源多,效率低 2.请求-响应模式 a.客户端 在网络通讯中,第一次主动发起通讯的程序被称作客户端(Clien ...

  3. java socket字符串_Java Socket Bug:从Socket的InputStream读取字符串

    我正在使用Socket与ServerSocket进行通信.字符串正从服务器发送到我的套接字.每条不同的行都是一条消息,在解析时包含信息.要阅读这些文本行,请使用扫描仪. 问题在于数据正在"爆 ...

  4. java socket 工具_java Socket简易聊天工具

    本文实例为大家分享了一款Socket简易聊天工具,希望大家喜欢. 代码运行如图,看起来还不错 服务端 package qiu; import java.awt.BorderLayout; import ...

  5. java socket 工具_java+socket 简易聊天工具

    1.服务器端程序 package com.test3; import java.io.*; import java.net.*; import java.awt.*; import java.awt. ...

  6. java socket数据传输_Java Socket编程(一) Socket传输模式

    Java Socket编程(一) Socket传输模式 文章来源:ASPCN 作者:孙雯 Socket传输模式 Sockets有两种主要的操作方式:面向连接的和无连接的.面向连接的sockets操作就 ...

  7. java socket通讯_Java socket通讯实现过程及问题解决

    这篇文章主要介绍了Java socket通讯实现过程及问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 本来是打算验证java socket是 ...

  8. java socket 超时_Java Socket超时浅析

    套接字或插座(socket)是一种软件形式的抽象,用于表达两台机器间一个连接的"终端".针对一个特定的连接,每台机器上都有一个"套接字",可以想象它们之间有一条 ...

  9. java socket 卡住_Java socket通讯实现过程及问题解决

    这篇文章主要介绍了java socket通讯实现过程及问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 本来是打算验证java socket是 ...

最新文章

  1. 用于面包板的双列直插需要多宽?
  2. [Python]--爬虫 Resources Collection
  3. eclipse 连接mysql_eclipse连接MySQL
  4. 原生js实现一个tab栏的标签操作
  5. 尚学堂java 答案解析 第六章
  6. OO’s Sequence
  7. 【chrome插件】web版微信接入图灵机器人API实现自动回复
  8. emmet工具使用和技巧
  9. 学习笔记之在eclipse中,使用ADT开发
  10. 02-学习笔记(webstorm设置代码自动缩进量)【新手上路,多多关照】
  11. python哪个方向工资高_深圳python工资高还是java
  12. java中如何导出excel_java中如何导出excel表格
  13. SpringBoot使用SSE推送消息
  14. 破解版IDM导致电脑反复闪屏的解决方案
  15. 《林徽因——不慌不忙的坚强》笔记和感悟
  16. NAS信令学习笔记 ——TAU(1)
  17. 3D标签云/滚动词条
  18. solr的多条件组合查询
  19. 判断一个整型数据有几位
  20. NeurIPS 2020 | 数据类别不平衡/长尾分布?不妨利用半监督或自监督学习

热门文章

  1. 受半导体短缺及疫情影响,丰田已下调9月10月及当前财年产量预期
  2. 饿了么上架iPhone 12:最快花呗10分钟拿到手
  3. 数百辆共享单车被丢垃圾场!官方回应...
  4. 化繁为简 回归初心 细品雅致设计的vivo X50系列
  5. 丰巢强制收费引吐槽,杭州硬核小区用行动抵制:停用!
  6. 不能再任性 APP收集个人信息基本规范公开征求意见
  7. 小米MIX 4 8月不会发布:或配屏下摄像头/100W快充
  8. 百度再回应“泼水门”:强烈谴责 肇事者已被公安机关带走
  9. 受上海Model S自燃影响?特斯拉市值周一蒸发18亿美元
  10. OPPO副总裁曝光Reno十倍变焦规格 能用上的安卓机皇不超过两个