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

如果在通信过程的任意时刻,信息只能由一方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编程 - 基于Socket实现HTTP下载客户端

    没有借助任何第三方库,完全基于JAVA Socket实现一个最小化的HTTP文件下载客 户端.完整的演示如何通过Socket实现下载文件的HTTP请求(request header)发送 如何从Soc ...

  2. php winform通信,C# Winform 通过Socket实现客户端和服务端TCP通信

    操作界面如下: 1.声明Socket 第一个参数:寻址方式,第二个参数:传输数据的方式,第三个参数:通信协议 Socket socket = new Socket(AddressFamily.Inte ...

  3. java socket通信 客户端_JavaのSocket编程之简单客户端与服务器端通信

    Socket编程之简单客户端与服务器端通信 socket 通常用来实现客户端和服务端的连接,socket 是Tcp/Ip协议的一个十分流行的编程界面,一个socket 由一个Ip地址和一个端口号唯一确 ...

  4. java socket 线程池_java socket编程的一个例子(线程池)

    服务器程序EchoServer.java: import java.io.*; import java.net.*; import java.util.concurrent.*; public cla ...

  5. java socket远空_JAVA Socket超时浅析

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

  6. java socket 循环读取_java socket tcp(服务器循环检测)

    刚才看了下以前写了的代码,tcp通信,发现太简单了,直接又摘抄了一个,运行 博客:http://blog.csdn.net/zhy_cheng/article/details/7819659 优点是服 ...

  7. java socket编程心跳_Java Socket编程心跳包创建实例解析

    1.什么是心跳包? 心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包. 用来判断对方(设备,进程或其它网元)是否正常运行,采用 ...

  8. java socket负载均衡_Java Socket分发服务负载均衡

    1 1. 设备请求分发服务器,分发服务器返回有效的socket服务器ip与port,然后断开连接.2 a) 设备与服务器建立连接.3 b) 服务器接收到连接请求后,立即将分配好的socket服务器ip ...

  9. java 实现 web 客户端_Java web客户端和服务器端交互的原理

    Java web客户端和服务器端交互的原理 其实HTTP客户端和服务器端的交互原理很简单:即先是浏览器和服务器端建立Socket无状态连接,也就是短连接,然后通过IO流进行报文信息(这个报文是严格遵循 ...

最新文章

  1. python 代理上网_用Python编写脚本使IE实现代理上网的教程
  2. android 插件化 模块化开发(apkplug)
  3. 跨境电商未来应该怎么走?
  4. 前向渲染路径细节 Forward Rendering Path Details
  5. 读《构建之法》第11,12章有感
  6. 最佳实践:如何基于MNS和OSS实现无大小限制的消息传输
  7. MCの生存游戏(洛谷P1867题题解,Java语言描述)
  8. java基础之算法_java基础之几种常见的排序算法
  9. Atitti 图像处理 图像混合 图像叠加 blend 原理与实现
  10. c语言函数求圆面积,C语言编写函数,计算圆面积.
  11. 如何绘制四线3格拼音
  12. Paint the Roads UVALive - 2197
  13. 深度神经网络:WX+b-vs-XW+b
  14. FME校园培训南京站
  15. Linux九阴真经之大伏魔拳残卷3(LVS)
  16. 智能电销机器人工作流程《各版本机器人部署》
  17. 黑马程序员C++学习笔记
  18. 同一 等价和自然数的生成:皮亚诺公理3解读——皮亚诺读后之五
  19. 微信公众号支付回调函数“time_end”的坑
  20. 基恩士PLC KV8000+XH16EC总线控制,全ST程序实例 全程序无加密,公司级框架,功能齐全,提供项目源码框架FB源码

热门文章

  1. 如何防止android app被误删除,如何避免手机清理缓存时误删了重要文件【注意事项】...
  2. python3基础知识点_入门Python3基础教程-知识点摘要
  3. lucene查询语法,适用于ELk:kibana查询
  4. MapReduce1和Yarn的工作机制
  5. DreamWeaver文件保存时,提示发生共享违例问题的解决方法
  6. htmlspecialchars() improvements in PHP 5.4
  7. Java基础篇:Executor框架
  8. Android 源码编译相关
  9. 高德渲染网关Go语言重构实践
  10. 为什么说混合云是新基建的流行架构?文末彩蛋!