java 半双工_(3)java网络socket通信---半双工、全双工

本文介绍了Java中实现网络通信的半双工和全双工概念。半双工通信允许信息在两个方向上传输,但不能同时进行。示例展示了服务器端和客户端的代码实现,包括数据的发送和接收。全双工则允许数据同时双向传输,提高了通信效率。
摘要由CSDN通过智能技术生成

(3)java网络---半双工、全双工

1.半双工

1.1半双工原理:半双工即Half

duplex Communication,是指在通信过程的任意时刻,信息既可由A传到B,又能由B传A,但只能有一个方向上的传输存在。采用半双工方式时,通信系统每一端的发送器和接收器,通过收/发开关转接到通信线上,进行方向的切换,因此,会产生时间延迟。收/发开关实际上是由软件控制的电子开关。

f5ca38861408aaa54455f3b1437e9a69.png

1.2工程结构

bfd11a8a9121d69e010d7df7581c9ef8.png

1.3服务器端

/**

* 服务器端,在9999端口监听,可以通过控制台,回送给客户端信息

*/

packagetest;

importjava.io.BufferedReader;

importjava.io.InputStreamReader;

importjava.io.PrintWriter;

importjava.net.ServerSocket;

importjava.net.Socket;

publicclassmyserver2 {

public myserver2 () {

try {

//监听端口,9999

ServerSocket ss=new ServerSocket(9999);

//阻塞,等待连接

Socket s=ss.accept();

//先接受到客户端发来的信息

InputStreamReader isr=new InputStreamReader(s.getInputStream());

BufferedReader br=new BufferedReader(isr);

PrintWriter pw=new PrintWriter(s.getOutputStream(),true);

InputStreamReader isr2=new InputStreamReader(System.in);

BufferedReader br2=new BufferedReader(isr2);

while(true){

String infoFromClient=br.readLine();

System.out.println("客户端:"+infoFromClient);

if(infoFromClient.equals("bye")){

s.close();

break;

}

//接受从控制台输入的信息

System.out.println("请输入您希望对客户端说的话:");

String re=br2.readLine();

//把从控制台接受的信息,回送给客户端

pw.println(re);

}

} catch (Exception e) {

// TODO: handle exception

}

}

public static void main(String[] args) {

// TODO Auto-generated method stub

new myserver2();

}

}

1.4客户端

packagetest;

importjava.io.BufferedReader;

importjava.io.InputStreamReader;

importjava.io.PrintWriter;

importjava.net.Socket;

publicclassmyclient2 {

public myclient2 () {

try {

//连接服务器端

Socket s=new Socket("127.0.0.1",9999);

PrintWriter pw=new PrintWriter(s.getOutputStream(),true);

InputStreamReader isr=new InputStreamReader(System.in);

BufferedReader br=new BufferedReader(isr);

InputStreamReader isr2=new InputStreamReader(s.getInputStream());

BufferedReader br2=new BufferedReader(isr2);

while(true){

System.out.println("请输入您要对服务器要说的话:");

//客户端先从控制台接受

String info=br.readLine();

pw.println(info);

if(info.equals("bye")){

System.out.println("通话结束!");

s.close();

break;

}

//接受从服务器发来的信息

String res=br2.readLine();

System.out.println("服务器端:"+res);

}

} catch (Exception e) {

// TODO: handle exception

}

}

public static void main(String[] args) {

// TODO Auto-generated method stub

new myclient2();

}

}

2.全双工

全双工:全双工(Full Duplex)是通讯传输的一个术语。通信允许数据在两个方向上同时传输,它在能力上相当于两个单工通信方式的结合。全双工指可以同时(瞬时)进行信号的双向传输(A→B且B→A)。指A→B的同时B→A,是瞬时同步的。

2.1工程目录结构:

a31c89f8fdd95b2634fb1f40167afd26.png

/**

* 服务器端

*/

package com.test;

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

import javax.swing.WindowConstants;

public class myserver3 extends JFrame implements ActionListener, KeyListener {

PrintWriter pw=null;

JTextArea jt_aArea=new JTextArea();

JTextField jTextField=new JTextField(10);

JButton btn_send=new JButton("发送");

JPanel jp1=new JPanel();

JScrollPane jsp=new JScrollPane(jt_aArea);

public myserver3 () {

jp1.add(jTextField);

jp1.add(btn_send);

btn_send.addActionListener(this);

jTextField.addKeyListener(this);

this.add(jsp,"Center");

this.add(jp1,"South");

this.setTitle("简易服务器端");

this.setSize(300, 300);

this.setVisible(true);

this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

try {

//服务器监听

ServerSocket ss=new ServerSocket(9999);

//等待客户端连接

Socket s=ss.accept();

InputStreamReader isr=new InputStreamReader(s.getInputStream());

BufferedReader br=new BufferedReader(isr);

pw=new PrintWriter(s.getOutputStream(),true);

//读取从客户端发送来的信息

while(true){

String info =br.readLine();

jt_aArea.append("客户端:"+info+"\r\n");

}

} catch (Exception e) {

// TODO: handle exception

}

}

@Override

public void keyTyped(KeyEvent e) {

// TODO Auto-generated method stub

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

//System.out.println(e.getKeyCode());

if(e.getKeyCode()==KeyEvent.VK_ENTER){

String info=jTextField.getText();

jt_aArea.append("服务端:"+info+"\r\n");

pw.println(info);

//清空内存

jTextField.setText("");

}

}

}

@Override

public void keyReleased(KeyEvent e) {

// TODO Auto-generated method stub

}

@Override

public void keyPressed(KeyEvent e) {

// TODO Auto-generated method stub

}

public void actionPerformed(ActionEvent arg) {

//如果用户按下发送信息按钮

if(arg.getSource()==btn_send){

String info=jTextField.getText();

jt_aArea.append("服务器:"+info+"\r\n");

pw.println(info);

//清空内存

jTextField.setText("");

}

}

public static void main(String[] args) {

// TODO Auto-generated method stub

new myserver3();

}

}

///

客户端:

package com.test;

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

import javax.swing.WindowConstants;

public class myclient3 extends JFrame implements ActionListener, KeyListener{

JTextArea jt_aArea=new JTextArea();

JTextField jTextField=new JTextField(10);

JButton btn_send=new JButton("发送");

PrintWriter pw=null;

JPanel jp1=new JPanel();

JScrollPane jsp=new JScrollPane(jt_aArea);

public myclient3 () {

jp1.add(jTextField);

jp1.add(btn_send);

btn_send.addActionListener(this);

jTextField.addKeyListener(this);

this.add(jsp,"Center");

this.add(jp1,"South");

this.setTitle("简易客户端");

this.setSize(300, 300);

this.setVisible(true);

this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

try {

Socket s=new Socket("127.0.0.1",9999);

InputStreamReader isr=new InputStreamReader(s.getInputStream());

BufferedReader br=new BufferedReader(isr);

pw=new PrintWriter(s.getOutputStream(),true);

while(true){

//不停的读取

String info=br.readLine();

jt_aArea.append("服务器端:"+info+"\r\n");//换行

//jt_aArea.setText(info);

}

} catch (Exception e) {

// TODO: handle exception

}

}

public void keyTyped(KeyEvent e) {

// TODO Auto-generated method stub

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

//System.out.println(e.getKeyCode());

if(e.getKeyCode()==KeyEvent.VK_ENTER){

String info=jTextField.getText();

jt_aArea.append("客户端:"+info+"\r\n");

pw.println(info);

//清空内存

jTextField.setText("");

}

}

}

@Override

public void keyReleased(KeyEvent e) {

// TODO Auto-generated method stub

}

@Override

public void keyPressed(KeyEvent e) {

// TODO Auto-generated method stub

}

public void actionPerformed(ActionEvent arg) {

//如果用户按下发送信息按钮

if(arg.getSource()==btn_send){

String info=jTextField.getText();

jt_aArea.append("客户端:"+info+"\r\n");

pw.println(info);

//清空内存

jTextField.setText("");

}

}

public static void main(String[] args) {

// TODO Auto-generated method stub

new myclient3();

}

}

先启动服务端,在启动客户端

运行效果:

1a66bc602f279c1ddfba1772ada393a4.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值