网络应用模式主要有:

  • 主机/终端模式:集中计算,集中管理;
  • 客户机/服务器(Client/Server,简称C/S)模式:分布计算,分布管理;
  • 浏览器/服务器模式:利用Internet跨平台。

www(万维网)就是建立在客户机/服务器模式上,以HTML语言和HTTP协议为基础,能够提供各种Internet服务的信息浏览系统。网络信息放在主机的不同位置,www服务器利用超文本链路链接各项信息。www客户机(浏览器Brower)负责与服务器建立联系,向服务器发送请求,处理HTML超媒体,提供图形用户界面(GUI),显示信息等。

在客户机/服务器工作模式中,在Server端,要准备接受多个Client端计算机的通信。为此,除用IP地址标识Internet上的计算机之外,另还引入端口号,用端口号标识正在Server端后台服务的线程。端口号与IP地址的组合称为网络套接字(socket)。

Java语言在实现C/S模式中,套接字分为两类:

  • 在Server端,ServerSocket类支持底层的网络通信;
  • 在Client端,Socket类支持网络的底层通信。

Server机通过端口(总线I/O地址)提供面向Client机的服务;Server机在它的几个不同端口分别同时提供几种不同的服务。Client接入Server的某一端口,通过这个端口提请Server机为其服务。规定:端口号0~1023供系统专用。例如,HTTP协议在端口80,telnet协议在端口23。端口1024~65535供应用程序使用。

当Client程序和Server程序需要通信时,可以用Socket类建立套接字连接。套接字连接可想象为一个电话呼叫:最初是Client程序建立呼叫,Server程序监听;呼叫完成后,任何一方都可以随时讲话。

双方实现通信有流式socket和数据报式socket两种可选方式:

  • 流式socket是有连接的通信,即TCP(Transmission Control Protocol):每次通信前建立连接,通信结束后断开连接。特点是可以保证传输的正确性、可靠性。
  • 数据报式socket是无连接的通信,即UDP(User Datagram Protocol):将欲传输的数据分成 小包,直接上网发送。无需建立连接和拆除连接,速度快,但无可靠保证。

流式socket在Client程序和Server程序间建立通信的通道。每个socket可以进行读和写两种操作。对于任一端,与对方的通信会话过程是:
建立socket连接,获得输入/输出流,读数据/写数据,通信完成后关闭socket(拆除连接)。流式Socket的通信过程见【例 13-1】。

利用socket的构造方法,可以在客户端建立到服务器的套接字对象:
    Socket(String host,int port):host是服务器的IP地址,port是端口号,这些是预先约定的。
例如,代码:

  1. try{
  2. Socket mySocket = new Socket(“http://www.weixueyuan.net” ,1860);
  3. }catch(IOException e){}

然后,用getInputStream()方法获得输入流,用这个输入流读取服务器放入“线路”的信息;用getOutputStream()方法获得输出流,用这个输出流将信息写入“线路”。

利用ServerSocket的构造方法可以在服务器建立接受客户套接字的服务器套接字对象:

  1. ServerSocket(int port):指定端口号,创建一个ServerSocket对象。端口号port要与客户呼叫的端口号相同。为此,用以下形式代码:
  2. try{
  3. ServerSocket serverSocket = new ServerSocket(1860);
  4. }catch(IOException e){}

服务器端程序在指定的端口监听,当收到Client程序发出的服务请求时,创建一个套接字对象与该端口对应的Client程序通信。例如,执行上述建立服务器套接字对象的代码,确立了对象serverSocket后,就可能它使用accept()方法,得到Socket对象,接收Client程序来自套接字mySocket的信息。如以下代码所示:

  1. try{
  2. Socket sc = serverSocket.accept();//ac是一个Socket对象
  3. }catch(IOException e){}
  4. 要撤销服务,可以关闭Socket对象sc
  5. sc.close();

【例 13-3】C/S模式中的Client端应用程序。这是一个Client端的流式Socket通信的简单实例,代码说明Client端程序的编写方法。例中,Client程序向服务器主机的端口4441提出请求,连接建立后完成对服务器的读写。

  1. import java.io.*;
  2. import java.net.*;
  3. public class Client{
  4. public static void main(String args[]){
  5. String s = null;Socket mySocket;
  6. DataInputStream in = null;DataOutputStream out = null;
  7. try{
  8. mySocket = new Socket(“localhost”,4441);
  9. in = new DataInputStream(mySocket.getInputStream());
  10. out = new DataOutputStream(mySocket.getOutputStream());
  11. out.writeUTF(“good server!”);
  12. while(true){
  13. s = in.readUTF();
  14. if(s==null) break;
  15. else System.out.println(s);
  16. }
  17. mySocket.close();
  18. }catch(IOException e){
  19. System.out.println(“cant connect”);
  20. }
  21. }
  22. }

【例 13-4】与例10.3 Client端应用程序对应的Server端应用程序。程序在4441端口监听,当检测到有客户机请求时,产生一个内为“客户,你好,我是服务器”的字符串输出到客户端。

  1. import java.io.*;import java.net.*;
  2. public class Server{
  3. public static void main(String args[]){
  4. ServerSocket server = null;
  5. Socket you = null;String s = null;
  6. DataOutputStream out = null;
  7. DataInputStream in = null;
  8. try{
  9. server = new ServerSocket(4441);
  10. }catch(IOException e1){
  11. system.out.println(“ERROR:” +e1);
  12. }
  13. try{
  14. you = server.accept();
  15. in = new DataInputStream(you.getInputStream());
  16. out = new DataOutputStream(you. getOutputStream());
  17. while(true){
  18. s = in.readUTF();
  19. if(s!=null) break;
  20. }
  21. out.writeUTF(“客户,你好,我是服务器”);
  22. out.close();
  23. }
  24. catch(IOException e){System.out.println(“ERROR:”+e);}
  25. }
  26. }

为了充分发挥计算机的平行工作能力,可以把套接字连接工作让一个线程完成。当客户端要请求服务器给予服务,或当服务器端接收到一个客户的服务请求,就启动一个专门完成信息通信的线程,在该线程中创建输入输出流,并完成客户端与服务器端的信息交流。

【例 13-5】 将套接字连接工作置于线程的客户端小应用程序。界面在有一个发送信息按纽、一个文本框和一个文本区。客户端应用程序首先与服务器建立套接字连接。使用数据输入流in反复读取服务器放入线路里的信息,将收到的信息在文本区中显示。婐志取的信息是“结束”,则关闭套接字连接,并结束程序。用户也可在文本框输入信息,并按发送信息按钮,则客户端程序利用数据输出流out,将文本框中的内容发送给服务器。

  1. import java.net.*;
  2. import java.io.*;
  3. import java.awt.*;
  4. import javax.swing.*;
  5. import java.awt.event.*;
  6. import java.applet.*;
  7. public class Aclient extends Applet implements Runnable,ActionListener{
  8. JButton button; JTextField textF; JTextArea textA;
  9. Socket socket; Thread thread;
  10. DataInputStream in; DataOutputStream out;
  11. public void init(){
  12. setBackground(new Color(120,153,137));
  13. setLayout(new BorderLayout());
  14. Button = new JButton(“发送信息”);
  15. textF = new JTextField(20);
  16. textA = new JTextArea(20,30);
  17. setSize(450,350);
  18. JPanel p = new JPanel();
  19. p.add(textF); p.add(button);
  20. add(textA,”Center”); add(p,”South”);
  21. button.addActionListener(this);
  22. }
  23. public void start(){
  24. try{
  25. socket = new Socket(this.getCodeBase().getHost(),4441);
  26. in = new DataInputStream(socket.getInputStream());
  27. out = new DataOutputStream(socket.getOutputStream());
  28. }catch(IOException e){}
  29. if(thread==null){
  30. thread = new Thread(this);
  31. thread.setPriority(Thread.MIN_PRIORITY);
  32. thread.start();
  33. }
  34. }
  35. public void run(){
  36. String s = null;
  37. while(true){
  38. try{
  39. s = in.readUTF();
  40. }catch(IOException e){}
  41. if(s.equals(“结束”)){
  42. try{
  43. socket.close();break;
  44. }catch(IOException e){}
  45. }else texA.append(s + \n”);
  46. }
  47. }
  48. public void actionPerformed(ActionEvent e){
  49. if(e.getSource()==button){
  50. String s = textF.getText();
  51. if(s! = null){
  52. try{
  53. out.writeUTF(s);
  54. }catch(IOException e1){}
  55. }
  56. else{
  57. try{
  58. out.writeUTF(“请说话”);
  59. }
  60. catch(IOException e1){}
  61. }
  62. }
  63. }
  64. }

【例 13-6】对应例10.5客户端小应用程序的服务器端小应用程序。程序以端4441建立与客户端的套接字连接,服务器端收到客户端的申请后,以客户的套接字建立一个线程,并启动。如果没有客户申请,则继续监听客户的申请。线程按客户的套接字建立输入数据流in和输数据流out。线程利用in读取客户放入线路里的信息。如果接受的信息是“结束”,则服务器回复“结束”后关闭套接字连接;否则回复:“我是服务器你对我说“,以及服务器接收到的信息。

  1. import java.net.*;
  2. import java.io.*;
  3. import java.awt.*;
  4. import javax.swing.*;
  5. import java.awt.event.*;
  6. import java.applet.*;
  7. public class Aclient extends Applet implements Runnable,ActionListener{
  8. JButton button; JTextField textF; JTextArea textA;
  9. Socket socket; Thread thread;
  10. DataInputStream in; DataOutputStream out;
  11. public void init(){
  12. setBackground(new Color(120,153,137));
  13. setLayout(new BorderLayout());
  14. Button = new JButton(“发送信息”);
  15. textF = new JTextField(20);
  16. textA = new JTextArea(20,30);
  17. setSize(450,350);
  18. JPanel p = new JPanel();
  19. p.add(textF); p.add(button);
  20. add(textA,”Center”); add(p,”South”);
  21. button.addActionListener(this);
  22. }
  23. public void start(){
  24. try{
  25. socket = new Socket(this.getCodeBase().getHost(),4441);
  26. in = new DataInputStream(socket.getInputStream());
  27. out = new DataOutputStream(socket.getOutputStream());
  28. }catch(IOException e){}
  29. if(thread==null){
  30. thread = new Thread(this);
  31. thread.setPriority(Thread.MIN_PRIORITY);
  32. thread.start();
  33. }
  34. }
  35. public void run(){
  36. String s = null;
  37. while(true){
  38. try{
  39. s = in.readUTF();
  40. }catch(IOException e){}
  41. if(s.equals(“结束”)){
  42. try{
  43. socket.close();break;
  44. }catch(IOException e){}
  45. }else texA.append(s + \n”);
  46. }
  47. }
  48. public void actionPerformed(ActionEvent e){
  49. if(e.getSource()==button){
  50. String s = textF.getText();
  51. if(s! = null){
  52. try{
  53. out.writeUTF(s);
  54. }catch(IOException e1){}
  55. }
  56. else{
  57. try{
  58. out.writeUTF(“请说话”);
  59. }catch(IOException e1){}
  60. }
  61. }
  62. }
  63. }

系列文章:

Java知多少(105)套接字(Socket)的更多相关文章

  1. [置顶] Java套接字Socket编程

    1)概念 网络编程基本模型就客户端到服务器的模型,也就是我们常见的C/S模型.简单的说就是两个进程间相互通信的过程.即通信双方一方作为服务器等待客户端提出请求并给以回应,另一方作为客户端向服务器提出请 ...

  2. Java网络编程--套接字Socket

    一.套接字Socket IP地址标志Internet上的计算机,端口号标志正在计算机上运行的进程(程序). 端口号被规定为一个16位的0--65535之间的整数,其中,0--1023被预先定义的服务通 ...

  3. Java套接字Socket编程--TCP参数

    在Java的Socket中,主要包含了以下可设置的TCP参数. 属性 说明 默认值 SO_TIMEOUT 对ServerSocket来说表示等待连接的最长空等待时间; 对Socket来说表示读数据最长 ...

  4. think in java 读书笔记 2 —— 套接字

    目录 think in java 读书笔记 1 ——移位 think in java 读书笔记 2 —— 套接字 think in java 读书笔记 3 —— 数据报 概要 1. 套接字基本知识 2 ...

  5. java网络编程(套接字)

    套接字是java提供一套进行网络通信的API---TCP/UDP: ISO七层模型 物理层 .数据链路层 .传输层-IP. 网络层-UDP/TCP .会话层 . 表示层. 应用层 ---HTTP FT ...

  6. 网络编程 套接字socket TCP UDP

    网络编程与套接字 网络编程 网络编程是什么: ​ 网络通常指的是计算机中的互联网,是由多台计算机通过网线或其他媒介相互链接组成的 ​ 编写基于网络的应用程序的过程序称之为网络编程. 网络编程最主要的工 ...

  7. Linux进程间通信(八):流套接字 socket()、bind()、listen()、accept()、connect()、read()、write()、close()

    前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进程.通常我们使用socket进行网络编 ...

  8. Linux进程间通信(九):数据报套接字 socket()、bind()、sendto()、recvfrom()、close()

    前一篇文章,Linux进程间通信——使用流套接字介绍了一些有关socket(套接字)的一些基本内容,并讲解了流套接字的使用,这篇文章将会给大家讲讲,数据报套接字的使用. 一.简单回顾——什么是数据报套 ...

  9. 套接字socket 的地址族和类型、工作原理、创建过程

    注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好 ...

  10. 套接字编程,创建套接字socket

    1.套接字地址结构: struct sockaddr { sa_family_t sa_family; char sa_data[14]; }; 其中,成员sa_family表示套接字的协议族类型,对 ...

随机推荐

  1. atitit.js 各版本 and 新特性跟浏览器支持报告

    atitit.js 各版本 and 新特性跟浏览器支持报告 一个完整的JavaScript实现是由以下3个不同部分组成的 •核心(ECMAScript)--JavaScript的核心ECMAScrip ...

  2. TF Boys (TensorFlow Boys ) 养成记(三)

    上次说到了 TensorFlow 从文件读取数据,这次我们来谈一谈变量共享的问题. 为什么要共享变量?我举个简单的例子:例如,当我们研究生成对抗网络GAN的时候,判别器的任务是,如果接收到的是生成器生 ...

  3. js中的eval()和catch()

    定义和用法 eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码. 语法 eval(string) 参数 描述 string 必需.要计算的字符串,其中含有要计算的 Java ...

  4. js系列(10)js的运用(二)

        本节继续介绍在html页面中js的运用.   (1)数码时钟:(http://files.cnblogs.com/files/MenAngel/text05.zip) <!DOCTYPE ...

  5. php三种基础算法:冒泡,插入和快速排序法

    $array = array(2,3,5,6,9,8,1); //冒泡排序思想,前后元素比较 function sort_bulldle($array){ $num = count($array); ...

  6. 苹果App部署HTTPS进行在线下载安装

    苹果App的ipa下载需要有几个前提,可参考:Android和IOS的本地App如何安装(apk&ipa) 本文主要介绍如何部署https提供ipa的下载,步骤如下: 1. 搭建一个HTTPS ...

  7. 招聘:web前端开发(中级、高级均可)

    web前端开发(中级.高级均可) 工作地点:广东-深圳 工作年限:2年 学历要求:本科 招聘分类:前端开发工程师 工资范围:面议 招聘人数:3 发布日期:2014/07/29 截止日期:2014/08 ...

  8. 软件设计之UML—UML的构成[上]

      UML是一种通用的建模语言,其表达能力相当的强,不仅可以用于软件系统的建模,而且可用于业务建模以及其它非软件系统建模.UML综合了各种面向对象方法与表示法的优点,至提出之日起就受到了广泛的重视并得 ...

  9. Md5加密方法

    package com.atguigu.surveypark.util; import java.security.MessageDigest; /** * 数据 */ public class Da ...

  10. 网站用域名能访问,用域名IP不能访问的原因分析

    原因分析:一般虚拟主机是不能直接输入IP进行访问的 因为一个IP下有很多网站 ,只能用域名进行访问.如果想IP也能访问,必须网站有独立的IP地址,不是共享IP.如果是IIS的话,要把主机头对应的域名去 ...