接地气讲解TCP协议和网络程序设计(深度好文)

1、TCP接地气解释

TCP协议大家应该了解过吧,中文意思就是传输控制协议。

教科书的理解是这样的,它提供两台计算机之间可靠的数据传送,可以保证数据从一端发送到另一端接收时,数据能准确送达(那就是可靠的意思),而且抵达的数据的排列顺序和送出的顺序相同。教科书果然是教科书啊,听了半天,啥也没懂。

听一下网友的接地气的解释吧。TCP协议就像打电话,A给B打电话,B肯定要先接通电话才能听到A的讲话,这样就能够可靠地把A说的话听清楚,是一对一的关系。这够接地气了吧。这是TCP协议与UDP协议的对比,关于UDP协议下一篇文章解释。

image

2、两个概念(端口和套接字)

端口:一台计算机只有一个连接到网络的物理端口(就是网线接口),一个端口怎么可能够用呢,明显会撞车,所以呢这个物理端口负责接收或者发送数据,而网络程序设计中的端口并非真实存在的,只是假想出来的连接装置。端口被规定为一个0 ~ 65535之间的整数,0 ~ 1023有其他用途,我们不能用了,所以写程序用的端口一定要在1024以上。

套接字(Socket)这个一听就不知道是什么鬼东西,教材解释是用于将应用程序与端口连接起来。还不懂是吧?那就正常啦。其实我们可以这样想,把网络比喻成电路或者电网,把端口比喻成插座,那套接字毫无疑问就是插头了,它跟端口一连接网络就通了,就像插头一插就通电了,其实就是在程序和网络之间起到桥梁的作用,这比喻够形象了吧,还不够的话上图。

image

知道有这个东西存在之后,那怎么用呢?在用之前我们要懂得一个原理(如下图1),两台计算机之间通信是要有一端是服务器,一端是客户端(用户),所以呢套接字也会分服务器套接字(ServerSocket)和客户端套接字(Socket),来看一下各自都有哪些方法可以用:


image

ServerSocket的用法:

ServerSocket server =new ServerSocket(1100);

参数只有一个,就是指定那一个端口,以下是它的方法,调用accept()方法待客户端连接成功后会返回一个Socket对象,这个Socket对象就可以跟客户端的Socket进行通信,具体是通过输入流和输出流来完成通信。比如,服务器的Socket对象使用getOutputStream()方法获取输出流,然后客户端的Socket对象使用getInputStream()获得输入流,这样就完成了服务器向客户端发送消息的功能,反之亦然。


image

Socket的用法:

Socket client =new Socket("192.168.1.1",1100);

第一个参数是要连接的服务器主机ip地址,第二个参数是端口。


image

3、实战
看了这么多理论,是时候来实战一下了,看一个很简单的程序,我会详细讲解这个程序。因为需要一个服务器和客户端,所以我打开了两个eclipse,这里为了省空间,我把导入包的操作都省略了。先来看服务器端:

public class TCP {
public static void main(String[] args) {
    try {
      ServerSocket server =new ServerSocket(1100);//创建服务器套接字
      System.out.println("服务器启动成功,等待用户接入....");
      Socket client=server.accept();  //返回一个Socket对象
      System.out.println("有用户接入,客户端ip是:"+client.getInetAddress());//获取连接服务器的客户端
 
      //获取一个输入流,接受客户端发来的消息
      InputStream in=client.getInputStream();//获取字节输入流
      byte bt[]=new byte[1024];//接收到的是字节流,所以先定义一个字节数组。
      int len=in.read(bt);//从输入流中读取读取字节到字节数组,这个方法会返回一个int值,表示读到的字节长度。
      //把字节数组作为参数创建字符串对象并输出,输出的字节从0到最后一个字节,就是把读到的内容都输出出来。
      System.out.println("客户端发来的消息:"+new String(bt,0,len));
 
      OutputStream out=client.getOutputStream();//获取一个输出流,向客户机发信息
      String message="你好,我是服务器";
      out.write(message.getBytes());//因为输出流是字节流,所以这里把字符串转换为字节形式
 
      client.close();//关闭服务器套接字
    } catch (IOException e) {
      e.printStackTrace();//捕捉异常
    }    
  }
}

具体语句的功能我写到了注释中了,首先是创建一个服务器套接字,它会与服务器的端口连接并等待用户连接,如果此时有客户端连接该服务器,则会在服务器端返回一个Socket套接字,这个时候就完成连接工作了,剩下的就是发送消息了。发送过程具体看注释。我们再来看一下客户端的:

public class TCP {
 public static void main(String[] args) {
 
  try {
    Socket client=new Socket("172.16.176.72",1100);
    System.out.println("连接服务器成功");
 
    OutputStream out=client.getOutputStream();
    String message="你好,我是客户端";
    out.write(message.getBytes());
 
    InputStream in=client.getInputStream();
    byte bt[]=new byte[1024];
    int len=in.read(bt);
    System.out.println("服务器发来的消息:"+new String(bt,0,len));      
 
    client.close();//关闭客户端套接字
  } catch (UnknownHostException e) {
    e.printStackTrace();
  } catch (IOException e) {
    e.printStackTrace();
  }
  }
}

客户端的代码就比较简单了,直接输入ip地址和端口就可以连上服务器了,然后通过输入输出流就可以发送消息了,来看一下效果图:


image

这里需要注意的一点,服务器端的accept()方法会阻塞线程的进行,换句话说就是如果没有客户端连接它会一直等待,后面的语句不会执行,知道连接上为止,就是下面两句。

Socket client=server.accept(); //返回一个Socket对象
System.out.println("有用户接入,客户端ip是:"+client.getInetAddress());//获取连接服务器的客户端

TCP协议搞定。这里给大家支个招,怎么查看电脑的软件占用了那些端口呢?如果之前运行程序可以,后来又不行,很可能就是端口被占用了。在命令行输入:netstat -an (有空格!!)

更多文章请关注我的公众号:计算机技术和网络资源
关注了就可以代下csdn资料!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容