24 Java 网络编程2

package cn.itcast.tcp;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
//下载图片的客户端
public class ImageClient {
    public static void main(String[] args) throws Exception{
        //建立tcp的服务
        Socket socket = new Socket(InetAddress.getLocalHost(),9090);
        //获取socket的输入流对象
        InputStream inputStream = socket.getInputStream();
        //获取文件的输出流对象
        FileOutputStream fileOutputStream = new FileOutputStream("F:\\3.jpg");
        //边读边写
        byte[] buf = new byte[1024];
        int length = 0 ; 
        
        while((length = inputStream.read(buf))!=-1){
            fileOutputStream.write(buf,0,length);
        }
        //关闭资源
        fileOutputStream.close();
        socket.close();
    }
}
package cn.itcast.tcp;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashSet;
/*
1. 编写一个服务端可以给多个客户端发送图片。 (多线程)
*/
public class ImageServer extends Thread {
    Socket socket ;
    //使用该集合是用于存储ip地址的。
    static HashSet<String> ips = new HashSet<String>();
    public  ImageServer(Socket socket) {
    this.socket = socket;
    }
    @Override
    public void run() {
        try {
            //获取到socket输出流对象
            OutputStream outputStream = socket.getOutputStream();
            //获取图片的输入流对象
            FileInputStream fileInputStream = new FileInputStream("F:\\美女\\3.jpg");
            //读取图片数据,把数据写出
            byte[] buf = new byte[1024];
            int length = 0 ; 
            while((length = fileInputStream.read(buf))!=-1){
                outputStream.write(buf,0,length);
            }
            String ip = socket.getInetAddress().getHostAddress();   // socket.getInetAddress() 获取对方的IP地址
            if(ips.add(ip)){
                System.out.println("恭喜"+ip+"同学成功下载,当前下载的人数是:"+ ips.size());
            }
            //关闭资源
            fileInputStream.close();
            socket.close();
            }catch (IOException e) {
        }
    }
    public static void main(String[] args) throws IOException {
        //建立tcp的服务 ,并且要监听一个端口
        ServerSocket serverSocket  = new ServerSocket(9090);
        while(true){
            //接受用户的链接。
            Socket socket = serverSocket.accept();
            new ImageServer(socket).start();
        }
    }
}
package cn.itcast.tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
/*
2.  实现登陆与注册 功能。  
客户端与服务端连接的时候,就要提示客户端请选择功能。
客户端注册的时候,用户名与密码都是发送给服务端 的,服务端需要把数据保存到服务端的文件上。
登陆: 登陆的时候客户端输入用户名与密码发送给服务端,服务端需要校验,返回结果给客户端。
*/
public class LoginClinet {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket(InetAddress.getLocalHost(),9090);
        //获取socket的输出流对象
        OutputStreamWriter  socketOut = new OutputStreamWriter(socket.getOutputStream());
        //获取到socket的输入流对象
        BufferedReader socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        //获取到键盘的输入流对象
        BufferedReader keyReader = new BufferedReader(new InputStreamReader(System.in));
        while(true){
            System.out.println("请选择功能: A(登陆)  B(注册)");
            String option = keyReader.readLine();
            
            if("a".equalsIgnoreCase(option)){
                getInfo(socketOut, keyReader, option);
                //读取服务器反馈的信息
                String line = socketReader.readLine();
                System.out.println(line);
            }else if("b".equalsIgnoreCase(option)){
                getInfo(socketOut, keyReader, option);
                //读取服务器反馈的信息
                String line = socketReader.readLine();
                System.out.println(line);
            }
        }
    }
    public static void getInfo(OutputStreamWriter  socketOut,BufferedReader keyReader, String option) throws IOException {
        System.out.println("请输入用户名:");
        String userName = keyReader.readLine();
        System.out.println("请输入密码:");
        String password = keyReader.readLine();
        String info = option +" "+userName+" "+password+"\r\n";
        socketOut.write(info);
        socketOut.flush();
    }
}
package cn.itcast.tcp;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Properties;

public class LoginServer extends Thread {
    Socket socket;
    static File file = new File("F:\\users.properties");
    
    public LoginServer(Socket socket) {
        this.socket = socket;
    }
    static {
        try {
            if (!file.exists()) {
                file.createNewFile();
            }
        } catch (IOException e) {
            e.printStackTrace();
           }
    }
    @Override
    public void run() {
        while(true){
            try {
            // 获取socket的输入流对象
            BufferedReader bufferedReader = new BufferedReader(
            new InputStreamReader(socket.getInputStream()));
          
            // 获取socket的输出流对象
            OutputStreamWriter socketOut = new OutputStreamWriter(socket.getOutputStream());
            // 读取客户端输入的信息
            String info = bufferedReader.readLine();
            String[] datas = info.split(" ");
            // 获取到用户 的选择功能
            String option = datas[0];
            // 注册
            String userName = datas[1];
            String password = datas[2];
            if ("a".equalsIgnoreCase(option)) {
                // 登陆
                Properties properties = new Properties();
                // 加载配置文件
                properties.load(new FileReader(file));
                if (properties.containsKey(userName)) {
                String tempPass = properties.getProperty(userName);
                if (password.equals(tempPass)) {
                socketOut.write("欢迎" + userName + "登陆成功\r\n");
            } else {
            socketOut.write("密码错误\r\n");
            }
            } else {
            socketOut.write("用户名不存在,请重新输入...\r\n");
            }
            socketOut.flush();
            } else if ("b".equalsIgnoreCase(option)) {
            // 创建一个配置文件类
            Properties properties = new Properties();
            //加载原来的配置文件
            properties.load(new FileReader(file));
            if (!properties.containsKey(userName)) {
            // 不存在该用户名
            properties.setProperty(userName, password);
            // 生成一个配置文件
            properties.store(new FileWriter(file), "users");
            socketOut.write("注册成功..\r\n");
            } else {
            // 存在用户名
            socketOut.write("用户名已经被注册,请重新输入\r\n");
            }
            socketOut.flush();
            }
            } catch (Exception e) {
            e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(9090);
        while (true) {
            Socket socket = serverSocket.accept();
            new LoginServer(socket).start();
        }
    }
}
时间: 2024-10-24 17:41:05

24 Java 网络编程2的相关文章

用java网络编程中的TCP方式上传文本文件及出现的小问题

自己今天刚学java网络编程中的TCP传输,要用TCP传输文件时,自己也是遇到了一些问题,抽空把它整理了一下,供自己以后参考使用. 首先在这个程序中,我用一个客户端,一个服务端,从客户端上传一个文本文件给服务端,服务端接收数据并显示“上传成功”给客户端. 客户端: 1 import java.io.BufferedReader; 2 import java.io.FileReader; 3 import java.io.IOException; 4 import java.io.InputStr

java网络编程serversocket

转载:http://www.blogjava.net/landon/archive/2013/07/24/401911.html Java网络编程精解笔记3:ServerSocket详解ServerSocket用法详解 1.C/S模式中,Server需要创建特定端口的ServerSocket.->其负责接收client连接请求. 2.线程池->包括一个工作队列和若干工作线程->工作线程不断的从工作队列中取出任务并执行.-->java.util.concurrent->线程池

Rhythmk 一步一步学 JAVA (22) JAVA 网络编程

1.获取主机信息 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @Test     public void GetDomainInfo() throws UnknownHostException {         String domain = "www.baidu.com";         InetAddress netAddress = InetAddress.getByName(domain);         // 获取

第13篇-JAVA 网络编程

第13篇-JAVA 网络编程 每篇一句 比我强大的人都在努力我还有什么理由不拼命 初学心得 不去追逐你所渴求你将永远不会拥有 (笔者JEEP/711)[JAVA笔记 | 时间:2017-04-22| JAVA 网络编程 ] 1.网络编程基本概念 1.什么是计算机网络 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备通过通信线路连接起来在网络操作系统网络管理软件及网络通讯协议的管理和协调下实现资源共享和信息传递的计算机系统 把分布在不同地理区域的计算机与专门的外部设备用通讯线路互

Java网络编程(一)

Java网络编程: 1.1: 网络编程:对于我这个“研究不深”的网络菜鸟来说,我觉得网络编程就是实现计算机与计算机之间通信的编程.写些能够实现计算机与计算机之间的通信就行了(目前来说). 1.2:一台计算机跟另外计算机通讯. 计算机与计算机通讯的三大要素: 1:ip地址---电脑 1.1:作用:唯一标识一台计算机. 回环地址:127.0.0.1==主机:localhost 主机地址作用:测试网卡是否正常. 2:找到相应的应用程序----端口号 端口号-----具有网络功能的应用程序的标识号,没有

Java网络编程基础

一.Java网络编程 网络编程在如今这样的网络时代是十分重要的,Java语言提供了丰富的类库来支持网络编程.这里将重点介绍Java.net中的类,充分了解认识Java网络编程的原理并深入学习各模块.在学习Java网络编程之前首先需要具备一定的网络知识:网络的层次结构,常见的网络协议(TCP/IP),IP地址端口号等等.需要学习了解这些内容,可以参考前面的文章. 二.主机地址和IP地址 在进行网络访问时,每个主机都有IP地址,也有主机名(域名),为了便于处理与之相关的问题,Java.net包中提供

Java 网络编程学习总结

新手一枚,Java学习中,把自己学习网络编程的知识总结一下,梳理下知识,方便日后查阅,高手莫进. 本文的主要内容: [1]    网络编程认识                [2]  TCP/IP编程小例子 [3]   UDP编程小例子 [4]  简单线程池实例 一.网络编程的主要认识 Java是一种基于网络设计的语言,用于开发网络软件特别便利. 它对于网络的操作都是基于IP层以上的,也就是对TCP/UDP进行操作,所以java的网络编程又称为Socket编程. 一种是TCP/IP 网络编程,

java进阶--java网络编程

java网络编程 一.概述 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net 包中 J2SE 的 API 包含有类和接口,它们提供低层次的通信细节.你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节. java.net 包中提供了两种常见的网络协议的支持: TCP:TCP 是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信.通常用于互联网协议,被称 TCP / IP. UDP:UDP 是用户数据报协议的缩写,一个无连接的协议.提供

Java网络编程和NIO详解6:Linux epoll实现原理详解

Java网络编程和NIO详解6:Linux epoll实现原理详解 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Java网络编程和NIO https://blog.csdn.net/column/details/21963.html 部分代码会放在我的的Github:https://github.com/h2pl/ Linux epoll实现原理详解 在linux 没有实现epoll事件驱动机制之前,我们一般选择用select或者pol