jva基础网络编程

网络编程

InetAddress获取ip地址

package cn.edu.yulinu.demo;

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

/*
 * 表示互联网的IP地址
 * java.net.InetAddress
 * 静态方法
 * static InetAddress getLocalHost()
 * 返回本地主机
 */
public class InetAddressDemo {
    public static void main(String[] args) throws UnknownHostException {
        function();
        function1();
    }
    /*
     * 拿自己ip
     */
    public static void function() throws UnknownHostException {
        InetAddress localHost = InetAddress.getLocalHost();
        System.out.println(localHost);
    }
    /*
     * 拿别人ip
     */
    public static void function1() throws UnknownHostException {
        InetAddress inet = InetAddress.getByName("stxf.yulinu.edu.cn");
        System.out.println(inet);
    }
}

udp接收和发送

UDPSend

package cn.edu.yulinu.demo1;

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

/*
 * 实现UDP协议的发送端
 * 实现我们封装数据的类java.net.DatagramPacket 将数据包包装
 * 实现数据书传输的类ajva.net.DatagramSocket 将数据包发送出去
 * 
 * 实现步骤:
 * 1:创建DatagramPacket对象,封装数据,接收地址和端口
 * 2:创建DatagramSocket
 * 3:调用DatagramSocket
 */
public class UDPSend {
    
    public static void main(String[] args) throws IOException {
        //1:创建DatagramPacket对象,封装数据,接收地址和端口
        byte[] date ="你好UDP".getBytes();
        InetAddress inet = InetAddress.getByName("127.0.0.1");
        DatagramPacket dp = new DatagramPacket(date, date.length, inet, 6000);
        //2:创建DatagramSocket
        DatagramSocket ds = new DatagramSocket();
        //3:调用DatagramSocket
        ds.send(dp);
        //关闭资源
        ds.close();
    }
    
}

UDPReceive

package cn.edu.yulinu.demo1;

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

/*
 * 实现UDP接收端
 * 实现封装数据博爱java.net.DatagramPacket将数据接收
 * 实现输出传输java.net.DatagramSocket接收数据包
 * 实现步骤:
 * 1:创建DatagramSocket对象,绑定端口号 要和发送端口号一致
 * 2:创建字节数组,接收发来的数据
 * 3:创建数据包对象DatagramPacket
 * 4:调用DatagramSocket对象方法receive(DatagramPacket dp)接收数据,数据放在数据包中
 * 5:拆包(发送的IP地址,接收到的字节数组,发送方的端口号)
 */
public class UDPReceive {
    public static void main(String[] args) throws IOException {
        //创建数据包传输对象DatagramSocket绑定端口号
        DatagramSocket ds = new DatagramSocket(6000);
        //创建字节数据,接收数据
        byte[] data = new byte[1024];
        //拆个年间数据包对象传递字节数组
        DatagramPacket dp = new DatagramPacket(data, data.length);
        //调用ds对象方法receive传递数据包
        ds.receive(dp);
        int length = dp.getLength();
        System.out.println(new String(data,0,length));
        System.out.println(dp.getAddress().getHostAddress()+" "+dp.getPort());
        ds.close();
    }
}

TCP接收和发送

TCPServer

package cn.edu.yulinu.demo3;

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

/*
 * 实现TCP服务器程序
 * 表示服务器程序的类java.net.ServerSocket
 * 构造方法:
 * ServerSocket(int port)传递端口号
 * 
 * 很重要的事情,必须要获得客户端套接字对象
 * Socket accept()
 */
public class TCPServer {
    public static void main(String[] args) throws IOException {
        //创建服务器端连接对象
        ServerSocket server = new ServerSocket(8888);
        //调用服务器套接字对象中的方法accept()获取客户端套接字对象
        Socket socket = server.accept();
        //通过客户端套接字对象,socket获取字节输入流,读取客户端发来的数据
        InputStream in = socket.getInputStream();
        byte[] date = new byte[1024];
        int len = in.read(date);
        System.out.println(new String(date,0,len));
        //服务器向客户端回数据,字节输出流,通过客户端套接字对象获取字节输出流
        OutputStream out = socket.getOutputStream();
        out.write("收到。谢谢".getBytes());
        socket.close();
        server.close();
    }
}

TCPClient

package cn.edu.yulinu.demo3;

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

/*
 * 实现TCP客户端,连接到服务器
 * 和服务器实现数据交换
 * 实现TCP客户端程序的类java.net.Socket
 * 构造方法
 * Socket(String host,int port)传递服务器IP和端口号
 * 注意:构造方法只要运行,就会和服务器进行连接,连接失败就抛出异常
 * OutputStream getOutputStream() 返回套接字输出流
 * 作用:将套接字输出,输出到服务器中
 * InputStrtem getInputStream()返回套接字输入流
 * 作用:从服务器端读取数据
 */
public class TCPClient {
    public static void main(String[] args) throws  IOException {
        //创建Socket对象,连接数据库
        Socket socket = new Socket("127.0.0.1",8888);
        //通过客户端的套接字对象Socket方法,获取字节输出流,将数据写向服务器
        OutputStream out = socket.getOutputStream();
        out.write("服务器OK".getBytes());
        //读取服务器发回的数据,是信用socket套接字对象的字节输入流
        InputStream in = socket.getInputStream();
        byte[] data = new byte[1024];
        int len = in.read(data);
        System.out.println(new String(data,0,len));
        socket.close();
    }
}

TCP上传图片案例

TCPServer

package cn.edu.yulinu.demo4;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;

/*
 * TCP图片上传服务器
 * 1:ServerSocket套接字对象,监听端口8000
 * 2:方法accept()获取客户端的连接对象
 * 3:客户端连接对象获取字节输入流,读取客户端发送图片
 * 4:创建一个File对象,绑定上传的文件夹
 *     判断文件夹是否存在,文件夹不存在就创建
 * 5:创建一个字节输出流,输出流的目的是File对象所在的文件夹
 * 6:字节流读取图片,字节流将图片写入到目的文件夹中
 * 7:将上传成功协会客户端
 * 8:关闭资源
 */
public class TCPServer {

    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(8000);
        Socket socket = server.accept();
        //通过客户端连接对象,读取字节输入流,读取客户端图片
        InputStream in = socket.getInputStream();
        //将目的文件夹封装到File对象
        File upload = new File("images\upload");
        if(!upload.exists()) {
            upload.mkdirs();
        }
        //为了防止文件同名覆盖重新定义文件名
        //规则:域名+毫秒值+6位随机数
        String filename = "yulinu"+System.currentTimeMillis()+new Random().nextInt(999999)+".jpg";
        //创建字节输出流,将图片写入到目的文件夹中
        FileOutputStream fos = new FileOutputStream(upload+File.separator+filename);
        //读写字节数组
        byte[] bytes = new byte[1024];
        int len = 0;
        while((len=in.read(bytes))!=-1) {
            fos.write(bytes, 0, len);
        }
        //通过客户端连接获取字节输出流
        //将上传成功写回
        socket.getOutputStream().write("上传成功".getBytes());
        fos.close();
        socket.close();
        server.close();
    }
}

TCPClient

package cn.edu.yulinu.demo4;

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

/*
 * 实现RCP图片上传案列
 * 实现步骤:
 * 1;socket套接字连接服务器
 * 2:通过socket获取字节输出流,目的是为了写图片
 * 3:使用自己的流对象,读取图片数据源
 *         FileInputStream
 * 4:读取图片使用字节输出流,将图片写道服务器
 *     采用字节数组做缓冲
 * 5:通过Socket套接字获取字节输入流
 * 读取服务器发回来的上传成功
 * 6:关闭资源
 */
public class TCPClient {

    public static void main(String[] args) throws IOException{
        Socket socket = new Socket("127.0.0.1",8000);
        //获取字节输出流,将图片写到服务器中 
        OutputStream out = socket.getOutputStream();
        FileInputStream fis = new FileInputStream("e:\a.jpg");
        int len = 0;
        byte[] bytes = new byte[1024];
        while((len=fis.read(bytes))!=-1) {
            out.write(bytes,0,len);
        }
        //给服务器写终止序列
        socket.shutdownOutput();
        //获取字节输入流,获取服务器的上传成功
        InputStream in = socket.getInputStream();
        byte[] bytess = new byte[1024];
        len = in.read(bytess);
        System.out.println(new String(bytess,0,len));
        fis.close();
        socket.close();
    }
}

上传图片多线程改进版

TCPClient

package cn.edu.yulinu.demo4;

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

/*
 * 实现RCP图片上传案列
 * 实现步骤:
 * 1;socket套接字连接服务器
 * 2:通过socket获取字节输出流,目的是为了写图片
 * 3:使用自己的流对象,读取图片数据源
 *         FileInputStream
 * 4:读取图片使用字节输出流,将图片写道服务器
 *     采用字节数组做缓冲
 * 5:通过Socket套接字获取字节输入流
 * 读取服务器发回来的上传成功
 * 6:关闭资源
 */
public class TCPClient {

    public static void main(String[] args) throws IOException{
        Socket socket = new Socket("127.0.0.1",8000);
        //获取字节输出流,将图片写到服务器中 
        OutputStream out = socket.getOutputStream();
        FileInputStream fis = new FileInputStream("e:\a.jpg");
        int len = 0;
        byte[] bytes = new byte[1024];
        while((len=fis.read(bytes))!=-1) {
            out.write(bytes,0,len);
        }
        //给服务器写终止序列
        socket.shutdownOutput();
        //获取字节输入流,获取服务器的上传成功
        InputStream in = socket.getInputStream();
        byte[] bytess = new byte[1024];
        len = in.read(bytess);
        System.out.println(new String(bytess,0,len));
        fis.close();
        socket.close();
    }
}

Upload

package cn.edu.yulinu.demo4;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;

public class Upload implements Runnable {

    private Socket socket;
    
    public Upload(Socket socket) {
        this.socket=socket;
    }
    
    @Override
    public void run() {
        try {
        // TODO Auto-generated method stub
        //通过客户端连接对象,读取字节输入流,读取客户端图片
        InputStream in = socket.getInputStream();
        //将目的文件夹封装到File对象
        File upload = new File("images\upload");
        if(!upload.exists()) {
            upload.mkdirs();
        }
        //为了防止文件同名覆盖重新定义文件名
        //规则:域名+毫秒值+6位随机数
        String filename = "yulinu"+System.currentTimeMillis()+new Random().nextInt(999999)+".jpg";
        //创建字节输出流,将图片写入到目的文件夹中
        FileOutputStream fos = new FileOutputStream(upload+File.separator+filename);
        //读写字节数组
        byte[] bytes = new byte[1024];
        int len = 0;
        while((len=in.read(bytes))!=-1) {
            fos.write(bytes, 0, len);
        }
        //通过客户端连接获取字节输出流
        //将上传成功写回
        socket.getOutputStream().write("上传成功".getBytes());
        fos.close();
        socket.close();
        }catch(IOException e) {
            
        }
    }

}

TCPThreadServer

package cn.edu.yulinu.demo4;

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

public class TCPThreadServer {
    public static void main(String[] args) throws IOException {
        
        ServerSocket server = new ServerSocket(8000);
        while(true) {
            Socket socket =server.accept();
            new Thread(new Upload(socket)).start();
        }
    }
}
本人博客均是本人学习过程中的总结。
原文地址:https://www.cnblogs.com/numberfive/p/9227578.html