网络通信珠玑(一)

    网络编程的目的是指直接或间接地通过网络协议与其他计算机进行通信。网络编程中有两个主要的问题,一个是如何准确的定位网络上的主机,另一个就是找到主机后如何可靠高效的进行数据传输。

    在TCP/IP协议中IP层主要负责网络主机的定位,由IP地址可以唯一地确定Internet上的一台主机。而TCP层则提供面向应用的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。

C/S结构(Client /Server)

    网络程序的通信双方:一方作为服务器(Server)等待客户(Client)提出请求并予以响应。客户则在需要服务时向服务器提出申请。

    服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也能及时得到服务。

C/S结构图及相关概念

网络基础知识

    IP地址:标识计算机等网络设备的网络地址,由四个8位的二进制数组成

    主机名(hostname):网络地址的助记名,按照域名进行分级管理。如:www.sina.com.cn

    端口号(port):网络通信时同一机器上的不同进程(运行的程序)的标识。

    服务类型(service):网络的各种服务,它们使用不同的端口号。如:http(80), telnet(23), ftp(21), smtp(25)。

    通常一台主机上总是有很多个进程需要网络资源进行网络通讯。网络通讯的对象准确的讲不是主机,而应该是主机中运行的进程。这时候光有主机名或IP地址来标识这么多个进程显然是不够的。端口号就是为了在一台主机上提供更多的网络资源而采取得一种手段,也是TCP层提供的一种机制。只有通过主机名或IP地址和端口号的组合才能唯一的确定网络通信中的进程。

    服务类型(Service)是那些已经被标准化了的网络应用(如HTTP、FTP等等)。程序员可以编写自己的基于网络的服务器,但不能被称作标准的服务类型,也不能使用被标准服务类型占用的端口号。

    端口号为一个0~65535之间的整数,而0~1023已被系统预先占用,程序员编写网络程序应使用1024~65535的端口来进行通信。

编写TCP的网络程序

    建立客户与服务器之间的连接:指的是客户进程与服务器进程之间的逻辑连接,用Socket(套接字)实现。

    实现客户与服务器之间的通信:指的是客户进程与服务器进程之间的数据传递,用Socket的流对象实现。

    使用Socket进行TCP网络编程,一般包含以下四个基本步骤:

    (1)创建Socket,实现连接;

    (2)打开连接到Socket的输入/输出流;

    (3)对Socket进行读/写操作;

    (4)关闭Socket。


利用Socket上的IO流进行数据传递

附:一个简单的TCP通信Demo:

//server.java

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

public class Server {

public static void main(String[] args) {

    try {

        ServerSocket s = new ServerSocket(9000);

        System.out.println("服务已经开启,等待客户来访问!");

        Socket socket = s.accept();//阻塞方法

        System.out.println("接受到"+socket.getInetAddress().getHostAddress()+"的访问!");

        BufferedReader br = new BufferedReader(

                                        new InputStreamReader(socket.getInputStream()));

        BufferedReader br1 = new BufferedReader(

                                        new InputStreamReader(System.in));

        PrintWriter pw = new PrintWriter(socket.getOutputStream(),true);

        while(true){

            String str = br.readLine();//从socket的管道中读客户端发过来的数据

            System.out.println(str);//打印到控制台

            String str1 = br1.readLine();//从键盘读数据

            if("exit".equals(str1))break;

            pw.println(str1);//写给客户端  写到socket的管道里

        }

    } catch (Exception e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

        }

    }

}

//Client.java

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.Socket;

public class Client {

    public static void main(String[] args) {

        try {

            Socket socket = new Socket("127.0.0.1",9000);

            BufferedReader br = new BufferedReader(

            new InputStreamReader(System.in));

            PrintWriter pw = new PrintWriter(socket.getOutputStream(),true);

            BufferedReader br1 = new BufferedReader(

                                            new InputStreamReader(socket.getInputStream()));

            while(true){

                String str = br.readLine();//从客户端键盘读数据

                if("exit".equals(str))break;

                pw.println(str);//写给服务器  写到了socket得管道里

                String str1 = br1.readLine();//从socket管道里读服务端发过来的数据

                System.out.println(str1);//打印到控制台

            }

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}

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

推荐阅读更多精彩内容

  • 废话不多说,自己进入今天的主题 1、面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: - 抽象:...
    传奇内服号阅读 2,344评论 1 31
  • 小编费力收集:给你想要的面试集合 1.C++或Java中的异常处理机制的简单原理和应用。 当JAVA程序违反了JA...
    八爷君阅读 4,585评论 1 114
  • 耶稣回答说:″若不是从上头赐给你的,你就毫无权柄办我″。(约19:11)一个信靠顺服神的人在生活中遇到的事,没有一...
    谷中百合3531阅读 3,194评论 0 0
  • SDWebImage源码解读与学习(一)我写的这篇文章已经详细介绍了SDWebImage框架中所有的核心类和具体作...
    FlyOceanFish阅读 210评论 0 0