java socket 全双工_java socket实现全双工通信

该博客介绍了如何使用Java的Socket实现全双工通信。通过一个简单的Swing界面,展示了客户端(MyClient)和服务器端(MyServer)的代码实现,实现了在任意时刻双向传输数据的全双工通信。在服务器端,通过ServerSocket监听2222端口,接收客户端的消息并回应,同时客户端连接服务器,发送和接收消息。
摘要由CSDN通过智能技术生成

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

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

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

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

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

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

// 接收从client发送过来的消息

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

}

}

// 把信息给client

@Override

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

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

sendMessage();

}

}

/**

* @Description: 发送消息给client

* @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: client

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

}

}

// 把信息给server端

@Override

public void actionPerformed(ActionEvent e) {

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

sendMessage();

}

}

/**

* @Description: 发送消息给server端

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

}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值