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

//服务端:

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

效果如下:

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

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

Tcp通讯协议的更多相关文章

  1. java基础55 UDP通讯协议和TCP通讯协议

    本文知识点(目录): 1.概述    2.UDP通讯协议    3.TCPP通讯协议 1.概述 1.在java中网络通讯作为Socket(插座)通讯,要求两台都必须安装socket.    2.不同的 ...

  2. C#中的TCP通讯与UDP通讯

    最近做了一个项目,主要是给Unity3D和实时数据库做通讯接口.虽然方案一直在变:从开始的UDP通讯变为TCP通讯,然后再变化为UDP通讯;然后通讯的对象又发生改变,由与数据库的驱动进行通讯(主动推送 ...

  3. 异常和TCP通讯

    第七章 异常处理 * 异常处理机制中的try-catch * 语法: * try{ * 代码片段 * }catch(XXXException e){ * 当try中的代码片段出现了XXXExcepti ...

  4. GCDAsyncSocket类库,IOS下TCP通讯使用心得

    关于在IOS下使用Socket进行通讯的技术文章也许诺很久了,今日又是一个还债的日子,网上虽然很多介绍过AsyncSocket或GCDAsyncSocket的文章,但其实就那么一两篇大部分都是转载,于 ...

  5. TCP/IP 中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议

    原文地址:http://hi.baidu.com/albyuyrgqgbbhoq/item/65006d2d002ab33195f62ba1 TCP/IP(Transmission Control P ...

  6. QQ--基于TCP/UDP协议的通讯原理

    QQ是一个基于TCP/UDP协议的通讯软件  发送消息的时候是UDP打洞,登陆的时候使用HTTP~因为登陆服务器其实就是一个HTTP服 务器,只不过不是常用的那些,那个服务器是腾讯自行开发的!   一 ...

  7. JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用

    JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例, ...

  8. linux shell 脚本实现tcp/upd协议通讯(重定向应用)

    linux shell 脚本实现tcp/upd协议通讯(重定向应用) http://www.cnblogs.com/chengmo/archive/2010/10/22/1858302.html

  9. Shell 脚本实现TCP/UDP协议通讯

    Shell 脚本实现TCP/UDP协议通讯 http://www.cnblogs.com/occult/archive/2012/12/25/2832183.html  

随机推荐

  1. 手动同步chrome浏览器

    chrome浏览器每次设置好的标签在重新开机后都会变回设置前的状态,崩溃,每次设置好后还是手动同步一下吧. 1. 点击 工具(右上角的三个点)-->设置 2. 点击 高级同步设置 3. 点击 使 ...

  2. SqlCommand和SqlDataAdapter有什么区别

    因为DataSet是离线的,所以SqlDataAdapter这个对象是连接DataSet和数据库的桥梁,所有对DataSet的操作(填充,更新等)都要通过他 ado.net数据访问有两种方式: 1.离 ...

  3. Android SDK离线安装

    Android SDK离线安装是本文要介绍的内容,主要是来了解并学习Android SDK安装的内容,具体关于Android SDK是如何离线安装的内容来看本文详解. Android开发环境,完整的说 ...

  4. MessageDigest 类

    MessageDigest 类    MessageDigest 类是一个引擎类,它是为了提供诸如 SHA1 或 MD5 等密码上安全的报文摘要功能而设计的.密码上安全的报文摘要可接受任意大小的输入( ...

  5. sqlserver2005重新安装(安装汇编错误,安装程序无法连接到数据库服务进行服务配置)

    2014-01-09 16:41 1687人阅读 评论(1) 收藏 举报 分类: 数据库(1) 版权声明:本文为博主原创文章,未经博主允许不得转载. sqlserver2005重新安装(安装汇编错误, ...

  6. C#按钮打开浏览器,网址

    1.加入 using System.Diagnostics; 2. private void button_main_baidu_Click(object sender, EventArgs e) { ...

  7. string 与char* char[]之间的转换

    1.首先必须了解,string可以被看成是以字符为元素的一种容器.字符构成序列(字符串).有时候在字符序列中进行遍历,标准的string类提供了STL容器接口.具有一些成员函数比如begin().en ...

  8. Linux - SSH - Password-less login - generate public key - migrate data without password between two VM servers

    SUMMARY:two server : A , Bsource server : Adestination server : Bthe steps of migrate data from A to ...

  9. NSThread 、NSRunLoop 和 Dispatch Queue

     iOS多线程编程中,NSOperation和NSOperationQueue无疑是最常用的,它们能满足绝大部分情况下的线程操作.但在完成一些特殊的任务时,我们还是要使用的NSThread和NSRun ...

  10. linux中查找命令find、locate、whereis、which、type区别

    linux中查找命令find.locate.whereis.which.type区别 1. find Java代码 find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件.与查询数据库(/ ...