Tcp通讯协议

了解了Udp通讯协议之后,我们再认识一个常用的通讯协议:Tcp

 

Tcp传输特点:

--依赖于Socket和ServerSocket对象

--建立客户端和服务端

--建立连接后,通过Socket中的 IO 流进行数据的传输

--关闭Scoket

 

下面通过一个简单的例子认识一下:

--tcp分客户端和服务端

--客户端对应的对象是Socker

   服务端对应的对象是ServerSocket

 

//客户端:

package com.shindo.java.tcp;
import java.io.*;
import java.net.*;

/**
 * 客户端:
 * 通过查询Socket对象,发现在该对象建立时,就可以去连接指定的主机,
 * 因为Tcp是面向连接的,所以在建立Socket服务时,就要有服务端存在,并连接成功,形成通路后,在该通道进行数据传输
 * 
 * 需求:给服务端发送一个文本数据
 */
public class TcpClient {
    public static void main(String[] args)throws Exception{
        //创建客户端的Socket服务,指定目的主机和端口
        Socket s = new Socket("127.0.0.1",11012);
        
        //为了发送数据,应获取Socket流中的输出流
        OutputStream out = s.getOutputStream();//使用字节流
        
        out.write("This's the first Tcp test Demo".getBytes());
        
        //因为流是通过Socket获得的,所有一旦Socket关闭,流也随之关闭
        s.close();
    }
}

 

//服务端:

package com.shindo.java.tcp;
import java.io.*;
import java.net.*;
/**
 * 需求:定义端点接收数据,并打印在控制台上
 * 
 * 1、简历ServerSocket服务,并监听一个端口
 * 2、获取连接过来的客户端对象
 *    通过ServerSocket的accept()方法,没有连接就会等,所以这个方法是阻塞的。
 * 3、客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流
 *  来读取客户端发送过来的数据,并打印控制台;
 * 4、关闭服务端(可选)
 */
public class TcpServer {
    public static void main(String[] args){
        try {
        //简历服务端Socket服务,并监听一个端口
        ServerSocket ss = new ServerSocket(11012);
        
        //通过accept()方法获取连接过来的客户端对象
        Socket s = ss.accept();
        
        String ip = s.getInetAddress().getHostAddress();
        System.out.println(ip + ".........is connected");
        
        //使用客户端对象的读取流读取客户端发送过来的数据
        InputStream in = s.getInputStream();//实际上是一个网络流
        
        byte[] buf = new byte[1024];
        
        int len = in.read(buf);
        System.out.println(new String(buf,0,len));
        
        s.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
}

 

============================优雅的分割线============================

上面这两个例子,实现了客户端向服务端发送文本信息,服务端收到并将其打印到控制台。

现在我们再对上面两个程序进行一些改造,让服务端接收到客户端的信息后,打印到控制台,并响应信息给客户端;客户端也将服务端响应的信息打印到控制台:

 

//客户端:

package com.shindo.java.tcp;
import java.io.*;
import java.net.*;

public class TcpClient2 {
    public static void main(String[] args){
        try {
            Socket s = new Socket("127.0.0.1",11012);
            
            //发送文本数据给客户端
            OutputStream out = s.getOutputStream();
            out.write("This's the better TcpClient test Demo".getBytes());
            
            //读取客户端响应信息
            InputStream in = s.getInputStream();
            byte[] buf = new byte[1024];
            int len = in.read(buf);
            System.out.println(new String(buf,0,len));
            
            s.close();
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
View Code

 

//服务端:

package com.shindo.java.tcp;
import java.io.*;
import java.net.*;

public class TcpServer2 {
    public static void main(String[] args){
        try {
            //创建服务端,并监听一个端口
            ServerSocket ss = new ServerSocket(11012);
            Socket s = ss.accept();
            
            //获取请求的客户端ip,并打印控制台
            String ip = s.getInetAddress().getHostAddress();
            System.out.println(ip + "........... is connected");
            
            //获取客户端发送过来的数据,并打印控制台
            InputStream in = s.getInputStream();
            byte[] buf = new byte[1024];
            int len = in.read(buf);
            System.out.println(new String(buf,0,len));
            
            //发送响应信息给客户端
            OutputStream out = s.getOutputStream();
            out.write("welcome, client !".getBytes());
            
            s.close();
            ss.close();
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        
    }
}
View Code

 

效果如下:

客户端接收到服务到响应:

 

服务端接收到客户端发过来的数据:

 

posted @ 2016-03-20 10:36  shindoyang  阅读(526)  评论(0编辑  收藏  举报