您的位置:首页 > 理论基础 > 计算机网络

Tcp通讯协议

2016-03-20 10:36 489 查看
了解了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 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

效果如下:

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



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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: