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. 使用Html5下WebSocket搭建简易聊天室

    一.Html5WebSocket介绍 WebSocket protocol 是HTML5一种新的协议(protocol).它是实现了浏览器与服务器全双工通信(full-duplex). 现在,很多网站 ...

  2. SVN分支/合并原理及最佳实践

    转自:http://blog.csdn.net/e3002/article/details/21469437 使用svn几年了,一直对分支和合并敬而远之,一来是因为分支的管理不该我操心,二来即使涉及到 ...

  3. 第 10 章 MySQL Server 性能优化

    前言: 本章主要通过针对MySQL Server(mysqld)相关实现机制的分析,得到一些相应的优化建议.主要涉及MySQL的安装以及相关参数设置的优化,但不包括mysqld之外的比如存储引擎相关的 ...

  4. 关于在Mac OS下安装npm与cnpm的ERR! Darwin 15.0.0解决办法

    mac os安装好了很久了,不过没怎么用,昨天想要体验一下大神们推荐的黑苹果系统用起来怎么样(关于安装黑苹果的可以到我的简书去看相关文章),于是乎,打开久违的vmware,看着咬一口的苹果进度图,心中 ...

  5. 关于python编译的一点小结

    大家都知道python是脚本语言,源码可以直接执行,有时需要提高执行效率或者保密(因为有时候不想让使用人看到源码文件),那就涉及到python编译了,那么该如何做呢? 有两种方法可以做到. 1.一种是 ...

  6. 【JAVAWEB学习笔记】29_文件的上传------commons-fileupload

    今天内容: 文件的上传------commons-fileupload 文件上传和下载的实质:文件的拷贝 文件上传:从本地拷贝到服务器磁盘上   客户端需要编写文件上传表单---->服务端需要编 ...

  7. GLUT Trackball Demo

    GLUT Trackball Demo eryar@163.com 1.Introduction 在三维场景中建立模型后,为了方便用户从各个角度观察模型,从而需要对三维视图进行控制.常见的视图交互控制 ...

  8. Nmap原理-01选项介绍

    Nmap原理-01选项介绍 1.Nmap原理图 Nmap包含四项基本功能:主机发现/端口扫描/版本探测/操作系统探测.这四项功能之间存在大致的依赖关系,比如图片中的先后关系,除此之外,Nmap还提供规 ...

  9. 关于HBuilder的一些使用技巧。

    在HBuilder中一个名为扩展代码块的功能. 扩展代码块 看,它就在上方工具栏的工具选项中,分为自定义html代码块, 自定义js代码块, 自定义css代码块, 自定义jquery代码块. 以下便是 ...

  10. CSS3的使用方法解析

    自己过去有段时间使用CSS3开发过一些小的部件和效果,但是由于太久没有再次去使用,导致当自己再次去使用的时候我就需要去翻手册重新找一次然后按着方法使用才可以. 现在我就把这份CSS3的使用技巧展示给各 ...