java 网络编程

1.
image.png
image.png

4.获取本地ip地址

    InetAddress ip=InetAddress.getLocalHost();
    System.out.println(ip);

}}
image.png

6.tcp:
tcp服务端:

public class TCPClient {
public static void main(String[] args) throws UnknownHostException, IOException{
    /*
     * tcp客户端的建立。
     * 思路:
     * 1.建立tcp客户端服务
     *   1.1因为是面向连接,必须有链接才可以建立通信
     *   1.2在创建客户端时,就必须明确目的的地址和端口
     * 2.一旦连接确立,就有了传输数据的通道,就可以在通道中传输数据。
     *    这个传输其实是通过流实现的,这个流就是socket io流。
     * 3.只要获取socket io中的写动作就可以将数据写到socket流中给服务端。
     * 4.关闭资源。
     *
     */
    System.out.println("客户端启动。。。");
    //1.创建客户端对象,明确目的地址和端口
    Socket s=new Socket("10.17.212.81",9999);
    
    //2.获取socket流中的输出流,将数据发送给服务端
    OutputStream out=s.getOutputStream();
    
    //3.通过输出流写数据
    out.write("注意啦 ,tcp来了".getBytes());
    //4.关闭资源
    s.close();
    
    
}
}

服务端:

public class TCPServer {
public static void main(String[] args) throws IOException{
    /*
     * 创建tcp服务端
     * 思路:
     * 1.创建socket服务端服务,服务端为让客户端可以连上,必须提供端口,监听端口。
     * 2.获取客户端对象,通过客户端的socket流和对应的客户端进行通信
     * 3.获取客户端的socket流的读取流
     * 4.读取数据并显示在服务器端
     * 5.关闭资源
     * 
     */
    System.out.println("服务端启动");
    //1.创建服务器端对象
    ServerSocket ss=new ServerSocket(9999);
    
    //2.获取客户端对象
    Socket s=ss.accept();
    String ip=s.getInetAddress().getHostAddress();//获取id对象的字符对象
    System.out.println(ip+".....connected");
    
    //3.通过客户端对象获取socket流的读取流
    InputStream in=s.getInputStream();
    byte[] buf=new byte[1024];
    int len=in.read(buf);
    String str=new String(buf, 0, len);
    System.out.println(str);
    
    s.close();
    ss.close();
    
    
}
}

先运行服务端,再运行客户端
结果:
服务端启动
客户端启动。。。
10.17.212.81.....connected
注意啦 ,tcp来了

7.TCP服务端客户端互访:

public class TCPCLient2 {

    public static void main(String[] args) throws UnknownHostException, IOException {
        // 需求:客户端发送数据给服务端,并读取服务端反馈的数据
        System.out.println("客户端2启动");
        //1.创建socket客户端
        Socket s=new Socket("10.17.212.81",8999);
        //2.获取socket输出流,写数据
        OutputStream out=s.getOutputStream();
        out.write("服务端,我来了".getBytes());
        
        //3.获取socket的读取流,读取服务端发回的数据
        InputStream in=s.getInputStream();
        byte[] buf=new byte[1024];
        
        int len=in.read(buf);
        String str=new String(buf, 0, len);
        System.out.println(str);
        
        s.close();
        
        
    }

}
public class TCPCServer2 {

    public static void main(String[] args) throws IOException {
        // 服务端收到客户端的数据并反馈数据给客户端,应答
        //1.创建服务端socket对象
        ServerSocket ss=new ServerSocket(8999);
        System.out.println("服务器端2启动。。。。");
        //2.获取客户端对象
        Socket s=ss.accept();
        String ip=s.getInetAddress().getHostAddress();//获取ip地址字符对象
        System.out.println(ip);
        
        //3.获取socket读取流
        InputStream in=s.getInputStream();
        
        byte[] buf=new byte[1024];
        int len=in.read(buf);
        String str=new String(buf,0,len);
        
        System.out.println(str);
        
        //4.给客户端反馈数据,socket输出流
        OutputStream out=s.getOutputStream();
        out.write("hh你来了".getBytes());
        
        s.close();
        ss.close();
        
        
        

    }

}

结果:


image.png

上传文本客户端:

package cn.itcast.net.tcp.uploadtext;

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

public class UploadTextClient {
public static void main(String[] args) throws UnknownHostException, IOException{
    /*
     * 上传文本端的客户端,读取本地文本数据,发送给服务端,服务端接收完毕后,回馈“上传成功”字样
     */
    System.out.println("上传文本客户端启动.....");
    //客户端socket
    Socket s=new Socket("10.17.212.81",16666);
    //1.确立数据源,本地文件 
    BufferedReader bufr =new BufferedReader(new FileReader("cilent.txt"));
    
    
    //2.确定目的,socket输出流
    PrintWriter out=new PrintWriter(s.getOutputStream(),true);
    
    String line=null;
    while((line=bufr.readLine())!=null){
        out.println(line);
    }
    //给服务端传送标记
    //out.print("over");//容易重复
    
    //使用socket的禁用输出流方法
    s.shutdownOutput();
    
    
    //3.通过socket读取获取服务端返回的数据。
    BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream())); 
    String lineIn=bufIn.readLine();
    System.out.println(lineIn);
    
    
    //4.关闭
    bufr.close();
    s.close();
    
    
}
}

服务端:

package cn.itcast.net.tcp.uploadtext;

import java.io.BufferedReader;
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 {
    public static void main(String[] args) throws IOException{
        /*
         * 上传文本的服务端,接受文本数据,并存储到文件中,服务端接受完毕后,反馈“上传成功”字样
         */
        System.out.println("上传服务端启动....");
        
        //1.服务端对象。
        ServerSocket ss=new ServerSocket(16666);
        
        //2.获取服务端
        Socket s=ss.accept();
        String ip=s.getInetAddress().getHostAddress();
        System.out.println(ip+".....connected");
        
        //3.获取读取流,确定源,网络socket
        BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
        //InputStreamReader 是字节流通向字符流的桥梁,它将字节流转换为字符流.而BufferedReader提供额外的功能
        
        //4.确定目的、文件
        PrintWriter pw=new PrintWriter(new FileWriter("server.txt"),true);
        
        //5.频繁读写
        String line=null;
        while((line=bufIn.readLine())!=null){
            pw.println(line);
        }
        
        //6.给客户端返回信息
        PrintWriter out=new PrintWriter(s.getOutputStream(),true);//一定要加true噢
        out.println("上传成功");
        
        pw.close();
        ss.close();
        s.close();
        
    }
}

注意:客户端中 的 使用socket的禁用输出流方法: s.shutdownOutput();

9.tcp上传图片
客户端

package cn.itcast.net.tcp.uploadpic;

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 UploadpicClient {
public static void main(String[] args) throws UnknownHostException, IOException{
    //1.创建socket流
    Socket s=new Socket("10.17.212.81",10086);
    
    File picFile=new File("1.jpg");
    
    FileInputStream fis=new FileInputStream(picFile);
    
    OutputStream out=s.getOutputStream();
    
    byte[] buf=new byte[1024];
    
    int len=0;
    while((len=fis.read(buf))!=-1){
        out.write(buf, 0, len);
    }
    
    //告诉服务端写完了
    s.shutdownOutput();
    
    InputStream in=s.getInputStream();
    byte[] bufIn=new byte[1024];
    int lenIn=in.read(bufIn);
    String str=new String(bufIn, 0, lenIn);
    System.out.println(str);
    
    fis.close();
    s.close();

    
    
}
}

服务端

package cn.itcast.net.tcp.uploadpic;

import java.io.File;
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 {

    public static void main(String[] args) throws IOException {
        // 服务端对象
        ServerSocket ss=new ServerSocket(10086);
        Socket s=ss.accept();
    
        
        String ip=s.getInetAddress().getHostAddress();
        System.out.println(ip+"......connected");
        
        
        InputStream in=s.getInputStream();
         
        File file = getFile("F:\\eclipse\\网络编程\\server_pic",ip);
        
        
        FileOutputStream fos=new FileOutputStream(file);
        
        byte[] buf=new byte[1024];
        int len=0;
        while((len=in.read(buf))!=-1){
            fos.write(buf, 0, len);
        }
        
        
        //回馈给客户端
        OutputStream out = s.getOutputStream();
        out.write("上传图片成功".getBytes());
        
        fos.close();
        s.close();
        ss.close();
        

    }

//重名问题解决:
    private static File getFile(String dir1, String ip) {
        File dir=new File(dir1);
        if(!dir.exists()){
            dir.mkdir();
        }
        
        int count=1;
        File file=new File(dir,ip+"("+count+").jpg");
        while(file.exists()){
            count++;
            file=new File(dir,ip+"("+count+").jpg");
        }
        return file;
    }

}

10.
TCP上传图片并发访问服务器--运用线程

客户端和9一样
服务端:

package cn.itcast.net.tcp.uploadpic;

import java.io.File;
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 {

    public static void main(String[] args) throws IOException {
        // 服务端对象
        ServerSocket ss=new ServerSocket(10086);
        while(true){
        Socket s=ss.accept();
    
        new Thread(new UploadPic(s)).start();//运用多线程
        
    }
    }
}

UploadPic():

public class UploadPic implements Runnable {
 private Socket s;
    
      
    public UploadPic(Socket s) {
    super();
    this.s = s;
}
    @Override
    public void run() {
        String ip=s.getInetAddress().getHostAddress();
        System.out.println(ip+"......connected");
        
        
        InputStream in;
        try {
            in = s.getInputStream();
            File file = getFile("F:\\eclipse\\网络编程\\server_pic",ip);
            
            
            FileOutputStream fos=new FileOutputStream(file);
            
            byte[] buf=new byte[1024];
            int len=0;
            while((len=in.read(buf))!=-1){
                fos.write(buf, 0, len);
            }
            
            //回馈给客户端
            OutputStream out = s.getOutputStream();
            out.write("上传图片成功".getBytes());
            
            fos.close();
            s.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    private static File getFile(String dir1, String ip) {
        File dir=new File(dir1);
        if(!dir.exists()){
            dir.mkdir();
        }
        
        int count=1;
        File file=new File(dir,ip+"("+count+").jpg");
        while(file.exists()){
            count++;
            file=new File(dir,ip+"("+count+").jpg");
        }
        return file;
    }

}

常见的客户端和服务端有哪些呢?
客户端:浏览器、
服务端:Tomcat
如果请求多图片的网页,请求的次数很多,有多少资源(html文件,图片文件,css文件,js文件等)就需要请求多少次

12.URL:


image.png

13.
image.png

你可能感兴趣的:(java 网络编程)