Socket TCP通信简单实现与文件传输

    • 客户端Client
    • 服务器端 Server

客户端Client

java中用于TCP传输的类分别为客户端的Socket类和服务器端的ServerSocket类。
Socket是一个用于实现客户端套接字,也就是两台机器的通信端点,构造方法多样:Socket TCP通信简单实现与文件传输_第1张图片

其中用于TCP连接的主要是第二个,以InetAddress类的一个实例和端口号来表示需要连接的对象。或者是先获得一个空的实例,然后通过connect方法来设置连接对象以及连接时间。
创建了实例之后,可以通过getInputStream和getOutputStream来获取输入输出流来进行通信。
不过需要注意的是:

  • 在获得输入输出流之后,可以通过shutdownOutput的方法来单方面结束通信,用以通知对方本次传输完毕,否则会无法完成传输,但是shutdownOutput这个方法和流的close方法不一样,shutdown不会断开socket连接,需要再次连接的时候需要再一次getoutputstream。(一站式服务one—host)
  • 在关闭Socket实例的时候也会把相对应的输入输出流关闭,相反,在关闭了流之后,也会同时关闭socket,所以需要放在最后才关闭。
package Socket;

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

public class Client {
    public static void main(String[] args){
        try{
            Socket socket = new Socket("localhost", 1444);
            OutputStream op = socket.getOutputStream();
            PrintWriter pw = new PrintWriter(op);
            pw.write("hello,I'm luffy");
            pw.flush();
            System.out.println("连接成功");

            //告知服务器传输完毕,否则因传输字节长度未知而无法完成传输
            socket.shutdownOutput();
            InputStream is = socket.getInputStream();
            InputStreamReader isw = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isw);
            String io = null;
            while((io = br.readLine())!=null){
                System.out.println("服务器的回应:"+io);
            }
            socket.shutdownInput();
            pw.close();
            is.close();
            isw.close();
            br.close();
            socket.close();
        } catch(UnknownHostException e){
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   
    }

}

服务器端 Server

服务器端使用的类是ServerSocket,使用方法与客户端相类似,构造方法主要是ServerSocke(int port),指定服务端口。
其中用accept方法来监听端口,需要注意的是这个方法是一个阻塞方法,直到接收到访问才回继续运行下去,否则会一直等待。

package Socket;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            ServerSocket server = new ServerSocket(1444);
            System.out.println("***服务器正准备启动,等待客户端的连接***");
            Socket socket = server.accept();
            System.out.println("客户端已经连接上服务器");
            InputStream is = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            System.out.println("准备输出:");
            String io1 = null;
            while((io1 = br.readLine())!=null){
                System.out.println("客户机"+socket.getInetAddress()+"说:"+io1);
            }
            socket.shutdownInput();
            //准备发送回应信息:
            System.out.println("准备发送回应信息");
            OutputStream op = socket.getOutputStream();
            System.out.println("连接成功");
            InputStream test = new FileInputStream("D:\\Java\\Java workspace\\FileTest\\梦仪.txt");
            byte[] bytes = new byte[22];
            int i = 0;
            //  使用printWrite来输出是会出现乱码
//          PrintWriter pw = new PrintWriter(op, true);
            while((i = test.read(bytes, 0, bytes.length))!=-1){
                io1 = new String(bytes, 0, i, "gbk");
//              pw.print(io1);
//              pw.flush();
                op.write(bytes, 0, i);
            }
            //告知客户端本次传输完毕。
            socket.shutdownOutput();
            test.close();
            op.close();
//          pw.close();
            isr.close();
            is.close();
            br.close();
            socket.close();
            server.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

你可能感兴趣的:(java-web)