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实现全双工通信的更多相关文章
- Socket编程 -- 全双工通信
//这是客户端package com.test; import java.io.BufferedReader; import java.io.IOException; import java.io.I ...
- Java Socket 实现HTTP服务器核心
原文链接:http://www.ihuxu.com/p/235.html 首先了解下HTTP协议: wikiPedia的说明很好,在此不重复了.链接:http://zh.wikipedia.org ...
- JAVA通信系列一:Java Socket技术总结
本文是学习java Socket整理的资料,供参考. 1 Socket通信原理 1.1 ISO七层模型 1.2 TCP/IP五层模型 应用层相当于OSI中的会话层,表示层, ...
- Java Socket编程----通信是这样炼成的
Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket.像大家熟悉的QQ.MSN都使用了Socket相关的技术. ...
- java socket报文通信(一)socket的建立
java socket报文通信(一) socket的建立 今天来和大家分享一下java中如何使用socket进行通信.先来啰嗦两句,看看Tcp/ip和udp: TCP是Transfer Contro ...
- Java 网络编程(五) 使用TCP/IP的套接字(Socket)进行通信
链接地址:http://www.cnblogs.com/mengdd/archive/2013/03/10/2952616.html 使用TCP/IP的套接字(Socket)进行通信 套接字Socke ...
- Java socket通信
首先抛开语言层面,简单介绍一下socket通信过程: 1.服务器端开启监听端口,阻塞进程 等待客户端连接 2.客户端连接,这时就产生了一个socket socket就相当于一个传递消息的通道,一般都 ...
- Java Socket通信实现私聊、群聊
前言 闲言少叙,上代码! 代码编写 server服务端 /** * 服务端 */ public class Server { private static ServerSocket server = ...
- java socket通信-传输文件图片--传输图片
ClientTcpSend.java client发送类 package com.yjf.test; import java.io.DataOutputStream; import java.io ...
随机推荐
- cocos2dx 3.x中的渲染机制
1.由2.x的渲染节点,变成添加渲染命令,可以避免重复渲染相同的节点,提高了渲染效率 2.单机游戏通常要求apk包在30M以内,没压缩1M会有1%的转换率(下载转换率),即收入会提高 3.2.x中首先 ...
- python中fork()函数生成子进程分析
python的os module中有fork()函数用于生成子进程,生成的子进程是父进程的镜像,但是它们有各自的地址空间,子进程复制一份父进程内存给自己,两个进程之 间的执行是相互独立的,其执行顺序可 ...
- “我爱淘”冲刺阶段Scrum站立会议9
完成任务: 完成了webservice的配置与测试. 计划任务: 可以通过webservice将数据库中的内容解析出来,通过查询可以得到想要的内容. 遇到问题: 服务器已经配好,,也已经测试成功,不过 ...
- j2SE基回顾(一)
1. 九种基本数据类型的大小,以及他们的封装类. 2. Switch能否用string做参数? 3. equals与==的区别. 4. Object有哪些公用方法? Object是所有类的父类,任何类 ...
- 在安卓3.0以下版本使用Fragment的注意事项
1. 按照网上的Fragment官网资料翻译来做一直有错: 10-03 02:43:13.971: E/AndroidRuntime(1921): java.lang.RuntimeException ...
- Oracle 相关概念详解
一.前言 笔者对于Oracle数据库的理解,很长时间停留在“镜花水月”的状态,你说不懂吧,又会用,一较真起来吧,对一些基本概念又说不出一个道道来~如果想要在编码的路上走得更远,这个必定也是绕不过的坎, ...
- Codeforces Round #277.5 (Div. 2)
题目链接:http://codeforces.com/contest/489 A:SwapSort In this problem your goal is to sort an array cons ...
- jquery的ajax向后台提交时,乱码的解决方案
1. 可以给每个参数加上encodeURIComponent(),然后在后台获得参数后用URLDecoder.decode(string, 'utf-8')解码. 2. 后台不用解码. $.ajax( ...
- IBatis 常用XML
<select id="GetInfo"> <![CDATA[ select * from vi_WaterStation ]]> <dynami ...
- themeforest 模板
如果给个人或一个客户使用就购买Regular License 多个项目或多人就徐需要购买Extended License,然后看你买html模版还是wordpress模版了.html需要你自己会编程将 ...