java socket 全双工_java socket实现全双工通信
单工、半双工和全双工的定义
如果在通信过程的任意时刻,信息只能由一方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实现全双工通信相关推荐
- java socket 端口_Java Socket通信如何摆平自身端口问题
Java Socket通信在使用的时候有不少的问题,在端口编程上来说是一个十分重要的.下面我们就看看Java Socket通信如何才能更好的使用相关的代码.希望大家有所帮助. 事实上网络编程简单的理解 ...
- java socket通信安全_Java Socket通信
原理: 1.基于TCP协议,建立稳定连接的点对点的通信 a.实时,快速,安全性高,占用系统资源多,效率低 2.请求-响应模式 a.客户端 在网络通讯中,第一次主动发起通讯的程序被称作客户端(Clien ...
- java socket字符串_Java Socket Bug:从Socket的InputStream读取字符串
我正在使用Socket与ServerSocket进行通信.字符串正从服务器发送到我的套接字.每条不同的行都是一条消息,在解析时包含信息.要阅读这些文本行,请使用扫描仪. 问题在于数据正在"爆 ...
- java socket 工具_java Socket简易聊天工具
本文实例为大家分享了一款Socket简易聊天工具,希望大家喜欢. 代码运行如图,看起来还不错 服务端 package qiu; import java.awt.BorderLayout; import ...
- java socket 工具_java+socket 简易聊天工具
1.服务器端程序 package com.test3; import java.io.*; import java.net.*; import java.awt.*; import java.awt. ...
- java socket数据传输_Java Socket编程(一) Socket传输模式
Java Socket编程(一) Socket传输模式 文章来源:ASPCN 作者:孙雯 Socket传输模式 Sockets有两种主要的操作方式:面向连接的和无连接的.面向连接的sockets操作就 ...
- java socket通讯_Java socket通讯实现过程及问题解决
这篇文章主要介绍了Java socket通讯实现过程及问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 本来是打算验证java socket是 ...
- java socket 超时_Java Socket超时浅析
套接字或插座(socket)是一种软件形式的抽象,用于表达两台机器间一个连接的"终端".针对一个特定的连接,每台机器上都有一个"套接字",可以想象它们之间有一条 ...
- java socket 卡住_Java socket通讯实现过程及问题解决
这篇文章主要介绍了java socket通讯实现过程及问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 本来是打算验证java socket是 ...
最新文章
- 用于面包板的双列直插需要多宽?
- [Python]--爬虫 Resources Collection
- eclipse 连接mysql_eclipse连接MySQL
- 原生js实现一个tab栏的标签操作
- 尚学堂java 答案解析 第六章
- OO’s Sequence
- 【chrome插件】web版微信接入图灵机器人API实现自动回复
- emmet工具使用和技巧
- 学习笔记之在eclipse中,使用ADT开发
- 02-学习笔记(webstorm设置代码自动缩进量)【新手上路,多多关照】
- python哪个方向工资高_深圳python工资高还是java
- java中如何导出excel_java中如何导出excel表格
- SpringBoot使用SSE推送消息
- 破解版IDM导致电脑反复闪屏的解决方案
- 《林徽因——不慌不忙的坚强》笔记和感悟
- NAS信令学习笔记 ——TAU(1)
- 3D标签云/滚动词条
- solr的多条件组合查询
- 判断一个整型数据有几位
- NeurIPS 2020 | 数据类别不平衡/长尾分布?不妨利用半监督或自监督学习
热门文章
- 受半导体短缺及疫情影响,丰田已下调9月10月及当前财年产量预期
- 饿了么上架iPhone 12:最快花呗10分钟拿到手
- 数百辆共享单车被丢垃圾场!官方回应...
- 化繁为简 回归初心 细品雅致设计的vivo X50系列
- 丰巢强制收费引吐槽,杭州硬核小区用行动抵制:停用!
- 不能再任性 APP收集个人信息基本规范公开征求意见
- 小米MIX 4 8月不会发布:或配屏下摄像头/100W快充
- 百度再回应“泼水门”:强烈谴责 肇事者已被公安机关带走
- 受上海Model S自燃影响?特斯拉市值周一蒸发18亿美元
- OPPO副总裁曝光Reno十倍变焦规格 能用上的安卓机皇不超过两个