Java中Socket实现客户端和服务端通信(多线程实现全双工通信)

效果图

Java中Socket实现客户端和服务端通信(多线程实现全双工通信)_第1张图片
Java中Socket实现客户端和服务端通信(多线程实现全双工通信)_第2张图片

目录结构

Java中Socket实现客户端和服务端通信(多线程实现全双工通信)_第3张图片

服务端Server
package server;

import thread.SocketReader;
import thread.SocketWrite;

import java.io.InputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class Server {
    public static void main(String[] args) throws Exception{
        PrintWriter out=null;
        Scanner get = null;
        ServerSocket server=new ServerSocket(8888);
        System.out.println("服务器正在运行,等待客户端连接!");
        while (true){

            Socket client=new Socket();
            client=server.accept();
            System.out.println(client.getInetAddress()+" 已成功连接到此台服务器上。");

            out = new PrintWriter(client.getOutputStream());
            get = new Scanner(client.getInputStream());

            new SocketWrite(out).start();
            new SocketReader(get).start();

        }
    }
}
客户端Client
package client;

import thread.SocketReader;
import thread.SocketWrite;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws Exception{
        PrintWriter out=null;
        Scanner get = null;
        Socket client=new Socket("127.0.0.1",8888);
        get = new Scanner(client.getInputStream());
        out = new PrintWriter(client.getOutputStream());
        new SocketReader(get).start();
            new SocketWrite(out).start();

    }
}

写入消息SocketWriter
package thread;
import java.io.PrintWriter;
import java.util.Scanner;

public class SocketWrite extends Thread{

    private Scanner scanner;
    private PrintWriter out;
    private Scanner get_key = null;
    public SocketWrite(PrintWriter out){
        this.out=out;
    }
    public void  run(){
        out.println("已成功连接到远程服务器!");
        out.flush();//将缓冲流中的数据全部输出
        while(true){
            try{
                get_key = new Scanner(System.in);
                String msg=get_key .nextLine();
                out.println(msg);
                out.flush();
            //    System.out.println("请输入消息:");
            }catch(Exception e){
                System.out.println("连接已断开!");
                return;
            }
        }
    }
}

读取消息SocketReader
package thread;
import java.io.ByteArrayOutputStream;
import java.util.Scanner;

public class SocketReader extends Thread{
    private Scanner get;
    public SocketReader(Scanner get){
        this.get=get;
    }

    public void  run(){
        while(true){

            try{
                while(true){
                    System.out.println("收到对端消息:"+get.nextLine());
                  //  System.out.print("输入消息:");

                }
            }catch(Exception e){
                System.out.println("连接已中断");
                return;
            }
        }
    }
}

Socket实现客户端和服务端持续通信;

1.单工数据传输只支持数据在一个方向上传输;在同一时间只有一方能接受或发送信息,不能实现双向通信,举例:电视,广播。

2.半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;在同一时间只可以有一方接受或发送信息,可以实现双向通信。举例:对讲机。

3.全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力;在同一时间可以同时接受和发送信息,实现双向通信,举例:电话通信。

你可能感兴趣的:(Java)