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

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

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

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

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

效果图

服务端·
客户端

服务端代码

package com.yunduo.net;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class ServerDemo {
        //服务器
        public static void Server(){
            //创建一个服务器
            System.out.println("等待客户端连接。。。");
            PrintWriter out = null;
            Scanner get_key = null;
            Scanner get_client = null;
            ServerSocket server = null;
            Socket client=null;
            try {
                server = new ServerSocket(6666);
                //创建一个接收连接客户端的对象
                client = server.accept();
                System.out.println(client.getInetAddress()+" 已成功连接到此台服务器上。");
                //字符输出流
                out = new PrintWriter(client.getOutputStream());    //向客户端发送数据
                out.println("已成功连接到远程服务器!"+"\t"+"请您先发言。");
                out.flush();//将缓冲流中的数据全部输出
                get_key = new Scanner(System.in);  //获取服务端键盘输入数据
                get_client = new Scanner(client.getInputStream());  //接收客户端发送的数据
                //阻塞等待客户端发送消息过来
                while(get_client.hasNextLine()){
                    System.out.println("客户端:"+get_client.nextLine());//输出客户端发送的数据
                    System.out.print("我(服务端):");//获取服务端键盘输入数据
                    out.println(get_key.nextLine()); //向客户端发送数据
                    out.flush();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally {
                out.close();
                get_client.close();
                get_key.close();
                try {
                    server.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        public static void main(String[] args) {
            Server();
        }
    }

客户端代码

package com.yunduo.net;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class ClientDemo {

        public static void Client(){
            System.out.println("正在向服务器请求连接。。。");
            Socket client = null;
            Scanner get_key = null;
            Scanner get_server = null;
            PrintWriter out = null;
            try {
                client = new Socket("127.0.0.1", 6666);
                get_server = new Scanner(client.getInputStream());
                System.out.println(get_server.nextLine());
                out = new PrintWriter(client.getOutputStream());
                System.out.print("我(客户端):");
                //先读取键盘录入方可向服务端发送消息
                get_key = new Scanner(System.in);
                while(get_key.hasNextLine()){
                    //写到服务端的的控制台
                    out.println(get_key.nextLine());
                    out.flush();
                    //阻塞等待接收服务端的消息
                    System.out.println("服务端:"+get_server.nextLine());
                    System.out.print("我(客户端):");
                }
            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally {
                get_key.close();
                get_server.close();
                out.close();
                try {
                    client.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        }
        public static void main(String[] args) {
            Client();
        }
    }

多线程实现多个Client进行连接

  • 构建Client,从控制台持续接收输入字符串,发送给Server端,接收到Server端返回的OK信息后,开始接收下一个字符串。
  • 构建Server, 能够同多个Client进行连接, 将接收到的Client信息,以客户端名称:信息的格式显示在控制台中,并且给客户端返回“OK”

客户端代码

package test;

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

public class Client {
    public static void main(String[] args) {
        Scanner getKey = new Scanner(System.in);
        Scanner getServer = null;
        PrintWriter out = null;
        try{
            Socket client = new Socket("localhost",6666);
            out = new PrintWriter(client.getOutputStream());
            while(true){
                System.out.println("请输入:");
                String input = getKey.next();
                out.println(input);
                out.flush();
                getServer = new Scanner(client.getInputStream());
                System.out.println(getServer.next());
            }

        }catch (Exception e){
            System.out.println(e.getMessage());
        }
    }
}

服务端代码

package test;

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) {
        try {
            ServerSocket server = new ServerSocket(6666);
            System.out.println("服务器启动成功,等待客户端连接");
            while(true){
                Socket client = server.accept();
                ServerThread serverThread = new ServerThread(client);
                serverThread.start();
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}
class ServerThread extends Thread{
    private Socket client;
    public ServerThread(Socket client){
        this.client = client;
    }

    @Override
    public void run() {
        super.run();
        Scanner getClient = null; // 接收客户端输入
        PrintWriter out = null;
        try{
            while(true){
                getClient = new Scanner(client.getInputStream());
                System.out.println(getClient.next());
                out = new PrintWriter(client.getOutputStream());
                out.println("OK!");
                out.flush();
            }
        }catch(Exception e){
            System.out.println(e.getMessage());
        }
    }
}

多线程实现客户端和服务端全双工通信


在这里插入图片描述

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页