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

本文介绍了Java中利用Socket实现的网络通信,包括半双工和全双工两种模式。半双工通信不允许在同一时刻进行双向传输,而全双工则支持同时双向传输数据。示例代码分别展示了基于控制台和GUI界面的服务器端与客户端实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


        1.2工程结构
        
        1.3服务器端
    /**
 * 服务器端,在9999端口监听,可以通过控制台,回送给客户端信息
 */
package test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class myserver2 {
    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客户端
    package test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class myclient2 {
    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工程目录结构:
    

/**
 * 服务器端
 */
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();
}

}

先启动服务端,在启动客户端
运行效果:
        







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值