Java网络编程之TCP通信

  Socket类是Java执行客户端TCP操作的基础类,这个类本身使用代码通过主机操作系统的本地TCP栈进行通信。Socket类的方法会建立和销毁连接,设置各种Socket选项。

  ServerSocket类是Java执行服务器端操作的基础类,该类运行于服务器,监听入站TCP连接,每个socket服务器监听服务器的某个端口,当远程主机的客户端尝试连接此端口时,服务器就被唤醒,并返回一个表示两台主机之间socket的正常Socket对象。

二、什么是TCP?  

  TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP通信分为客户端和服务器端,对应的对象是分别是Socket和ServerSocket。

  当一台计算机需要与另一台远程计算机连接时,TCP协议会让他们建立一个连接:用于发送和接收数据的虚拟链路。TCP协议负责收集信息包,并将其按适当的次序放好传送,在接收端收到后再将其正确的还原。为了保证数据包在传送中准确无误,TCP使用了重发机制:当一个通信实体发送一个消息给另一个通信实体后需要收到另一个实体的确认信息,如果没有收到确认信息,则会再次重发刚才发送的信息。

Java网络编程之TCP通信

三、TCP通信

  1、构造函数

  Socket类实现客户端套接字,通过构造函数可以指定希望连接的主机和端口。主机可以指定为InetAddress或String,端口始终指定为0到65535之间的int值。

Socket s=new Socket("127.0.0.1", 10001);//创建一个流套接字并将其连接到指定主机上的指定端口号

  ServerSocket类实现服务器套接字。服务器套接字等待请求通过网络传入,它基于该请求执行某些操作,然后向请求者返回结果。

ServerSocket ss=new ServerSocket(10001);//创建绑定到特定端口的服务器套接字

  2、例子:TCP文件复制

  客户端:

public class ClientDemo
{
    public static void main(String[] args) throws UnknownHostException, IOException
    {
        Socket s=new Socket("127.0.0.1", 10004);
       
        BufferedReader buf = new BufferedReader(new FileReader("C:\\Users\\Administrator\\Desktop\\1.txt"));
        String line=null;
       
        /*PrintWriter out=new PrintWriter(s.getOutputStream(),true);
       
        while((line=buf.readLine())!=null)
        {
            out.println(line);
        }
        */
       
        BufferedWriter out=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        while((line=buf.readLine())!=null)
        {
            out.write(line);
            out.newLine();
            out.flush();
        }
        s.shutdownOutput();
        BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));
       
        String str=in.readLine();
       
        System.out.println(str);
       
        s.close();
       
        buf.close();
    }
}

  服务器端:

public class ServerDemo
{
    public static void main(String[] args) throws IOException
    {
        ServerSocket ss=new ServerSocket(10004);   
        Socket s=ss.accept();   
        BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));
        String line=null;
       
        /*PrintWriter buf=new PrintWriter(new FileWriter("C:\\Users\\Administrator\\Desktop\\2.txt"),true);
        while((line=in.readLine())!=null)
        {   
            buf.println(line);
        }*/
        BufferedWriter buf=new BufferedWriter(new FileWriter("C:\\Users\\Administrator\\Desktop\\2.txt"));
        while((line=in.readLine())!=null)
        {   
            buf.write(line);
            buf.newLine();
            buf.flush();
        }
        PrintWriter out=new PrintWriter(s.getOutputStream(),true);
        out.println("传输成功!");
        ss.close();
        buf.close();
    }
}

四、Socket在浏览上的应用

  我们可以在Eclipse中编写服务器端,然后利用浏览器进行访问。

  eg、服务器端代码为:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/b23aabf4463df43258b17c7c2231ecfa.html