java学习第二十四天之TCP、UDP

本文介绍了一个基于Java实现的简单聊天室程序,包括UDP和TCP两种通信方式。此外,还详细展示了如何利用Java进行文件上传,涵盖了图片和文本文件的上传流程。

聊天室

package cn.network.demo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class ChatTest {
    /**
    * @param args
    * 通过UDP协议
    * 完成一个聊天程序
    * 一个负责发送数据的任务,一个负责接收数据的任务。两个任务需要同时执行
    * 可以使用多线程技术
     * @throws IOException 
    */
    public static void main(String[] args) throws IOException {
        /**
         * 通过UDP协议,完成一个聊天程序。一个负责发动数据的服务。一个负责接收数据的任务。两个任务需要同时进行。可以使用多线程技术
         * 创建socket服务
         * 发送端
         */
        DatagramSocket send=new DatagramSocket(8888);
        DatagramSocket rec=new DatagramSocket(10002);

        new Thread(new Send(send)).start();
        new Thread(new Rece(rec)).start();

    }
}

//负责发送的任务
class Send implements Runnable{
//  任务对象一建立 ,需要socket对象
    private DatagramSocket  ds;
    public Send(DatagramSocket ds) {
        super();
        this.ds = ds;
    }

    @Override
    public void run() {
//      具体的发送数据的任务内容
//      1.要发送的数据来自哪里?键盘录入
        BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));

//      读取数据
        String line=null;
        try {
            while((line=bufferedReader.readLine())!=null){

//              将数据变成字节数组,封装到数据不保
//              将数据封装到数据包中
                byte[] buf=line.getBytes();
                DatagramPacket datagramPacket=new DatagramPacket(buf, buf.length,
                        InetAddress.getByName("192.168.1.155"),10002);
                ds.send(datagramPacket);

                if("over".equals(line)){
                    System.exit(0);
                    break;

                }
            }
            ds.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
//      2.将数据封装到数据包中
//      3.将数据包发送出去




    }

}


//负责接收的任务
class Rece implements Runnable{
    private DatagramSocket ds;

    public Rece(DatagramSocket ds) {
        super();
        this.ds = ds;
    }

    @Override
    public void run() {
        while(true){
//          接收的具体的任务的内容
//          因为接受的数据最终会存储到数据包中,而数据包中必须有字节数组
            byte[] buf=new byte[1024];

//          创建数据包对象
            DatagramPacket datagramPacket=new DatagramPacket(buf, buf.length);

//          将收到的数据存储到数据包中
            try {
                ds.receive(datagramPacket);
            } catch (IOException e) {
                e.printStackTrace();
            }
//          获取数据
            String ip=datagramPacket.getAddress().getHostAddress();
            String data=new String(datagramPacket.getData(),0 , datagramPacket.getLength());

            if("over".equals(data)){
                System.out.println(ip+"离开聊天室");
            }
            System.out.println(ip+":"+data);
        }
    }
}

获取IP基本信息

package cn.network.demo;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class IPDemo {
    /**
    * @param args
     * @throws UnknownHostException 
    */
    public static void main(String[] args) throws UnknownHostException  {

        InetAddress ip=InetAddress.getLocalHost();
        System.out.println(ip);
//      获取其他主机信息
        ip=InetAddress.getByName("www.sina.com.cn");

        String address=ip.getHostAddress();
        String name=ip.getHostName();


        System.out.println(address);
        System.out.println(name);
    }
}

UDP

/**
 * 
 */
package cn.network.demo;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

/**
 * @author john5
 *
 */
public class UDPReceDemo {
    /**
    * @param args
    * 创建udp的接收端
    * 思路:
    *   1、创建socket服务,明确一个端口
    *   2、、收数据
    *   3、将其中所需的数据取出来, ipdata 端口
    *   4、关闭资源
     * @throws IOException 
    */
    public static void main(String[] args) throws IOException {
        System.out.println("UDP接收端启动了......");
//      创建socket服务
        DatagramSocket dSocket=new DatagramSocket(10000);
    /*  
        2、使用socket的接收方法。接收数据。需要将收到的数据存储到数据包中
        可以通过数据包对象的方法对收到的数据进行解析
    */
        byte[] buf=new byte[1024];
        DatagramPacket datagramPacket=new DatagramPacket(buf, buf.length);
        dSocket.receive(datagramPacket);

//      通过数据包对象解析收到的数据,使用数据包的方法
        String ip=datagramPacket.getAddress().getHostAddress();
        int port=datagramPacket.getPort();
//      获取文字数据

        String string=new String(datagramPacket.getData(),0,datagramPacket.getLength());
        System.out.println(ip+":"+port+"-----"+string);
    }
}
package cn.network.demo;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class UDPSendDemo {
    /**
    * @param args
    * 需求:建立udp的发送端
    * 思路:
    *   1、建立可以实现udp传输的socket服务
    *   2、明确具体发送的数据
    *   3、通过socket服务将具体的数据发送出去
    *   4、关闭服务
     * @throws IOException 
    */
    public static void main(String[] args) throws IOException {
        System.out.println("UDP发送端启动......");
//      创建udp服务
        DatagramSocket datagramSocket=new DatagramSocket(8888);
//      明确数据
        String string="注意啦!UDP来啦!";

//      发送数据,将数据封装到数据包中
//      3、1将数据封装到数据包对象中。数据包会明确目的地址和端口
        byte[] buf=string.getBytes();
        DatagramPacket dPacket=new DatagramPacket(buf, buf.length,
                InetAddress.getByName("192.168.1.136"),10000);
//      3、2发送
        datagramSocket.send(dPacket);

//      3、3关闭
        datagramSocket.close();
    }
}

TCP

package cn.network.demo;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClient {
    /**
    * @param args
    * tcp客户端的建立
    * 思路:
    *   1、建立TCP客户端
    *   1、1因为是面向连接的,必须有连接才可以进行通信
    *   1、2在创建客户端时,就必须明确目的地址 和端口
    *   2、一旦连接建立,就有了传输数据的通道,就可以在通道中金属数据传输
    *   这个传输其实就是通过流实现的。这个流就是socket io 流
    *   3、只要获取socket io中的鞋动作就可以将数据写到socket流中发给服务端
    *   4、关闭资源
     * @throws IOException 
     * @throws UnknownHostException 
    */
    public static void main(String[] args) throws UnknownHostException, IOException {
        System.out.println("客户端启动....");
//      创建客户端对象,明确目的和端口
        Socket socket=new Socket("192.168.1.136", 10004);

//      获取socket流中的输出流,将数据发送给服务端
        OutputStream outputStream=socket.getOutputStream();

//      通过输出流写数据
        outputStream.write("TCP来啦".getBytes());

//      关闭资源
        socket.close();
    }
}
package cn.network.demo;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;


public class TCPServer {
    /**
    * @param args
    * 创建TCP服务端
    * 思路:
    *   1、创建socket服务器端服务 。服务器端为了让客户端可以连上,必须提供端口,监听一个端口
    *   2、获取客户端对象,通过客户端的socket流和对应的客户端进行通讯
    *   3、获取客户端的socket流的读取流
    *   4、读取数据并显示在服务器端
    *   5、关闭资源
     * @throws IOException 
    *   
    */
    public static void main(String[] args) throws IOException {
        System.out.println("服务器端启动..........");
        //创建服务器对象
        ServerSocket serverSocket=new ServerSocket(10004);

        //获取客户端对象
        Socket socket=serverSocket.accept();
        String ip=socket.getInetAddress().getHostAddress();
        System.out.println(ip+".........connected");

//      通过客户端对象获取socket流的读取流
        InputStream inputStream=socket.getInputStream();

        byte[] buf=new byte[1024];
        int len=inputStream.read(buf);

        String string=new String(buf, 0, len);
        System.out.println(string);

        socket.close();
    }
}

TCP2

package cn.network.demo;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClient2 {
    /**
    * @param args
    * 需求:客户端发送数据给服务端,并读取服务端反馈的数据
     * @throws IOException 
     * @throws UnknownHostException 
    * 
    */
    public static void main(String[] args) throws UnknownHostException, IOException {
        System.out.println("客户端2启动....");
//      创建socket客户端
        Socket socket=new Socket("192.168.1.136", 10005);

//      获取socket输出流,写数据
        OutputStream out=socket.getOutputStream();

        out.write("服务端我来了!".getBytes());

//      获取socket的读取流,读取服务端发回的数据
        InputStream inputStream=socket.getInputStream();

        byte[] buf=new byte[1024];
        int len=inputStream.read(buf);
        String strs=new String(buf, 0, len);

        System.out.println(strs);
        socket.close();

    }
}
package cn.network.demo;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer2 {
    /**
    * @param args
    * 服务端收到客户端的数据并反馈数据给客户端。应答
     * @throws IOException 
    * 
    */
    public static void main(String[] args) throws IOException {
        System.out.println("服务器端启动");
//      创建服务端socket对象
        ServerSocket sSocket=new ServerSocket(10005);

//      获取客户端对象
        Socket socket=sSocket.accept();
        String ip=socket.getInetAddress().getHostAddress();
        System.out.println(ip+"......connected");

//      获取socket读取流
        InputStream inputStream=socket.getInputStream();

        byte[] buf=new byte[1024];
        int len=inputStream.read(buf);
        String strs=new String(buf, 0, len);
        System.out.println(strs);

//      给客户端反馈数据,socket输出流
        OutputStream outputStream=socket.getOutputStream();
        outputStream.write("已连接".getBytes());
        socket.close();
        sSocket.close();

    }
}

上传图片

package cn.network.demo;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class UploadPicCllient {
    /**
    * @param args
     * @throws IOException 
     * @throws UnknownHostException 
    */
    public static void main(String[] args) throws UnknownHostException, IOException {
        System.out.println("上传图片的客户端已开启......");
        Socket socket=new Socket("192.168.1.136", 18079);

        File picFile=new File("1.jpg");

        FileInputStream fileInputStream=new FileInputStream(picFile);
        OutputStream outputStream=socket.getOutputStream();

        byte[] buf=new byte[1024];
        int len=fileInputStream.read(buf);
        while((len=fileInputStream.read(buf))!=-1){
            outputStream.write(buf,0,len);
        }
        socket.shutdownOutput();


//      读取服务器端的数据
        InputStream inputStream=socket.getInputStream();
        byte[] bufIn=new byte[1024];
        int lenIn=inputStream.read(bufIn);
        String strs=new String(bufIn, 0, lenIn);
        System.out.println(strs);

        fileInputStream.close();
        socket.close();

    }
}
package cn.network.demo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class UploadPicServer {
    /**
    * @param args
     * @throws IOException 
    */
    public static void main(String[] args) throws IOException {
        System.out.println("上传图片服务端已开启........");
        ServerSocket serverSocket=new ServerSocket(18078);

        Socket socket=serverSocket.accept();
        String ip=socket.getInetAddress().getHostAddress();
        System.out.println(ip+"......connected");

        InputStream iStream=socket.getInputStream();

        File file = getfile("D:\\java\\workspace\\Stage2\\Pic",ip);
//      FileInputStream fInputStream=new FileInputStream(file);
        FileOutputStream fOutputStream=new FileOutputStream(file);

        byte[] buf=new byte[1024];
        int  len=0;

        while((len=iStream.read(buf))!=-1){
            fOutputStream.write(buf, 0, len);
        }

//      回馈客户端数据
        OutputStream oStream=socket.getOutputStream();
        oStream.write("上传图片成功".getBytes());

        fOutputStream.close();
        socket.close();
        serverSocket.close();
    }

    private static File getfile(String dir,String ip) throws IOException {
        File pic_dir=new File(dir);
        if(!pic_dir.exists()){
            pic_dir.mkdir();
        }
        File file=new File(pic_dir,ip+".jpg");//创建失败???
        int count=0;
        if(file.exists()){
            file=new File(ip,"("+count+").jpg");
        }else{
            file.createNewFile();
        }
        return file;
    }
}

上传文件

package cn.network.demo;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class UploadTextClient {
    /**
    * @param args
    * 上传文本的客户端。读取本地的文本数去,发送给服务端,服务端接收完毕后,回馈“上传成功字样”
    * 客户端 socket
     * @throws IOException 
     * @throws UnknownHostException 
    */
    public static void main(String[] args) throws UnknownHostException, IOException {
        System.out.println("上传客户端启动了......");
//      客户端socket
        Socket socket=new Socket("192.168.1.136", 8887);

//      确定数据源,本地文件
        BufferedReader bufferedReader=new BufferedReader(new FileReader("client.txt"));//高效

//      确定数据流,socket输出
        BufferedWriter bufferedWriter=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

        PrintWriter out=new PrintWriter(socket.getOutputStream(),true);//true代表刷新

        String line=null;
        while((line=bufferedReader.readLine())!=null){
            out.println(line);
        }

//      给服务器端发送标记
        out.println("over");


//      上面的over  使用socket的禁用输出流方法
        socket.shutdownOutput();

//      通过socket读取流获取服务器端返回的数据
        BufferedReader bufferedIn=new BufferedReader(new InputStreamReader(socket.getInputStream()));

        String lineIn=bufferedIn.readLine();
        System.out.println(lineIn);

//      关闭
        bufferedReader.close();
        socket.close();
    }
}
package cn.network.demo;

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.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class UploadTextServer {
    /**
    * @param args
    * 上传文本的服务端,接受文本数据,并存储到文件中,服务器端接收完毕以后,回馈“上传成功”字样
     * @throws IOException 
    */
    public static void main(String[] args) throws IOException {
        /*File file=new File("client.txt");
        if(!file.exists()){
            file.createNewFile();
        }
        BufferedReader bufferedReader=new BufferedReader(new FileReader("client.txt"));//高效
        String line=null;
        while((line=bufferedReader.readLine())!=null){
            System.out.println(line);
        }
    */
        System.out.println("上传服务端启动了........");
//      1、服务端对象
        ServerSocket serverSocket=new ServerSocket(8887);

//      2、获取客户端
        Socket socket=serverSocket.accept();
        String ip=socket.getInetAddress().getHostAddress();
        System.out.println(ip+"....connected");

        //3、获取读取流,确定源,网络socket
        BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));

//  4、确定目的。文件
        PrintWriter printWriter=new PrintWriter(new FileWriter("server.txt",true));

//  5、频繁读写
        String line=null;
        while((line=bufferedReader.readLine())!=null){
            if("over".equals(line))
                break;
            printWriter.println(line);
        }

        printWriter.println("over");

//  6、给客户端返回信息
        PrintWriter out=new PrintWriter(socket.getOutputStream(),true);
        out.println("上传成功");

        printWriter.close();
        serverSocket.close();
        serverSocket.close();
    }
}

多次上传

package cn.network.demo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class UploadThreads {
    public static void main(String[] args) throws IOException {
        System.out.println("上传图片服务端已开启........");
        ServerSocket serverSocket=new ServerSocket(18079);
        while(true){
            Socket socket=serverSocket.accept();

            new Thread(new UploadPic(socket)).start();
        }
    }
}
package cn.network.demo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class UploadPic implements Runnable {
    private Socket socket;

    public UploadPic(Socket s) {
        super();
        this.socket = s;
    }

    @Override
    public void run() {
        String ip=socket.getInetAddress().getHostAddress();
        File file= getfile("D:\\java\\workspace\\Stage2\\Pic",ip);

        System.out.println(ip+"......connected");

        InputStream iStream;
        try {
            iStream=socket.getInputStream();
            FileOutputStream fOutputStream=new FileOutputStream(file);

            byte[] buf=new byte[1024];
            int  len=0;

            while((len=iStream.read(buf))!=-1){
                fOutputStream.write(buf, 0, len);
            }

//          回馈客户端数据
            OutputStream oStream=socket.getOutputStream();
            oStream.write("上传图片成功".getBytes());

            fOutputStream.close();
            socket.close();
        } catch (Exception e) {
            // TODO: handle exception
        }



    }

    private static File getfile(String dir,String ip) throws IOException {
        File pic_dir=new File(dir);
        if(!pic_dir.exists()){
            pic_dir.mkdir();
        }
        File file=new File(pic_dir,ip+".jpg");//创建失败???
        int count=0;
        if(file.exists()){
            file=new File(ip,"("+count+").jpg");
        }else{
            file.createNewFile();
        }
        return file;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值