Java网络编程之TCP通信

一、概述

  Socket类是Java运行clientTCP操作的基础类,这个类本身使用代码通过主机操作系统的本地TCP栈进行通信。

Socket类的方法会建立和销毁连接,设置各种Socket选项。

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

二、什么是TCP?  

  TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。

TCP通信分为client和server端,相应的对象是各自是Socket和ServerSocket。

  当一台计算机须要与还有一台远程计算机连接时,TCP协议会让他们建立一个连接:用于发送和接收数据的虚拟链路。

TCP协议负责收集信息包。并将其按适当的次序放好传送。在接收端收到后再将其正确的还原。

为了保证数据包在传送中准确无误,TCP使用了重发机制:当一个通信实体发送一个消息给还有一个通信实体后须要收到还有一个实体的确认信息。假设没有收到确认信息,则会再次重发刚才发送的信息。

  

三、TCP通信

  1、构造函数

  Socket类实现client套接字,通过构造函数能够指定希望连接的主机和port。

主机能够指定为InetAddress或String,port始终指定为0到65535之间的int值。

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

  ServerSocket类实现server套接字。

server套接字等待请求通过网络传入。它基于该请求运行某些操作。然后向请求者返回结果。

 ServerSocket ss=new ServerSocket(10001);//创建绑定到特定port的server套接字

  2、样例:TCP文件复制

  client:

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();
    }
}

  server端:

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中编写server端。然后利用浏览器进行訪问。

  eg、server端代码为:

public class SocketServer
{
    public static void main(String[] args) throws IOException
    {
        ServerSocket server=new ServerSocket(11000);
        Socket client=server.accept();
        PrintWriter out=new PrintWriter(client.getOutputStream(),true);
        out.println("你好!

");
        server.close();
    }
}

  然后打开IE浏览器,在地址中输入http://192.168.1.120:11000/(192.168.1.120为本机IP地址)。结果显示为:

  

  在正常的应用中,浏览器是向Tomacatserver发出请求。以得到网页图片等资源。而tomca就是用Java写的server端软件。

  如今我们编写server端为:

public class SocketServer
{
    public static void main(String[] args) throws IOException
    {
        ServerSocket server=new ServerSocket(11000);
        Socket client=server.accept();
        PrintWriter out=new PrintWriter(client.getOutputStream(),true);
        BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
        String line=null;
        while((line=in.readLine())!=null)
            System.out.println(line);
        out.println("你好!

");
        server.close();
    }
}

  然后在利用浏览器訪问。能够看到浏览器(client)发给server端的请求头数据为:

  

  利用上述原理。我们能够自己编写类似IE的浏览器端(client)软件。首先在Tomcat的安装文件夹C:\apache-tomcat-7.0.62\webapps\myweb中加入一个demo.html资源,然后编写client。代码例如以下:

public class ClientDemo
{
    public static void main(String[] args) throws UnknownHostException, IOException
    {
        Socket s=new Socket("192.168.1.120",8080);
        PrintWriter out=new PrintWriter(s.getOutputStream(),true);

        //将请求头发给server
        out.println("GET /myweb/demo.html HTTP/1.1");
        out.println("Accept:*/*");
        out.println("Host: 192.168.1.120:11000");
        out.println("Connection: Keep-Alive");

        //输出空行,此步骤不可少
        out.println();
        BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));
        String line=null;
        //返回server的响应文件
        while((line=in.readLine())!=null)
        {
            System.out.println(line);
        }
        s.close();
    }
}

  接下来,启动Tomcat。即双击C:\apache-tomcat-7.0.62\bin中startup.bat文件。然后执行上述client代码,此时能够看到Tomacat返回的响应数据:

  

时间: 2024-11-06 15:53:01

Java网络编程之TCP通信的相关文章

java网络编程之TCP实例

Dgram类 package Socket; import java.net.DatagramPacket; import java.net.InetAddress; public class Dgram { public static DatagramPacket toDatagram(String s, InetAddress destIA, int destPort) { byte[] buf = new byte[s.length() + 1]; s.getBytes(0, s.leng

Java网络编程之Socket通信(二)

之前在前面已经介绍了Socket通信的一些基本原理,以及如何让客户端与服务器端建立通信,和实现通信的一些基本步骤(包括首先使得服务器端与客户端建立连接,建立连接之后,服务器端开始侦听客户端的请求,侦听到客户端的请求之后,通过输入输出流处理相关信息实现通信,最后通信完毕结束通信等一系列流程). 但是之前只是单个客户端与服务器进行通信,而我们实际应用中单个客户端的情况几乎不存在,都是多个客户端同时与服务器进行交互(这里同时交互就会出现并发性的问题,对于并发性的问题暂时还不是很懂,只知道有这个概念),

Java网络编程之TCP、UDP

Java网络编程提供了两种协议:TCP(传输控制协议)和UDP(数据报协议).TCP(Transmission Control Protocol)是一种可靠的传输协议,传输时会采用"三次握手"端的方式建立连接,以保证数据的可靠性和安全性:而UDP(User Datagram Protocol)协议是一种不可靠的传输协议,发送的数据不一定能够接受的到,网上的聊天是工具一般采用的此协议.下面将详细的接受TCP和UDP的使用以及相应的编码. 一.TCP网络通信 Java中使用Socket(套

Java网络编程之tcp的socket通信

1.客户端MyClient.java 1 import java.io.*; 2 import java.net.*; 3 4 public class MyClient 5 { 6 public static void main(String[] args)throws Exception 7 { 8 Socket s = new Socket("192.168.1.1" , 30000); 9 // 客户端启动ClientThread线程不断读取来自服务器的数据 10 new Th

[学习笔记]Java网络编程之TCP通讯

1. Socket类 1.1 概述 用于创建客户端套接字,以此建立TCP链接. 1.2 构造器 Socket() Socket(InetAddress address, int port) Socket(String host, int port) Socket(InetAddress address, int port, InetAddress localAddr, int localPort) Socket(String host, int port, InetAddress localAd

Java网络编程之TCP程序设计

在Java中使用Socket(套接字)来完成TCP程序的开发,使用此类可以方便的建立可靠的.双向的.持续的.点对点的通信连接.服务器端使用ServerSocket等待客户端的连接,,而每一个客户端都是用一个Socket对象表示. 1.ServerSocket类与Socket类 ServerSocket类主要运用在服务器端开发,用于接收客户端的连接请求.常用方法: 类型 方法 描述 构造方法 ServerSocket(int port) 创建绑定到特定端口的服务器套接字. Socket accep

Java网络编程之TCP网络编程

一.基于Socket的TCP编程 Java语言的基于套接字编程分为服务端编程和客户端编程,其通信模型如图所示: 二.客户端Socket的工作过程(四个基本步骤) 1.创建Socket根据指定服务端的IP地址或端口号构造Socket类对象.若服务器端响应,则建立客户端到服务器的通信线路:若连接失败,会出现异常.2.打开连接到Socket的输入出流使用getlnputStream()方法获得输入流,使用getOutputStream()方法获得输出流,进行数据传输.3.按照一定的协议对Socket

4.Java网络编程之TCP/UDP

常见传输协议: UDP , TCP UDP协议:    特点:         1.将数据及源和目的封装成数据包中,不需要建立连接         2.每个数据包的大小限制在64K内         3.因无连接,是不可靠协议         4.不需要建立连接,速度快 举例:比如你向家里邮寄一个包裹,无论家里此时是否有人,都会发送.当快递员发送到你家时,如果有人,家里人就收到了包裹,如果家里此时没有人,包裹(数据包)就被丢弃了. 自我理解: 当我们建立连接后,你说了一句:"你吃过饭了么?&qu

黑马程序员——Java网络编程之UDP传输

网络编程 网络模型 通讯要素:InetAddress(对象):ip地址,网络中设备的标识,不可记忆,可用主机名,本地回环地址:127.0.0.1主机名localhost 端口号 传输协议:UDP,将数据的源及目的封装成数据包中,不需要建立连接,每个数据包的大小限制在64K内,无连接,是不可靠协议,不需要建立连接,速度快.力求速度,不求数据的准确性.比如聊天软件,网络会议. TCP:建立连接,形成传输数据的通道,在连接中进行大数据量传输,通过三次握手完成连接,是可靠协议,必须建立连接效率稍低. S