当前位置 : IT培训网 > Java开发 > Java教程 > Java编程开发之套接字(Socket)

Java编程开发之套接字(Socket)

时间:2016-09-06 16:05:43  来源:Java培训网  作者:IT培训网  已有:名学员访问该课程
www(万维网)就是建立在客户机/服务器模式上,以HTML语言和HTTP协议为基础,能够提供各种Internet服务的信息浏览系统。网络信息放在主机的不同位置,www服务器利用超文本链路链接各项信息。www客户机(浏览器Brower)负责与服务器

什么是套接字(Socket)

套接字,是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。

非常非常简单的举例说明下:Socket=Ip address+ TCP/UDP + port。

源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字。其用于标识客户端请求的服务器和服务。

它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

网络应用模式主要有:

主机/终端模式:集中计算,集中管理;

客户机/服务器(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是端口号,这些是预先约定的。

例如,代码:

try{

Socket mySocket = new Socket(“http://www.itpxw.cn” ,1860);

}catch(IOException e){}

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

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

ServerSocket(int port):指定端口号,创建一个ServerSocket对象。端口号port要与客户呼叫的端口号相同。为此,用以下形式代码:

try{

ServerSocket serverSocket = new ServerSocket(1860);

}catch(IOException e){}

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

try{

Socket sc = serverSocket.accept();//ac是一个Socket对象

}catch(IOException e){}

要撤销服务,可以关闭Socket对象sc:

sc.close();

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

import java.io.*;

import java.net.*;

public class Client{

    public static void main(String args[]){

        String s = null;Socket mySocket;

        DataInputStream in = null;DataOutputStream out = null;

        try{

            mySocket = new Socket(“localhost”,4441);

            in = new DataInputStream(mySocket.getInputStream());

            out = new DataOutputStream(mySocket.getOutputStream());

            out.writeUTF(“good server!”);

            while(true){

                s = in.readUTF();

                if(s==null) break;

                else System.out.println(s);

            }

            mySocket.close();

        }catch(IOException e){

            System.out.println(“can’t connect”);

        }

    }

}

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

import java.io.*;import java.net.*;

public class Server{

    public static void main(String args[]){

        ServerSocket server = null;

        Socket you = null;String s = null;

        DataOutputStream out = null;

        DataInputStream in = null;

        try{

            server = new ServerSocket(4441);

        }catch(IOException e1){

            system.out.println(“ERROR:” +e1);

        }

        try{

            you = server.accept();

            in = new DataInputStream(you.getInputStream());

            out = new DataOutputStream(you. getOutputStream());

            while(true){

                s = in.readUTF();

                if(s!=null) break;

            }

            out.writeUTF(“客户,你好,我是服务器”);

            out.close();

        }

        catch(IOException e){System.out.println(“ERROR:”+e);}

    }

}

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

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

import java.net.*;

import java.io.*;

import java.awt.*;

import javax.swing.*;

import java.awt.event.*;

import java.applet.*;

public class Aclient extends Applet implements Runnable,ActionListener{

    JButton button; JTextField textF; JTextArea textA;

    Socket socket; Thread thread;

    DataInputStream in; DataOutputStream out;

    public void init(){

        setBackground(new Color(120,153,137));

        setLayout(new BorderLayout());

        Button = new JButton(“发送信息”);

        textF = new JTextField(20);

        textA = new JTextArea(20,30);

        setSize(450,350);

        JPanel p = new JPanel();

        p.add(textF); p.add(button);

        add(textA,”Center”); add(p,”South”);

        button.addActionListener(this);

    }

    public void start(){

        try{

            socket = new Socket(this.getCodeBase().getHost(),4441);

            in = new DataInputStream(socket.getInputStream());

            out = new DataOutputStream(socket.getOutputStream());

        }catch(IOException e){}

        if(thread==null){

            thread = new Thread(this);

            thread.setPriority(Thread.MIN_PRIORITY);

            thread.start();

        }

    }

    public void run(){

        String s = null;

        while(true){

            try{

                s = in.readUTF();

            }catch(IOException e){}

            if(s.equals(“结束”)){

                try{

                    socket.close();break;

                }catch(IOException e){}

            }else texA.append(s + “\n”);

        }

    }

    public void actionPerformed(ActionEvent e){

        if(e.getSource()==button){

            String s = textF.getText();

            if(s! = null){

                try{

                    out.writeUTF(s);

                }catch(IOException e1){}

            }

            else{

                try{

                    out.writeUTF(“请说话”);

                }

                catch(IOException e1){}

            }

        }

    }

}

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

import java.net.*;

import java.io.*;

import java.awt.*;

import javax.swing.*;

import java.awt.event.*;

import java.applet.*;

public class Aclient extends Applet implements Runnable,ActionListener{

    JButton button; JTextField textF; JTextArea textA;

    Socket socket; Thread thread;

    DataInputStream in; DataOutputStream out;

    public void init(){

        setBackground(new Color(120,153,137));

        setLayout(new BorderLayout());

        Button = new JButton(“发送信息”);

        textF = new JTextField(20);

        textA = new JTextArea(20,30);

        setSize(450,350);

        JPanel p = new JPanel();

        p.add(textF); p.add(button);

        add(textA,”Center”); add(p,”South”);

        button.addActionListener(this);

    }

    public void start(){

        try{

            socket = new Socket(this.getCodeBase().getHost(),4441);

            in = new DataInputStream(socket.getInputStream());

            out = new DataOutputStream(socket.getOutputStream());

        }catch(IOException e){}

        if(thread==null){

            thread = new Thread(this);

            thread.setPriority(Thread.MIN_PRIORITY);

            thread.start();

        }

    }

    public void run(){

        String s = null;

        while(true){

             try{

                s = in.readUTF();

            }catch(IOException e){}

            if(s.equals(“结束”)){

                try{

                    socket.close();break;

                }catch(IOException e){}

            }else texA.append(s + “\n”);

        }

    }

    public void actionPerformed(ActionEvent e){

        if(e.getSource()==button){

            String s = textF.getText();

            if(s! = null){

                try{

                    out.writeUTF(s);

                }catch(IOException e1){}

            }

            else{

                try{

                    out.writeUTF(“请说话”);

                }catch(IOException e1){}

            }

       }

    }

}

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
------分隔线----------------------------
Java教程
1、Java 概述
1.1 Java语言概述
1.2 Java虚拟机以及跨平台原理
1.3 Java的主要就业方向
1.4 Java的不同版本
1.5 Java开发环境搭建
1.6 第一个Java程序示例
1.7 Java类和对象的概念
1.8 Java类库及其组织结构
1.9 Java import
2、Java 语法基础
2.1 Java数据类型以及变量的定义
2.2 Java数据类型转换
2.3 Java运算符
2.4 Java流程控制
2.5 Java数组的定义和使用
2.6 Java字符串(String)
2.7 Java StringBuffer与StringBuider
2.8 强调一下编程风格
3、Java 类与对象
3.1 Java类的定义及其实例化
3.2 Java访问修饰符
3.3 Java变量的作用域
3.4 Java this关键字详解
3.5 Java方法重载
3.6 Java类的基本运行顺序
3.7 Java包装类、拆箱和装箱详解
3.8 再谈Java包
3.9 源文件的声明规则
4、Java 继承和多态
4.1 继承的概念与实现
4.2 Java super关键字
4.3 继承中的方法的覆盖和重载
4.4 多态和动态绑定
4.5 instanceof 运算符
4.6 多态对象的类型转换
4.7 Java static关键字
4.8 Java final关键字
4.9 Java Object类
5、面向对象高级特性
5.1 Java内部类及其实例化
5.2 内部类的分类
5.3 抽象类的概念和使用
5.4 接口的概念和使用
5.5 接口和抽象类的区别
5.6 Java 泛型
5.7 泛型通配符和类型参数的范围
6、异常处理
6.1 异常处理基础
6.2 异常类型Java语言中常见的异常类型有哪些
6.3 未被捕获的异常
6.4 try和catch的使用
6.5 多重catch语句的使用
6.6 try语句的嵌套
6.7 throw:异常的抛出
6.8 throws子句
6.9 finally块
6.10 Java的内置异常
6.11 创建自己的异常子类
6.12 断言
7、线程编程
7.1 线程的概念
7.2 Java线程模型
7.3 主线程
7.4 创建线程
7.5 创建多线程
7.6 isAlive()和join()的使用
7.7 线程优先级
7.8 线程同步
7.9 线程间通信
7.10 线程死锁
7.11 线程的挂起、恢复和终止
8、输入输出(IO)操作
8.1 输入输出基本概念
8.2 面向字符的输入流
8.3 面向字符的输出流
8.4 面向字节的输入输出流
8.5 面向字节流的应用
8.6 文件与目录管理
8.7 文件的随机读写
8.8 文件的压缩处理
9、常用类库、向量与哈希
9.1 Java基础类库
9.2 Object类
9.3 Java语言包(java.lang)简介
9.4 日期和时间类
9.5 向量及其应用
9.6 哈希表及其应用
10、图形界面(GUI)设计
10.1 图形界面设计基础
10.2 框架窗口
10.3 标签、按钮和按钮事件
10.4 面板
10.5 布局设计
10.6 文本框和文本区
10.7 文本框和文本区的输入输出
10.8 选择框和单选按钮
10.9 列表和组合框
10.10 菜单
10.11 对话框
10.12 滚动条
10.13 鼠标事件
10.14 键盘事件
11、图形、图像与多媒体
11.1 绘图基础
11.2 设置字型和颜色
11.3 绘图模式
11.4 Graphics类的绘图方法
11.5 Graphics2D类的绘图方法
11.6 图像处理基础
11.7 图像缓冲技术
11.8 多媒体基础
12、网络与数据库编程
12.1 IP地址和InetAddress类
12.2 统一资源定位符
12.3 套接字(Socket)
12.4 数据库连接
12.5 几个重要的类和接口
12.6 数据库查询
12.7 数据库更新
12.8 插入记录
12.9 修改记录
12.10 删除记录