java19 先开服务器,再开客户端

先开服务器,再开客户端。

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * 创建服务器
 * 写出数据:输出流
 * 读取数据:输入流
 */
public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket server =new ServerSocket(9999);
        Socket client =server.accept();
        //写出数据
        //输入流
        DataInputStream dis = new DataInputStream(client.getInputStream());
        String msg =dis.readUTF();
        //输出流
        DataOutputStream dos = new DataOutputStream(client.getOutputStream());
        dos.writeUTF("服务器-->"+msg);
        dos.flush();
    }
}



import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
/**
 * 创建客户端: 发送数据+接收数据
 * 写出数据:输出流
 * 读取数据:输入流
 */
public class Client {
    public static void main(String[] args) throws UnknownHostException, IOException {
        Socket client = new Socket("localhost",9999);
        //把控制台输入封装成输入流
        BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
        DataOutputStream dos = new DataOutputStream(client.getOutputStream());
        DataInputStream dis = new DataInputStream(client.getInputStream());
        while(true){
            String info =console.readLine();//根据输入的换行符读取一行。
            //输出流,输出去在读进来。
            dos.writeUTF(info);
            dos.flush();
            //输入流
            String msg =dis.readUTF();
            System.out.println(msg);
        }
    }
}



聊天室:
1. 客户端可以发送数据 +接收数据 独立的
2. 每个客户端创建一个线程,彼此相互独立。

输入流 与输出流 在同一个线程内 应该 独立处理,彼此独立。

a客户端发送数据给服务器,服务器中转给b、c客户端。所以服务器要为每一个客户端建立一个线程。服务器为每一个客户端服务时,每个客户端都有输入流和输出流,客户端的输入流和输出流也是独立的所以也是线程。并且有私聊的功能。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 创建客户端: 发送数据+接收数据
 * 写出数据:输出流
 * 读取数据:输入流
 * 
    输入流 与输出流 在同一个线程内 应该 独立处理,彼此独立
    
    加入名称
 */
public class Client {
    public static void main(String[] args) throws UnknownHostException, IOException {
        System.out.println("请输入名称:");
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String name = br.readLine();
        if(name.equals("")){
            return;
        }    
        Socket client = new Socket("localhost",9999);
        new Thread(new Send(client,name)).start(); //一条路径
        new Thread(new Receive(client)).start(); //一条路径    
    }
}


/**
 * 接收线程 
 */
public class Receive implements Runnable {
    //输入流
    private  DataInputStream dis ;
    //线程标识
    private boolean isRunning = true;
    public Receive() {
    }
    public Receive(Socket client){
        try {
            dis = new DataInputStream(client.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
            isRunning =false;
            CloseUtil.closeAll(dis);
        }
    }
    /**
     * 接收数据
     */
    public String  receive(){
        String msg ="";
        try {
            msg=dis.readUTF();
        } catch (IOException e) {
            e.printStackTrace();
            isRunning =false;
            CloseUtil.closeAll(dis);
        }
        return msg;
    }
    @Override
    public void run() {
        //线程体
        while(isRunning){
            System.out.println(receive());
        }
    }
}




/**
 * 发送数据 线程
 */
public class Send implements Runnable{
    //控制台输入流
    private BufferedReader console;
    //管道输出流
    private DataOutputStream dos;
    //控制线程
    private boolean isRunning =true;
    //名称
    private String name;
    public Send() {
        console =new BufferedReader(new InputStreamReader(System.in));
    }
    public Send(Socket client,String name){
        this();
        try {
            dos =new DataOutputStream(client.getOutputStream());
            this.name =name;
            send(this.name);
        } catch (IOException e) {
            //e.printStackTrace();
            isRunning =false;
            CloseUtil.closeAll(dos,console);
            
        }
    }
    //1、从控制台接收数据
    private String getMsgFromConsole(){
        try {
            return console.readLine();
        } catch (IOException e) {
            //e.printStackTrace();
        }
        return "";
    }
    /**
     * 1、从控制台接收数据
     * 2、发送数据
     */
    public void send(String msg){
        try {
            if(null!=msg&& !msg.equals("")){
                dos.writeUTF(msg);
                dos.flush(); //强制刷新
            }
        } catch (IOException e) {
            //e.printStackTrace();
            isRunning =false;
            CloseUtil.closeAll(dos,console);
        }
    }
    
    
    @Override
    public void run() {
        //线程体
        while(isRunning){
            send(getMsgFromConsole());
        }
    }

}


/**
 * 创建服务器
 * 写出数据:输出流
 * 读取数据:输入流
 */
public class Server {
    private List<MyChannel> all = new ArrayList<MyChannel>();

    public static void main(String[] args) throws IOException {
        new Server().start();    
        
    }
    
    public void start() throws IOException{
        ServerSocket server =new ServerSocket(9999);
        while(true){
            Socket client =server.accept();        
            MyChannel channel = new MyChannel(client);
            all.add(channel);//统一管理
            new Thread(channel).start(); //一条道路
        }
    }
    
    
    /**
     * 一个客户端 一条道路
     * 1、输入流
     * 2、输出流
     * 3、接收数据
     * 4、发送数据
     */
    private class MyChannel implements Runnable{
        private DataInputStream dis ;
        private DataOutputStream dos ;
        private boolean isRunning =true;
        private String name; 
        public MyChannel(Socket client ) {
            try {
                dis = new DataInputStream(client.getInputStream());
                dos = new DataOutputStream(client.getOutputStream());                
                this.name =dis.readUTF();                
                this.send("欢迎您进入聊天室");
                sendOthers(this.name+"进入了聊天室",true);
            } catch (IOException e) {
                //e.printStackTrace();
                CloseUtil.closeAll(dis,dos);
                isRunning =false;
            }
        }
        /**
         * 读取数据
         * @return
         */
        private String receive(){
            String msg ="";
            try {
                msg=dis.readUTF();
            } catch (IOException e) {
                //e.printStackTrace();
                CloseUtil.closeAll(dis);
                isRunning =false;
                all.remove(this); //移除自身
            }
            return msg;
        }
        
        /**
         * 发送数据
         */
        private void send(String msg){
            if(null==msg ||msg.equals("")){
                return ;
            }
            try {
                dos.writeUTF(msg);
                dos.flush();
            } catch (IOException e) {
                //e.printStackTrace();
                CloseUtil.closeAll(dos);
                isRunning =false;
                all.remove(this); //移除自身
            }
        }
        
        /**
         * 发送给其他客户端
         */
        private void sendOthers(String msg,boolean sys){
            //是否为私聊 约定
            if(msg.startsWith("@")&& msg.indexOf(":")>-1 ){ //私聊
                //获取name
                String name =msg.substring(1,msg.indexOf(":"));
                String content = msg.substring(msg.indexOf(":")+1);
                for(MyChannel other:all){
                    if(other.name.equals(name)){
                        other.send(this.name+"对您悄悄地说:"+content);
                    }
                }
            }else{        
                //遍历容器
                for(MyChannel other:all){
                    if(other ==this){
                        continue;
                    }
                    if(sys){ //系统信息
                        other.send("系统信息:"+msg);
                    }else{
                        //发送其他客户端
                        other.send(this.name+"对所有人说:"+msg);
                    }
                }
            }
        }
        
        
        @Override
        public void run() {
            while(isRunning){
                sendOthers(receive(),false);
            }
        }
    }
    

}




/**
 * 关闭流的方法
 */
public class CloseUtil {
    public static void closeAll(Closeable... io){
        for(Closeable temp:io){
            try {
                if (null != temp) {
                    temp.close();
                }
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Oracle19c是一款数据库管理系统,而32位客户端是访问数据库的客户端程序。这个客户端是适合32位操作系统的,主要使用在客户端的开发和连接数据库,帮助业务实现快速查询和数据处理的任务。 Oracle19c 32位客户端可以提供各种数据库管理的服务,例如数据查询、数据备份、恢复、安全性检查等业务。此外,该客户端支持多种编程语言,包括Java、Python等,所以非常适合软件开发人员,可以快速开发自己的数据库管理工具。 同时,Oracle19c 32位客户端还具有与服务器数据库完全兼容的功能,使用起来非常容易,界面也很友好。它可以帮助企业和机构提升生产效率,优化员工的工作流程,从而提高企业的盈利能力。 然而,需要注意的是,随着计算机技术的不断发展,大多数操作系统都已经升级到64位版本,而32位客户端可能会面临系统兼容性问题,所以建议用户尽量使用64位客户端。 总的来说,Oracle19c 32位客户端在数据库管理和企业生产中发挥着极其重要的作用,但需要用户在使用前了解其优缺点,选择适合自己的版本。 ### 回答2: Oracle 19c 32位客户端是适用于32位操作系统的Oracle数据库的客户端程序。相比于64位版本,32位客户端需要更少的系统资源,因此在某些老旧的计算机系统上可能更适合使用。 使用Oracle 19c 32位客户端,可以连接到Oracle 19c数据库,并执行一系列操作,如创建数据库、备份数据库、查询数据等。此外,它还支持多种编程语言和API进行开发和管理,包括Java、Python、.NET、ODBC等等。 值得注意的是,由于32位系统的限制,Oracle 19c 32位客户端无法使用大于4GB的内存,因此在处理大型数据时可能会更慢或出现错误。如果您预计要处理大量数据,建议使用64位版本的Oracle客户端。 总的来说,Oracle 19c 32位客户端适合在32位系统上进行基本的Oracle数据库开发和管理,兼容各种编程语言和API,并且比64位版本更适合在老旧系统上使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值