1、Socket:英文意思插座。两个Java应用程序可以通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个Socket。
2、Socket通常用来实现client-server(客户端与服务器)连接。
3、java.net包中定义的两个类Socket和ServerSocket,分别用来实现双向连接的client客户端和server服务器端。
4、建立连接时所需的寻址信息为远程计算机的IP地址和端口号。
5、端口号:区分一台机器上不同的应用程序,在计算机内部两个字节(65536个端口号),一个应用可能占多个端口号。每个端口号只能被一个应用程序占用,自己用端口的时候,用1024以上的,因为1024以下的可能会被操作系统征用。http协议的默认端口是80.
6、端口号又分为TCP端口和UDP端口,两类端口各有65536个端口号。
7、写网络编程代码时需要注意:
     (1)首先启Server,再启Client。写的时候要Server和Client一起写。
     (2)ServerSocket是阻塞性质的,要等到client连接才会停止等待。
     (3)网络通讯过程:
        a. Server端new一个ServerSocket 对象,往往在new ServerSocket的时候要给它一个端口号。启动监听,然后等待客户端的连接。
               import java.net.*;
               public class TcpServer{
                      public static void main(String args[]) throws Exception{
                      ServerSocket ss = new ServerSocket(6666);
                  }
                } 
      注意:自定义的Java类的名字不能和Java虚拟机提供的类名相同,否则不能编译通过。用dos命令编译java文件时,java文件名称必须和文件中的class名称相同。
      b. Client端new一个Socket对象,在new的时候给一个服务器端的IP地址和服务器端的端口号。client的端口是系统随机选一个就可以了,一旦和服务器端建立起连接,这个端口就归这一对服务器和客户所用了(Client 申请连接) 。Client 申请连接后,server端不一定接收,接收用accept方法。
                import java.net.*;
                public class TcpClient{
                     public static void main(String args[]) throws Exception{
                     Socket s = new Socket("127.0.0.1",6666);
                     }
                 }
      c. Server端调用accept方法接收客户端的连接申请,返回一个Socket对象,专门用于和发请求的那一个客户端进行对话。如果有其他的客户端再发来请求,再建立连接,则Server端再次调用accept()方法,产生一个新的Socket对象,用于和新的客户端通讯。
                import java.net.*;
                public class TcpServer{
                     public static void main(String args[]) throws Exception{
                           ServerSocket ss = new ServerSocket(6666);
                           Socket s = ss.accept();    
                     }
                }
      目前为止的写法Server只能连一个Client,连接一个新Client时,必须重新启Server。为了实现多个客户端连接同一个Server,通常将Server的accept()方法和其他操作放在while(true)里。
                import java.net.*;
                public class TcpServer{
                    public static void main(String args[]) throws Exception{
                      ServerSocket ss = new ServerSocket(6666);
                      while(true){
                           Socket s = ss.accept();
                           System.out.println("a new connection");
                      }
                   }
                }
        这样就可以启一个Server供多个Client连接。
        d. Server端和Client通过管道(流 )来说话
               client端说话用输出流:
               import java.net.*;
               import java.io.*;
               public class TcpClient{
                   public static void main(String args[]) throws Exception{
                       Socket s = new Socket("127.0.0.1",6666);
                       OutputStream os = s.getOutputStream();
                       DataOutputStream dos = new DataOutputStream(os);
                       Thread.sleep(30000);//睡眠30秒,如果这30秒之间有另一个客户端连接这个server,则连不上,会一直等待上一个客户端说话结束后或者30秒后才能连上。
                       dos.writeUTF("hello server");//以UTF-8的编码格式写字符串
                       dos.flush();
                       dos.close();
                       s.close();
                   }
              } 
        server端用输入流接收:
             import java.net.*;
             import java.io.*;
             public class TcpServer{
                   public static void main(String args[]) throws Exception{
                         ServerSocket ss = new ServerSocket(6666);
                         while(true){
                                              Socket s = ss.accept();
                                              System.out.println("a new connection");
                                              InputStream is = s.getInputStream();
                                              DataInputStream dis = new DataInputStream(is);
                                              System.out.println(dis.readUTF());
                                              dis.close();
                                               s.close();
                           }
                    }
               }
      注:readUTF也是阻塞式的,它会一直等到对方写东西过来才会继续执行,如果客户端一直不写东西过来,server端会一直等待,直到客户端写了东西过来,期间不能接受其他客户端。
      目前为止学到的是同步式的,阻塞式的效率低;java提供异步式网络编程,效率会更高。

网络编程学习笔记(二)基于TCP的Socket编程的更多相关文章

  1. 网络编程学习笔记:linux下的socket编程

    socket是进程通信的一种方式,通过调用一些API可以实现进程间通信,建立连接以及收发信息的过程如下图所示: 这些函数的用法如下: 1.int socket(int protocolFamily, ...

  2. (1)线程的同步机制 (2)网络编程的常识 (3)基于tcp协议的编程模型

    1.线程的同步机制(重点)1.1 基本概念 当多个线程同时访问同一种共享资源时可能会造成数据的覆盖和不一致等问题,此时就需要对线程之间进行协调和通信,该方式就叫线程的同步机制. 如: 2003年左右 ...

  3. (1)网络编程的常识 (2)基于tcp协议的编程模型 (3)tcp协议和udp协议的比较 (4)基于udp协议的编程模型

    1.网络编程的常识 目前主流的网络通讯软件有:微信.QQ.YY.陌陌.探探.飞信.阿里旺旺.... 在吗? 1.1 七层网络模型(熟悉) 为了保证数据传递的可靠安全等等,ISO(国际标准委员会组织)将 ...

  4. Winfrom 基于TCP的Socket 编程

    基于TCP的Socket基础例子 服务端的代码 public partial class Form1 : Form { public Form1() { InitializeComponent(); ...

  5. 网络协议学习笔记(二)物理层到MAC层,交换机和VLAN,ICMP与ping原理

    概述 之前网络学习笔记主要讲解了IP的诞生,或者说整个操作系统的诞生,一旦有了IP,就可以在网络的环境里和其他的机器展开沟通了.现在开始给大家讲解关于网络底层的相关知识. 从物理层到MAC层:如何在宿 ...

  6. 网络协议学习笔记(五)套接字Socket

    概述 前面学习网络知识的时候写过一篇关于套接字的随笔见<JAVA SOCKET 详解>,现在本人正在系统的学习网络知识,现在除了温故知新之外,在详细的学习记录一下套接字的知识. Socke ...

  7. 【转/TCP协议编程】 基于TCP的Socket 编程

    基于TCP(面向连接)的socket编程,分为客户端和服务器端. 客户端的流程如下: (1)创建套接字(socket) (2)向服务器发出连接请求(connect) (3)和服务器端进行通信(send ...

  8. Java基于TCP的Socket编程练习

    环境:Notpad ++ 6.0 + JDK 6.0.31 问题:使用套接字编写客户-服务器程序,实现客户-服务器交互计算.客户将三角形3个边的长度发给服务器,服务器把计算出的三角形的面积返回给客户. ...

  9. STM32学习笔记(二) 基于STM32-GPIO的流水灯实现

    学会了如何新建一个工程模板,下面就要开始动手实践了.像c/c++中经典的入门代码"hello world"一样,流水灯作为最简单的硬件设备在单片机领域也是入门首推.如果你已经有了一 ...

随机推荐

  1. php如何应对秒杀抢购高并发思路

    我们常用QPS(Query Per Second,每秒处理请求数)来衡量一个web应用的吞吐率,解决每秒数万次的高并发场景,这个指标非常关键. 举个栗子:假设一个业务请求平均为100ms,同时系统内有 ...

  2. CollectioView滚动到指定section的方法

    项目中的需求:collectionView顶部有一个scrollView组成的标签,点击标签,让collectionView滚动到指定的行,滚动collectionView自动切换到顶部指定的标签 实 ...

  3. STM32的RFID射频读写控制装置

    ,大二上学期做的,过了很久,先上一下图: 这并不是做个最后一版:主体是RC552+STM32+1062:蜂鸣器,继电器,LED等:反正最后的效果就是,刷一下卡,1602显示一下持卡人(需要提前注册,注 ...

  4. ASP.NET Core MVC 模型绑定用法及原理

    前言 查询了一下关于 MVC 中的模型绑定,大部分都是关于如何使用的,以及模型绑定过程中的一些用法和概念,很少有关于模型绑定的内部机制实现的文章,本文就来讲解一下在 ASP.NET Core MVC ...

  5. 测评:华为最新移动应用/APP测试工具MobileTest

    一.目前移动应用/App的测试痛点及可选方案 移动互联网市场进入下半场,同质化竞争激烈,平均获客成本增加.屏幕不适配.闪退.无响应.UI异常等兼容性问题严重影响用户体验,影响用户转化率和用户粘性.如何 ...

  6. 有趣而又被忽略的Unity技巧

    0x00 前言 本文的内容主要来自YouTube播主Brackeys的视频TOP 10 UNITY TIPS 和TOP 10 UNITY TIPS #2.在此基础上经过自己的实践和筛选之后,选择了几个 ...

  7. QT调用百度语音REST API实现语音合成

    QT调用百度语音REST API实现语音合成 1.首先点击点击链接http://yuyin.baidu.com/docs/tts 点击access_token,获取access_token,里面有详细 ...

  8. CSS3学习系列之选择器(二)

    first-child选择器和last-child选择器 first-child指定第一个元素.last-child指定最后一个子元素. 例如: <!DOCTYPE html> <h ...

  9. CSS浮动、绝对、相对定位

    浮动 float:属性{ float:none;    默认值,对象,不漂浮 float:left; 文本流向对象的右边 float:right; }; 清除浮动 clear:属性{ clear:no ...

  10. js中运动框架的封装

    //获取非行间样式的封装 function setStyle(obj,name){ // 考虑兼容性问题 if(obj.currentStyle){//不兼容火狐和谷歌 return obj.curr ...