(29)网络编程之TCP通信协议

TCP通信协议特点:

1tcp协议是基于IO流进行数据的传输,是面向链接的。

2tcp进行数据传输的时候,数据没有大小限制的。

3、面向链接,通过三次握手的机制,保证数据的完整性,是一个可靠的协议。

4tcp面向连接,所以速度稍微慢一点。

5TCP是区分客户端和服务端的。

 

三次握手机制:保证网络畅通

 

比如说,打电话,QQ\FeiQ的文件传输,迅雷下载等

 

TCP通信要掌握Socket相关的两个类

Socket(客户端类):一旦启动马上要与服务端进行建立连接,一般需要传参:服务器的Address和需要端口

SeverSocket(服务端类)

 

tcp的客户端使用步骤:

1、建立我们tcp的客户端的服务

2、获取大对应的流对象。

3、写出或读取数据

4.关闭资源

 

 1 public class Demo1Client
 2 {
 3     public static void main(String[] args) throws IOException, IOException
 4     {
 5         //建立tcp的服务
 6         Socket socket = new Socket(InetAddress.getLocalHost(), 9090);
 7         //获取对应的输出流对象
 8         OutputStream outputStream = socket.getOutputStream();
 9         //利用输出流对象把数据写出即可
10         outputStream.write("服务端你好呀".getBytes());
11         
12         //获取到一个输入流,读取服务端会送的数据
13         InputStream inputStream =  socket.getInputStream();
14         int length = 0;
15         byte[] buf = new byte[1024];
16         length = inputStream.read(buf);
17         System.out.println("这是客户端接收到的数据:"+new String(buf, 0, length));
18         
19         //关闭资源
20         socket.close();
21     }
22 }

 

SeverSocket的使用步骤

1、建立服务端的服务并且监听端口。

2、接受客户端的链接,产生一个socket

3、获取对应的流对象,读取或写出数据。

4、关闭资源。

 

 1 public class Demo1Server
 2 {
 3     public static void main(String[] args) throws Exception
 4     {
 5         //建立TCp的服务端,监听一个端口
 6         ServerSocket serverSocket = new ServerSocket(9090);
 7         //接受客户端的链接
 8         Socket socket =  serverSocket.accept();//aacept() 接受客户端的链接,也是一个阻塞性的方法,没有客户端与之连接时,将一直处于阻塞状态
 9         //获取输入流对象,读取客户端发型内容
10         InputStream inputStream =  socket.getInputStream();
11         byte[] buf = new byte[1024];
12         int length = 0;
13         length = inputStream.read(buf);
14         System.out.println("服务端接受到:"+new String(buf, 0, length));
15         
16         Thread.sleep(600);
17         
18         //获取socket输出流对象,向发送端发出数据
19         OutputStream outputStream =  socket.getOutputStream();
20         outputStream.write("客户端你要呀,我收到了".getBytes());
21         
22         //关闭资源
23         serverSocket.close();
24     }
25 }

 

还是应当先启动服务端,这个样子运行客户端的时候才能有地方链接。

 

示例:基于TCP的一问一答的聊天:

 

 1 //聊天客户端 
 2 public class ChatSender {
 3     public static void main(String[] args) throws IOException{
 4         //建立tcp的客户端的服务
 5         Socket socket = new Socket(InetAddress.getLocalHost(), 9090);
 6         //取出socket的输出流,底层操作的是字节流,我们应当使用的是字符流 所以需要使用 输出字节流的转换流
 7         OutputStreamWriter socketOut = new OutputStreamWriter(socket.getOutputStream());
 8         //获取socket的输入流的对象
 9         BufferedReader socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
10         
11         //获取键盘的输入流对象 一行行的读取数据
12         BufferedReader keyReader = new BufferedReader(new InputStreamReader(System.in));
13         String line = null;
14         //不断的读取键盘录入的数据,并不断的把数据写出
15         while((line = keyReader.readLine())!=null)
16         {
17             //直接写出数据
18             socketOut.write(line+"\r\n");    //这里书名一下为什么要"\r\n"因为readline读取的是一行只有当讲到"\r\n"的时候才会换行
19             socketOut.flush();    //凡是带有字符读取的都有 缓存 有缓存的就要使用flush方法
20             
21             //读取服务端回送的数据
22             line = socketReader.readLine();
23             System.out.println("服务端的数据:"+line);
24             
25         }
26         //关闭资源
27         socket.close();
28     }
29 }
30 //聊天的服务器端
31 public class ChatServer {
32     public static void main(String[] args) throws IOException{
33         //建立tcp的服务器端 biang监听接口
34         ServerSocket serverSocket = new ServerSocket(9090);
35         //接受客户端的客户端的链接 产生一个socket 为下面的接受数据做准备
36         Socket socket = serverSocket.accept();
37         //获取得到socket的输入流对象
38         BufferedReader socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
39         
40         //获取到socket的输出流对象
41         OutputStreamWriter socketOut = new OutputStreamWriter(socket.getOutputStream());
42         
43         //获取建安的输入流对象
44         BufferedReader keyReader = new BufferedReader(new InputStreamReader(System.in));
45         
46         //读取客户端发送的数据
47         String line = null;
48         while((line = socketReader.readLine())!=null)
49         {
50             System.out.println("客户端 的数据:"+line);
51             System.out.println("请输入回送数据");
52             line = keyReader.readLine();
53             socketOut.write(line+"\r\n");
54             socketOut.flush();
55         }
56         //资源
57         serverSocket.close();
58     }
59 }
View Code

 

转载于:https://www.cnblogs.com/OliverZhang/p/6027046.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值