Day09 网络编程(TCP实现聊天和文件上传)

TCP

TCP实现聊天

  • 客户端
    1.链接服务器Socket
    2.发送消息
public class TcpClientDemo01 {
    public static void main(String[] args) {
        Socket socket=null;
        OutputStream os=null;
        //1.我得知道服务器地址
        try {
            InetAddress serverIP = InetAddress.getByName("127.0.0.1");
            //端口号
            int port=9999;
            //2.建立一个socket链接
           socket = new Socket(serverIP,port);
            //3.发送消息 IO流
            os = socket.getOutputStream();
            os.write("你好!".getBytes());

        } catch (Exception e) {
            e.printStackTrace();
        }
        finally {   //IP地址不用关

            if(os!=null) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
  • 服务器
    1.创建服务的端口SeverSocket
    2.等待用户的链接accept
    3.接收用户的消息
public class TcpClientDemo02 {
    public static void main(String[] args) {
        ServerSocket serverSocket=null;
        Socket socket=null;
        InputStream is=null;
        ByteArrayOutputStream baos=null;    //提高做用域,在finally中才能关
        //1.我得有一个地址提供出去
        try {
           serverSocket = new ServerSocket(9999);
         while(true){           //无限循环实现不断接收
             //2.等待客户端链接过来
             socket = serverSocket.accept();  //这里的socket和客户端时同一个变量
             //3.读取客户端的消息
             is = socket.getInputStream();

             //管道流
             baos = new ByteArrayOutputStream();
             byte[] buffer = new byte[1024];
             int len;
             while((len=is.read(buffer))!=-1){
                 baos.write(buffer,0,len);
             }
             System.out.println(baos.toString());
         }
        }
           catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            //关闭资源 先开后关
            if(baos!=null){
                try {
                    baos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(is!=null){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(serverSocket!=null){
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

TCP实现文件上传

客户端代码java

public class TcpClientDemo02 {
    public static void main(String[] args)throws Exception {
        //1.建立一个socket链接
     Socket socket=  new Socket( InetAddress.getByName("127.0.0.1"),9000);
//2.建立一个输出流
        OutputStream os = socket.getOutputStream();
        //3.文件流
        FileInputStream fis = new FileInputStream(new File("abc.jpg"));
        //4;.写出文件
        byte[] buffer = new byte[1024];
       int len;
       while((len=fis.read(buffer))!=-1){
           os.write(buffer,0,len);
       }
       //5.通知服务器,已经结束了
       socket.shutdownOutput();  //我已经传输完了
       //6.肯定服务器接受完毕,才能断开链接
        InputStream inputStream = socket.getInputStream();
       //String byte[]
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
       byte[] buffer2= new byte[1024];
       int len2;
       while ((len2=inputStream.read(buffer2))!=-1){
           baos.write(buffer,0,len2);
       }
        //7.关闭资源
        fis.close();
       os.close();;
       socket.close();
    }
}

服务端代码web

public class TcpSeverDemo02 {
    public static void main(String[] args) throws IOException {
//1.建立服务
        ServerSocket serverSocket=new ServerSocket(9000);
//2.监听客户端的链接
        Socket socket = serverSocket.accept();//阻塞式监听,会一直等待客户端链接
//3.获取输入流
        InputStream is=socket.getInputStream();
//4.文件输出
        FileOutputStream fos = new FileOutputStream(new File("receive.jpg"));
        byte[] buffer = new byte[1024];
        int len;
        while ((len=is.read(buffer))!=-1){
            fos.write(buffer,0,len);
        }
//5. 通知客户端我接受完毕了
        OutputStream os = socket.getOutputStream();
        os.write("我接受完毕了,能够断开了".getBytes());
        
//6.关闭资源
        fos.close();
        is.close();
        socket.close();
        serverSocket.close();
    }
}